我正在使用 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 配置了以下 SSL 设置并在端口 993 上运行:
/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',
),
);
成功登录后,邮件日志:
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]
而不成功的例子如下邮件日志:
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 [email protected] 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。我能够建立连接,但前提是验证对端被禁用。更改验证对端名称并将路径添加到与邮件服务器关联的 CA 链和链式邮件服务器证书不允许我建立连接verify_peer=true。
我认为这意味着我的 SSL 证书与主机名的匹配存在问题。邮件服务器有两个 DNS 条目指向同一地址,一个指向 hostname.domain.tld,一个指向 mail.domain.tld。这会导致对等验证失败吗?
答案1
不幸的是,没有记录下tls://
和的不同含义。ssl://
$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:'
这将向您显示颁发证书的域。