Php

Roundcube + Dovecot:嘗試登錄時出現 SSL 錯誤

  • May 22, 2015

我正在使用 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,因此通常是埠 143
  • ssl://表示使用 TLS,因此通常是埠 993
  • 這同樣適用於$config['smtp_server']和 埠 25 和 587 tls://,埠 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:'

這將向您顯示域,證書是為其頒發的。

引用自:https://serverfault.com/questions/690200