我已经运行 Postfix/Dovecot 邮件服务器一段时间了(Ubuntu 服务器 16.04),没有出现任何重大问题。我还有一个颁发给我的主机名的 Let's Encrypt 证书,我在 中设置了该证书/etc/dovecot/conf.d/10-ssl.conf
。运行正常,但您可能知道,这些证书的有效期只有 90 天。我已设置 certbot 来自动更新这些证书,它也运行正常。
今天突然,我的 Thunderbird、客户的 Thunderbird 和他的 iPhone 都开始抱怨证书无效。我仔细检查了证书,certbot certificates
发现我使用的证书完全有效,没有过期。通过 Thunderbird 检查证书告诉我证书前一天已经过期,并显示与当前证书不匹配的哈希值。
因此,基本上,Dovecot 似乎正在从某种“缓存”中颁发过期证书。重新启动 dovecot 只是“神奇地”解决了这个问题,但我想了解这里发生了什么,因为我在 Dovecot 中对证书缓存或类似内容的 DDG 搜索没有得到任何结果。我是否忽略了一些显而易见的东西?似乎我忽略了一些显而易见的东西,但无法弄清楚是什么。
编辑 这基本上是答案这里但由于我的 certbot 是在 systemctl 计时器而不是 cronjob 上更新的,因此我将尝试在此提供针对该情况的答案,以供将来参考,并供与我处于同样境地的任何人参考。
答案1
这基本上和回答的问题是一样的这里作者:Gerald Schneider。但是,由于我的设置不依赖于 cronjob,而是依赖于系统计时器,所以答案略有不同。
至少在 Ubuntu 上,Let's Encrypt 允许您在自动更新通过计时器运行时创建一个钩子(检查使用情况systemctl list-timers
并查看它是否存在)。
基本上有两个事件可以挂钩:部署和发布。将您的 bash 脚本分别放在/etc/letsencrypt/renewal-hooks/deploy
或/etc/letsencrypt/renewal-hooks/post
文件夹中。部署将在每个证书续订时单独运行,发布将在所有续订完成后运行。
部署脚本确实可以访问 $RENEWED_DOMAINS 和 $RENEWED_LINEAGE 变量。我将以下脚本放在etc/letsencrypt/renewal-hooks/deploy
:
1 #!/bin/bash
2 for domain in $RENEWED_DOMAINS
3 do
4 if [ "$domain" = my.mailserver.com ]
5 then
6 doveadm reload >/dev/null
7 fi
8 done
每次重新部署“my.mailserver.com”的证书(显然要用真实域名替换它)时,都会重新加载 dovecot conf。希望这对正在寻找此内容的任何人有所帮助。