Roundcube + Dovecot:尝试登录时出现 SSL 错误

Aet*_*ith 4 php ssl imap roundcube

我正在使用 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
Run Code Online (Sandbox Code Playgroud)

/etc/dovecot/dovecot.conf

auth_verbose=yes
auth_debug=yes
auth_debug_passwords=yes
mail_debug=yes
verbose_ssl=yes
auth_verbose_passwords=plain
Run Code Online (Sandbox Code Playgroud)

通过这些设置,我能够从 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',
    ),
);
Run Code Online (Sandbox Code Playgroud)

成功登录在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]
Run Code Online (Sandbox Code Playgroud)

而一个不成功的在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>
Run Code Online (Sandbox Code Playgroud)

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)
Run Code Online (Sandbox Code Playgroud)

看起来 Roundcube 忽略了我的tls://指令并尝试使用 SSLv2/v3 连接到 Dovecot,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。这会导致对等验证失败吗?

seb*_*bix 9

不幸的是,没有记录tls://ssl://in的不同含义$config['default_host']

  • tls:// 表示使用 STARTTLS,因此通常使用端口 143
  • ssl:// 表示使用 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:'
Run Code Online (Sandbox Code Playgroud)

这将向您显示颁发证书的域。