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

我使用Dovecot 2.2.13,Postfix 2.11.3和Roundcube 1.1.1连接到它来build立一个邮件服务器。 Roundcube在nginx / php-fpm的不同服务器上运行。 两台服务器都运行着Debian Jessie的最新更新,可以互相ping通。 来自Roundcube主机的nmap显示端口993打开并可访问。 另外,我似乎得到了正确的端口连接,但我似乎无法成功地将Roundcube连接到达夫科特。

Dovecotconfiguration了以下在端口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托pipe在与Dovecot不同的服务器上,并针对IMAPSconfiguration了以下设置。

 $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中成功的login看起来像这样:

 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> 

Roundcubelogging的错误是:

 <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正在等待一个永远不会到来的服务器问候语。 有什么办法可以configurationRoundcube连接成功吗? 我在configuration设置中错过了一些非常简单的东西吗?

编辑:

在Paul的build议下,我尝试打开端口143,并让Roundcube使用STARTTLS。 我能够得到一个连接,但只有当verify_peer被禁用。 更改verify_peer_name的值, 并将path添加到与mailserver和链接的邮件服务器证书相关联的CA链中,都不允许我通过verify_peer = true获得连接。

我相信这意味着与我的主机名相匹配的SSL证书存在问题。 有两个邮件服务器的DNS条目指向hostname.domain.tld和mail.domain.tld的一个地址。 这可能导致对等validation失败?

不幸的是,在$config['default_host']tls://ssl://的不同含义没有logging。

  • tls://意味着使用STARTTLS,因此通常是143端口
  • ssl://意味着使用TLS,因此通常是端口993

  • 对于$config['smtp_server']和端口25和587对tls://是有效的,对于ssl://端口465。

不能给这个信息的任何来源,因为我(和其他人)经验。


对于verify_peer问题,首先查看提供的证书。 例如使用连接机器的这个命令:

 echo | openssl s_client -connect mail.fizeau.net:143 -starttls imap -showcerts 2>&1 | openssl x509 -noout -text | egrep 'Subject: |DNS:' 

这将显示你的域名,证书颁发。