我正在尝试设置一个依赖于 MySQL 后端的 Dovecot/Postfix 结构。我遇到了 SSL 配置问题,这真是让我头疼不已……
情况
Dovecot 监听端口 993 (IMAP) 和 995 (POP3)。我使用以下命令来测试连接:
openssl s_client -connect myserver.tld:993
openssl s_client -connect myserver.tld:995
发生以下错误:
error:14077410:SSL routines:SSL23_GET_SERVER_HELLO:sslv3 alert handshake failure
我进行了相同的测试,强制执行了ssl2
和ssl3
,tls1
结果相同。现在,当我在端口 465 (Postfix 的 SMTP) 上运行相同的测试时:
openssl s_client -connect myserver.tld:465
我得到了一个神奇的220 myserver.tld ESMTP Postfix (Debian/GNU).
惊喜。基于 MySQL 的身份验证甚至可以工作!问题是 Dovecot 无法正确启动 SSL 连接,而 Postfix 可以。两种服务共享相同的配置,Postfix 甚至使用 Dovecot 身份验证。
配置
Dovecot 配置:
ssl = required
ssl_cert = </etc/ssl/myserver/myserver.tld.crt
ssl_key = </etc/ssl/myserver/myserver.tld.key
ssl_verify_client_cert = no
ssl_protocols = !SSLv2 !SSLv3 !TLSv1
ssl_cipher_list = HIGH:!SSLv2:!SSLv3:!TLSv1.0:!aNULL:!MD5
Postfix 主要配置:
smtpd_tls_cert_file = /etc/ssl/myserver/myserver.tld.crt
smtpd_tls_key_file = /etc/ssl/myserver/myserver.tld.key
smtpd_use_tls = yes
smtpd_tls_auth_only = yes
smtpd_tls_loglevel = 3
smtpd_tls_received_header = no
smtpd_tls_security_level = may
smtpd_tls_session_cache_timeout = 3600s
smtpd_sasl_type = dovecot
smtpd_sasl_path = private/auth
smtpd_sasl_auth_enable = yes
smtpd_recipient_restrictions =
permit_sasl_authenticated,
permit_mynetworks,
reject_unauth_destination
Postfix 主配置:
smtp inet n - - - - smtpd
smtps inet n - - - - smtpd
-o syslog_name=postfix/smtps
-o smtpd_tls_wrappermode=yes
-o smtpd_sasl_auth_enable=yes
SSL 证书是自签名的,我自己生成的。通过 SMTP 传输,一切正常。
日志
pop3-login: Disconnected (no auth attempts in 0 secs): user=<>, rip=xx.xx.xx.xx, lip=xx.xx.xx.xx, TLS handshaking: SSL_accept() failed: error:1408A0C1:SSL routines:SSL3_GET_CLIENT_HELLO:no shared cipher, session=<ffu9UFnxZQBtvqmF>
(当我尝试使用该实用程序的 ssl2 或 tls1 时,出现“未知协议” openssl s_client
)
有人知道我在哪里犯了 Dovecot 的配置错误吗?
答案1
您实际上已经在 dovecot 中禁用了 SSLv2、SSLv3 和 TLSv1.0。
ssl_protocols = !SSLv2 !SSLv3 !TLSv1
ssl_cipher_list = HIGH:!SSLv2:!SSLv3:!TLSv1.0:!aNULL:!MD5
这是一个问题,因为有些客户端还不支持 TLSv1.1/TLSv1.2,这是您唯一剩下的选择。
尝试不要禁用 TLSv1.0,看看是否可以取得进一步进展。