连接到 Dovecot 时的 TLS 库问题

信息安全 tls 证书 电子邮件
2021-08-31 08:01:03

我有一个颁发的 Comodo PositiveSSL 证书,mail.btcontract.com并且我已经设置了 Postfix 和 Dovecot 以通过以下方式使用它:

后缀 main.cf:

smtpd_tls_cert_file  = /etc/ssl/mail/mail_btcontract_com.crt
smtpd_tls_key_file   = /etc/ssl/mail/mail_btcontract_com.key
smtpd_tls_CAfile     = /etc/ssl/mail/AddTrustExternalCARoot.crt
smtp_tls_CAfile      = /etc/ssl/mail/AddTrustExternalCARoot.crt

dovecot.conf:

ssl_cert =< /etc/ssl/mail/mail_btcontract_com.pem
ssl_key  =< /etc/ssl/mail/mail_btcontract_com.key

我已经按照本教程生成pemcrthttp: //blog.wong42.com/2011/05/converting-a-ssl-certificate-from-crt-format-to-pem/

问题是当我尝试从 Thunderbird 邮件客户端连接到我的服务器时,我看到以下错误:

在此处输入图像描述 在此处输入图像描述

同时在/var/log/mail.log我看到这个:

Nov 16 12:15:57 BTContractTest postfix/smtpd[22870]: connect from 51-28-134-95.pool.ukrtel.net[95.134.28.51]
Nov 16 12:15:58 BTContractTest postfix/smtpd[22870]: Anonymous TLS connection established from 51-28-134-95.pool.ukrtel.net[95.134.28.51]: TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)
Nov 16 12:15:58 BTContractTest postfix/smtpd[22870]: warning: TLS library problem: 22870:error:14094418:SSL routines:SSL3_READ_BYTES:tlsv1 alert unknown ca:s3_pkt.c:1258:SSL alert number 48:
Nov 16 12:15:58 BTContractTest postfix/smtpd[22870]: lost connection after STARTTLS from 51-28-134-95.pool.ukrtel.net[95.134.28.51]  

当我尝试时,openssl s_client -connect mail.btcontract.com:143 -starttls imap我第一次看到:

CONNECTED(00000003)
depth=0 OU = Domain Control Validated, OU = PositiveSSL, CN = mail.btcontract.com
verify error:num=20:unable to get local issuer certificate
verify return:1
depth=0 OU = Domain Control Validated, OU = PositiveSSL, CN = mail.btcontract.com
verify error:num=27:certificate not trusted
verify return:1
depth=0 OU = Domain Control Validated, OU = PositiveSSL, CN = mail.btcontract.com
verify error:num=21:unable to verify the first certificate
verify return:1

发生了什么事,我应该怎么做才能解决这一切?
此外,这些是我从证书颁发机构获得的所有文件: 在此处输入图像描述

我不在任何地方使用中间证书,这可能是问题的根源吗?

更新

按照 Thomas Pornin 的建议,我做了以下事情:

cat mail_btcontract_com.crt COMODORSAAddTrustCA.crt COMODORSADomainValidationSecureServerCA.crt > full.crt  

然后在 Postfix main.cf 中:

smtpd_tls_cert_file  = /etc/ssl/mail/full.crt
smtpd_tls_key_file   = /etc/ssl/mail/mail_btcontract_com.key
smtpd_tls_CAfile     = /etc/ssl/mail/AddTrustExternalCARoot.crt
smtp_tls_CAfile      = /etc/ssl/mail/AddTrustExternalCARoot.crt

dovecot.conf:

ssl_cert =< /etc/ssl/mail/full.crt

现在我得到了一个不同的错误:

Nov 16 13:28:09 BTContractTest postfix/smtpd[23921]: warning: cannot get RSA private key from file /etc/ssl/mail/mail_btcontract_com.key: disabling TLS support 
Nov 16 13:28:09 BTContractTest postfix/smtpd[23921]: warning: TLS library problem: 23921:error:0B080074:x509 certificate routines:X509_check_private_key:key values mismatch:x509_cmp.c:330:  

我尝试过切换连接证书的位置,还尝试像这样包含根 ca:

cat AddTrustExternalCARoot.crt mail_btcontract_com.crt COMODORSAAddTrustCA.crt COMODORSADomainValidationSecureServerCA.crt > full.crt  

但到目前为止还没有运气。

3个回答

我在 Ubuntu 上遇到了与 Postfix 和 Dovecot 非常相似的问题。我已经从 Comodo 购买了基本的 SSL 证书,因为我选择了“其他”作为服务器类型,所以我最终得到了一个包含四个证书文件的 zip 文件,根据上述帖子。

我没有在客户端中遇到安全异常。就我而言,尽管在 Thunderbird 中选择了正确的端口,但我什至无法通过 Thunderbird 中的帐户设置和服务器检测。在服务器的系统日志中,我收到关于未知 CA 的 SSL 连接中止错误,就像上面提到的那样。

我通过使用文本编辑器将所有四个证书连接到一个文件中成功解决了这个问题,从顶部的我自己的证书开始,然后是两个中间证书,最后是底部的 CA 证书。然后我将 Postfix 和 Dovecot 的配置指向这个组合文件,Thunderbird 能够连接并且我可以发送/接收电子邮件。

验证您的密钥是否不受密码保护。无论如何,Postfix 不支持受密码保护的密钥,您可以使用 openssl 命令从密钥中删除密码

openssl rsa -in passphrase.key -out nopassphrase.key

如果您的 CA Bundle 不包含您的 CA 根,则无需包含根 CA,您可以附加它:

cat /etc/ssl/mail/AddTrustExternalCARoot.crt >> /etc/ssl/certs/ca-bundle.crt

然后改变这一行:

smtpd_tls_CAfile = /etc/ssl/mail/AddTrustExternalCARoot.crt

对于这个

smtpd_tls_CAfile = /etc/ssl/certs/ca-bundle.crt

在 SSL/TLS 中,服务器不仅要发送它的证书,还要发送从根到服务器证书的完整链(根本身可以省略,但应该发送中间 CA)。如果服务器没有发送完整的链,则由客户端尝试完成它,例如通过下载丢失的证书,但 SSL/TLS 客户端在这方面做任何努力不是强制性的。客户可能会立即拒绝不完整的链。

smtpd_tls_cert_file选项应指向包含链的文件,即 PEM 格式的所有证书,以链顺序连接(从服务器的证书开始)。请参阅文档PEM 格式是证书以 Base64 编码的格式,带有显式-----BEGIN CERTIFICATE-----标头。如果您有二进制格式的证书,则可以使用以下方法将其转换为 PEM:

openssl x509 -inform DER -in cert.crt -out cert.pem

首先使用文本编辑器(或简单more命令)打开您必须查看的证书是二进制文件还是 PEM 文件。然后将 PEM 证书连接到单个文本文件中,如 Postfix 文档所述。