SSL LetsEncrypt 续订失败 (由于外部多了一个反向代理)

我的 Discourse 实例的证书今天已过期,浏览器中显示错误。我按照以下步骤手动尝试了续期:

系统显示证书已成功续期,我在 /shared/letsencrypt 文件夹中也能看到新证书,续期过程正常。我在 Docker 中重启了 nginx,甚至重新构建了整个实例,但似乎仍然在发送旧的证书。

我通过多个网站检查了该域名,所有结果都显示证书已过期,因此这不是本地问题。

我是否遗漏了什么?

我 15 天前也执行了相同的指令。

cd /var/discourse
./launcher enter app
"/shared/letsencrypt"/acme.sh --cron --home "/shared/letsencrypt" --force
exit

我学到的第一件事是,如果用 Chrome 查看证书,它可能会显示无效,而实际上证书是有效的。请参阅:Chrome / Chromium 错误:SSL 证书显示不正确的(已过期的)日期

随后我尝试了

me@site:/var/discourse$ sudo ./launcher rebuild app

但这没有起作用,最后我执行了

sudo reboot

之后网站就按预期正常工作了。


我注意到其中提到了 rebuild 步骤,但我不确定这是否是必需的,这只是我过程中执行的一个步骤。

尝试了几个小时,就在我发布这条消息后,我意识到由于我使用的是多站点部署,并配有 Nginx 反向代理,因此我还必须重启外层的 Nginx 服务器,之后问题便立刻解决了。我将把此标记为答案,以防有人遇到同样的情况。

我认为最后的 sudo reboot 可能对你有效,因为它重启了 nginx——这正是我上面解决方案中提到的内容。

关于这一点有几点说明:

  • 在所指的情况下,浏览器实际上并不会在地址栏中将其显示为无效
  • 根据操作系统的不同,如果您查看证书日期,它可能不会提出警告

您找到证书未能自动续期的根本原因了吗?

我在网站上注意到,原因是当前未处于生产模式,因此所有邮件都被暂停,包括用于续期证书的邮件。

image

邮件被暂停的原因是,这是数据库恢复流程的一部分;在本例中,数据库是从另一个 Discourse 实例恢复的。

禁用邮件是为了避免两个站点同时发送相同的邮件。

电子邮件在整个过程中唯一涉及的方式是:如果您的证书即将过期且您尚未续订,Let’s Encrypt 可能会向您发送警告。

好的,谢谢。现在我需要找出证书未能自动续期的根本原因。

有什么原因会导致证书无法续期吗?

通常是一些自定义设置意外地破坏了该流程。建议您开一个新帖子,说明您的具体情况以及您已采取的操作。