这是正确的设置方法吗计划任务在 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.timer
和systemctl 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"