dovecot imap ssl 证书问题

dovecot imap ssl 证书问题

我一直尝试在 ubuntu 上使用新的 ssl 证书配置我的 dovecot imap 服务器(版本 1.0.10 - 目前无法升级),如下所示:

$ grep ^ssl /etc/dovecot/dovecot.conf
ssl_disable = no
ssl_cert_file = /etc/ssl/certs/mydomain.com.crt.20120904
ssl_key_file = /etc/ssl/private/mydomain.com.key.20120904
$ /etc/init.t/dovecot stop
$ sudo dovecot -p
$ [i enter the ssl password here]

它没有显示任何错误,当我运行时ps aux | grep dovecot我得到

root     21368  0.0  0.0  12452   688 ?        Ss   15:19   0:00 dovecot -p
root     21369  0.0  0.0  71772  2940 ?        S    15:19   0:00 dovecot-auth
dovecot  21370  0.0  0.0  14140  1904 ?        S    15:19   0:00 pop3-login
dovecot  21371  0.0  0.0  14140  1900 ?        S    15:19   0:00 pop3-login
dovecot  21372  0.0  0.0  14140  1904 ?        S    15:19   0:00 pop3-login
dovecot  21381  0.0  0.0  14280  2140 ?        S    15:19   0:00 imap-login
dovecot  21497  0.0  0.0  14280  2116 ?        S    15:29   0:00 imap-login
dovecot  21791  0.0  0.0  14148  1908 ?        S    15:48   0:00 imap-login
dovecot  21835  0.0  0.0  14148  1908 ?        S    15:53   0:00 imap-login
dovecot  21931  0.0  0.0  14148  1904 ?        S    16:00   0:00 imap-login
me       21953  0.0  0.0   5168   944 pts/0    S+   16:02   0:00 grep --color=auto dovecot

看起来一切运行正常。然后我测试是否可以通过 telnet 连接到 dovecot 服务器,结果一切正常:

$ telnet localhost 143
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
* OK Dovecot ready.

但是当我测试 dovecot 是否正确配置了 SSL 证书时,它似乎失败了:

$ sudo openssl s_client -connect localhost:143 -starttls imap
CONNECTED(00000003)
depth=0 /description=xxxxxxxxxxxxxxxxx/C=AU/ST=xxxxxxxx/L=xxxx/O=xxxxxx/CN=*.mydomain.com/[email protected]
verify error:num=20:unable to get local issuer certificate
verify return:1
depth=0 /description=xxxxxxxxxxx/C=AU/ST=xxxxxx/L=xxxx/O=xxxx/CN=*.mydomain.com/[email protected]
verify error:num=27:certificate not trusted
verify return:1
depth=0 /description=xxxxxxxx/C=AU/ST=xxxxxxxxxx/L=xxxx/O=xxxxx/CN=*.mydomain.com/[email protected]
verify error:num=21:unable to verify the first certificate
verify return:1
---
Certificate chain
 0 s:/description=xxxxxxxxxxxx/C=AU/ST=xxxxxxxxxx/L=xxxxxxxx/O=xxxxxxx/CN=*.mydomain.com/[email protected]
   i:/C=IL/O=StartCom Ltd./OU=Secure Digital Certificate Signing/CN=StartCom Class 2 Primary Intermediate Server CA
---
Server certificate
-----BEGIN CERTIFICATE-----
xxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxx
.
.
.
xxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxx==
-----END CERTIFICATE-----
subject=/description=xxxxxxxxxx/C=AU/ST=xxxxxxxxx/L=xxxxxxx/O=xxxxxx/CN=*.mydomain.com/[email protected]
issuer=/C=IL/O=StartCom Ltd./OU=Secure Digital Certificate Signing/CN=StartCom Class 2 Primary Intermediate Server CA
---
No client certificate CA names sent
---
SSL handshake has read 2831 bytes and written 342 bytes
---
New, TLSv1/SSLv3, Cipher is DHE-RSA-AES256-SHA
Server public key is 2048 bit
Compression: NONE
Expansion: NONE
SSL-Session:
    Protocol  : TLSv1
    Cipher    : DHE-RSA-AES256-SHA
    Session-ID: xxxxxxxxxxxxxxxxxxxx
    Session-ID-ctx: 
    Master-Key: xxxxxxxxxxxxxxxxxx
    Key-Arg   : None
    Start Time: 1351661960
    Timeout   : 300 (sec)
    Verify return code: 21 (unable to verify the first certificate)
