为 Let's Encrypt(Certbot)续订设置 cron 作业的最佳实践?

为 Let's Encrypt(Certbot)续订设置 cron 作业的最佳实践?

这是正确的设置方法吗计划任务在 Apache2 中更新 Let's Encrypt 证书?我使用 Ubuntu 16.04。

@monthly letsencrypt renew && service apache2 reload

答案1

每月一次的频率不够。

此脚本应至少每周运行一次,最好每天运行一次。请记住,除非证书即将到期,否则不会进行续订,每月运行一次可能会导致您现有的证书在续订之前就已经过期。

该程序的名称为certbot,由 更名而来letsencrypt。如果您仍在使用letsencrypt,则需要更新至当前版本。

除了这些问题之外,它与我的 cron 作业大致相同。

43 6 * * * certbot renew --post-hook "systemctl reload nginx"

注意:在 18.04 LTS 中,该letsencrypt软件包已(最终)重命名为certbot。它现在包含一个systemd计时器,您可以启用它来安排certbot续订,使用systemctl enable certbot.timersystemctl start certbot.timer。但是,Ubuntu 没有提供指定钩子的方法。您需要设置一个覆盖,以使用您想要的命令行certbot.service进行覆盖,直到 Canonical 修复此问题。ExecStart=

答案2

我最近(2017 年 10 月)在 Ubuntu 16.04 服务器上安装并运行了 certbot,并且在 中自动创建了一个续订 cron 作业/etc/cron.d/certbot

这是创建的 cron 作业:

0 */12 * * * root test -x /usr/bin/certbot -a \! -d /run/systemd/system && perl -e 'sleep int(rand(3600))' && certbot -q renew

在创建 crontab 条目之前检查该文件是否已经存在是一个好主意。

答案3

certbot 文档建议每天运行两次脚本:

笔记:

如果您正在设置 cron 或 systemd 作业,我们建议每天运行两次(在您的证书到期续订或撤销之前它不会执行任何操作,但定期运行它将使您的网站有机会保持在线,以防由于某种原因发生 Let's Encrypt 发起的撤销)。请为您的续订任务选择一个小时中的随机分钟。

正如 Michael Hampton 提到的,名称已更改为 certbot,但它们仍提供 -auto 选项以保持自身更新。该certbot-auto命令需要 root 权限才能运行,因此 cron 脚本中的行应如下所示:

52 0,12 * * * root /full/path/to/certbot-auto renew --quiet

在我的情况下,certbot-auto脚本被放置在 git-user 的主目录中。确切的命令是

52 0,12 * * * root /home/git/certbot-auto renew --quiet

请注意,文档中的示例对应于相对路径,如点所示,这可能会造成混淆:

./path/to/certbot-auto renew --quiet

请务必事先在 shell 中测试运行更新命令以测试路径,如果证书无需更新则不会发生任何事情(在没有标志的情况下运行此测试--quiet以查看发生的情况)。

以这种方式更新证书时,无需严格重新加载服务器,因为如果设置正确,有效证书的路径就不会改变。

如果您正在运行 apache,则情况确实如此 - 对于 nginx,请考虑添加更新钩子,例如:

52 0,12 * * * root certbot renew --renew-hook 'service nginx reload'

在docker环境中 (编辑 2020-09-18)

据我所知,上述内容仍然正确,但如果你的应用程序在 docker 环境中运行,你可以让此代理网络管理好您的所有证书 - 无论是在本地还是在实时环境中。我与该项目没有任何关系,但我已经愉快地使用了几年,并且从那以后再也没有碰过 cron(用于此任务)或 certbot-scripts。

它还有一个额外的好处,就是自动强制流量通过端口 443(如果您启用它),这样您就不必摆弄 apache 或 nginx 配置 - 为 Web 应用程序提供服务的容器只需要服务端口 80,代理会处理剩下的事情。

答案4

其他成员已经提供了更多详细的答案。但看来我应该在这里提一下。

从 certbot 版本 0.21.1 开始,--renew-hook标志已更改为--deploy-hook 确保您没有使用已弃用的标志。

certbot renew --deploy-hook "systemctl restart myservice"

相关内容