Roundcube + Dovecot:嘗試登錄時出現 SSL 錯誤
我正在使用 Dovecot 2.2.13、Postfix 2.11.3 和 Roundcube 1.1.1 連接到它來設置郵件伺服器。Roundcube 在 nginx/php-fpm 的不同伺服器上執行。兩台伺服器都執行帶有最新更新的 Debian Jessie,並且可以互相 ping 通。Roundcube 主機的 nmap 顯示埠 993 已打開且可訪問。此外,我似乎在正確的埠上建立了連接,但我似乎無法讓 Roundcube 成功連接到 Dovecot。
Dovecot 配置了以下在埠 993 上執行的 SSL 設置:
/etc/dovecot/conf.d/10-ssl.conf
ssl_protocols = TLSv1.2 TLSv1.1 TLSv1 !SSLv2 !SSLv3 ssl_cipher_list = ECDH+AESGCM:DH+AESGCM:ECDH+AES256:DH+AES256:ECDH+AES128:DH+AES128:DH+AES:ECDH+3DES:RSA+AESGCM:RSA+AES:RSA+3DES:!aNULL:!MD5
/etc/dovecot/dovecot.conf
auth_verbose=yes auth_debug=yes auth_debug_passwords=yes mail_debug=yes verbose_ssl=yes auth_verbose_passwords=plain
通過這些設置,我能夠從 Android 郵件應用程序獲得 TLS 連接並接收郵件,因此我知道 Dovecot 正在傾聽並能夠進行通信。Roundcube 託管在與 Dovecot 不同的伺服器上,並使用以下有關 IMAPS 的設置進行配置。
$config['default_host'] = 'tls://mail.domain.tld'; $config['imap_conn_options'] => array( 'ssl' => array( 'ciphers' => 'ECDH+AESGCM:DH+AESGCM:ECDH+AES256:DH+AES256:ECDH+AES128:DH+AES128:DH+AES:ECDH+3DES:RSA+AESGCM:RSA+AES:RSA+3DES:!aNULL:!MD5', ), );
成功登錄在mail.log中如下所示:
dovecot: imap-login: Debug: SSL: elliptic curve secp384r1 will be used for ECDH and ECDHE key exchanges dovecot: imap-login: Debug: SSL: elliptic curve secp384r1 will be used for ECDH and ECDHE key exchanges dovecot: imap-login: Debug: SSL: where=0x10, ret=1: before/accept initialization [zzz.zzz.zzz.zzz] dovecot: imap-login: Debug: SSL: where=0x2001, ret=1: before/accept initialization [zzz.zzz.zzz.zzz] dovecot: imap-login: Debug: SSL: where=0x2001, ret=1: unknown state [zzz.zzz.zzz.zzz] dovecot: imap-login: Debug: SSL: where=0x2001, ret=1: unknown state [zzz.zzz.zzz.zzz] dovecot: imap-login: Debug: SSL: where=0x2001, ret=1: unknown state [zzz.zzz.zzz.zzz] dovecot: imap-login: Debug: SSL: where=0x2001, ret=1: unknown state [zzz.zzz.zzz.zzz] dovecot: imap-login: Debug: SSL: where=0x2001, ret=1: unknown state [zzz.zzz.zzz.zzz] dovecot: imap-login: Debug: SSL: where=0x2001, ret=1: unknown state [zzz.zzz.zzz.zzz] dovecot: imap-login: Debug: SSL: where=0x2002, ret=-1: unknown state [zzz.zzz.zzz.zzz] dovecot: imap-login: Debug: SSL: where=0x2002, ret=-1: unknown state [zzz.zzz.zzz.zzz] dovecot: auth: Debug: Loading modules from directory: /usr/lib/dovecot/modules/auth dovecot: auth: Debug: Read auth token secret from /var/run/dovecot/auth-token-secret.dat dovecot: auth: Debug: auth client connected (pid=5986) dovecot: imap-login: Debug: SSL: where=0x2001, ret=1: unknown state [zzz.zzz.zzz.zzz] dovecot: imap-login: Debug: SSL: where=0x2001, ret=1: unknown state [zzz.zzz.zzz.zzz] dovecot: imap-login: Debug: SSL: where=0x2001, ret=1: unknown state [zzz.zzz.zzz.zzz] dovecot: imap-login: Debug: SSL: where=0x20, ret=1: SSL negotiation finished successfully [zzz.zzz.zzz.zzz] dovecot: imap-login: Debug: SSL: where=0x2002, ret=1: SSL negotiation finished successfully [zzz.zzz.zzz.zzz]
而一個不成功的在mail.log中看起來像這樣:
dovecot: imap-login: Debug: SSL: elliptic curve secp384r1 will be used for ECDH and ECDHE key exchanges dovecot: imap-login: Debug: SSL: elliptic curve secp384r1 will be used for ECDH and ECDHE key exchanges dovecot: auth: Debug: auth client connected (pid=5993) dovecot: imap-login: Debug: SSL: where=0x10, ret=1: before/accept initialization [xxx.xxx.xxx.xxx] dovecot: imap-login: Debug: SSL: where=0x2001, ret=1: before/accept initialization [xxx.xxx.xxx.xxx] dovecot: imap-login: Debug: SSL: where=0x202, ret=-1: SSLv2/v3 read client hello A [xxx.xxx.xxx.xxx] dovecot: imap-login: Disconnected (no auth attempts in 60 secs): user=<> rip=xxx.xxx.xxx.xxx, lip=yyy.yyy.yyy.yyy, TLS handshaking: Disconnected, session=<xxxxxxxxxxxxxx>
Roundcube 記錄的錯誤是:
<sj148mqa> IMAP Error: Login failed for firstname.lastname@domain.tld from xxx.xxx.xxx.xxx. Empty startup greeting (mail.domain.tld:993) in /var/www/roundcube/program/lib/Roundcube/rcube_imap.php on line 198 (POST /roundcube/?_task=login?_task=login&_action=login)
看起來 Roundcube 忽略了我的*tls://*指令並嘗試使用 Dovecot 設置為忽略的 SSLv2/v3 連接到 Dovecot。因此,當 Dovecot 等待 Roundcube 開始 TLS 握手時,Roundcube 正在等待一個永遠不會到來的伺服器問候。有什麼方法可以配置 Roundcube 連接成功嗎?我在配置設置中錯過了一些非常簡單的事情嗎?
編輯:
在 Paul 的建議下,我嘗試打開埠 143 並允許 Roundcube 使用 STARTTLS。我能夠建立連接,但前提是verify_peer被禁用。更改verify_peer_name的值並添加與郵件伺服器關聯的 CA 鍊和鍊式郵件伺服器證書的路徑不允許我獲得與verify_peer=true的連接。
我相信這意味著我的 SSL 證書與我的主機名匹配存在問題。郵件伺服器有兩個 DNS 條目指向相同的地址,一個用於 hostname.domain.tld,一個用於 mail.domain.tld。這會導致對等驗證失敗嗎?
不幸的是,沒有記錄
tls://
和ssl://
in的不同含義。$config['default_host']
tls://
表示使用 STARTTLS,因此通常是埠 143ssl://
表示使用 TLS,因此通常是埠 993- 這同樣適用於
$config['smtp_server']
和 埠 25 和 587tls://
,埠 465 用於ssl://
。無法提供此資訊的任何來源,因為我(和其他一些人)憑經驗得到了它。
對於這個
verify_peer
問題,首先查看提供的證書。例如,從連接機器使用此命令:echo | openssl s_client -connect mail.fizeau.net:143 -starttls imap -showcerts 2>&1 | openssl x509 -noout -text | egrep 'Subject: |DNS:'
這將向您顯示域,證書是為其頒發的。