---
. OK Capability completed.

至少,我认为这是一次失败???

答案1

问题出在 openssl 上,而不是 dovecot 上。

一个错误在 openssl 中,它会停止寻找默认的 CApath,因此您需要通过在命令行中添加来告诉它在哪里找到根 CA 证书列表-CApath。例如:

sudo openssl s_client -connect localhost:143 -starttls imap -CApath /dev/null 

如果你尚未填充证书文件夹,并且你熟悉计算机,请按照本教程从 Mozilla 下载 certdata.txt 并生成必要的 PEM 文件和符号链接。如果您无权访问 /bin,则可能需要修改脚本,并且需要创建符号链接 ln -s ca-bundle.crt cert.pem。

(指定 /dev/null 会强制 openssl 使用您的 openssl 目录中 cert.pem 的默认路径。要找出您的 openssl 目录在哪里,请键入openssl version -d)。

由于您使用的是 StartSSL,您可能需要将您的证书和他们的 dovecot 中间证书连接起来,在您的例子中是 StartCom Class 2 Primary Intermediate Server CA。他们的免费证书使用 StartCom Class 1 Primary Intermediate Server CA

答案2

您可以verbose_ssl = yes在 dovecot 配置中使用来生成额外的日志输出。

在我的配置(dovecot 2.0)中,我使用以下语句:

 ssl_cert = </etc/ssl/certs/mydomain.com.crt.20120904
 ssl_key = </etc/ssl/private/mydomain.com.key.20120904

答案3

老问题 - 新问题(这次是 Letsencrypt 证书):
验证返回代码:21(无法验证第一个证书)
(意味着未找到/使用中级证书(链)进行验证)

这是我在过去 24 小时内经过反复试验找到的解决方案。

首先让我介绍一下我用于测试的内容:
我在另一台电子邮件服务器(Ubuntu 18.xx)上安装了 Dovecot,除了使用的域/证书外,它的 Dovecot 设置相同local.conf。两者都使用 Letsencrypt 证书,并且都是昨天更新的。

Ubuntu 18 上的 Dovecot(版本 2.2.33.2)运行正常。
使用时没有错误代码openssl s_client测试电子邮件端口:993/IMAP 或:995/POP。

但是,在另一台机器(显示错误的机器)上我使用:

操作系统:Ubuntu 20.04.2
Dovecot(Ubuntu 默认/repo 版本):2.3.7.2 (3c910f64b)
OpenSSL(Ubuntu 默认/repo 版本):1.1.1f 31 Mar 2020

在一位客户抱怨在 Android 手机(Google/Gmail 默认电子邮件应用程序)上添加电子邮件帐户后,我注意到了这个错误:

“证书不可信。”

如果我使用 Web 或 smtp 证书,openssl 测试可以正常工作并通过验证。
这让我相信问题出在 Ubuntu 20 上的 Dovecot 上。

Thunderbird 和 Outlook 等其他电子邮件客户端也运行良好。

我立即决定用“openssl s_client”进行测试,错误最终将我带到了这里。

我的配置在损坏和正常运行的 Dovecot 机器上看起来都是这样的:

 ssl_ca = </etc/letsencrypt/live/{CertName}/fullchain.pem
 ssl_cert = </etc/letsencrypt/live/{CertName}/cert.pem
 ssl_key  = </etc/letsencrypt/live/{CertName}/privkey.pem

我还不确定是什么软件导致了错误,但我已经清除了错误。Android 手机现在完全信任该证书。我知道错误可能是由于缺乏对证书链/CA 的验证造成的。

解决方案/TL;DR:

使用全链文件作为您的证书条目(ssl_cert =)。它包含您的 LE 证书和证书链。

您的 Dovecot SSL 配置应如下所示(显然,将 {CertName} 替换为您自己的):

 ssl_ca = </etc/letsencrypt/live/{CertName}/chain.pem  (or 'fullchain' should work)
 ssl_cert = </etc/letsencrypt/live/{CertName}/fullchain.pem
 ssl_key  = </etc/letsencrypt/live/{CertName}/privkey.pem

在测试期间你应该不会再看到这个错误:

 Verify return code: 0 (ok)

我不需要在没有显示错误的机器上(Ubuntu 18)做任何改变 - 所以我没有这么做。

更新:
当前与 Ubuntu 20 存储库/apt 一起使用的 Dovecot 受到影响。
错误参考:https://dovecot.org/pipermail/dovecot/2021-April/121884.html

相关内容