这是在 Apache2 中设置cron以更新 Let's Encrypt 证书的正确方法吗?我使用 Ubuntu 16.04。
@monthly letsencrypt renew && service apache2 reload
这是在 Apache2 中设置cron以更新 Let's Encrypt 证书的正确方法吗?我使用 Ubuntu 16.04。
@monthly letsencrypt renew && service apache2 reload
每月的频率不够。
该脚本应至少每周运行一次,最好每天运行一次。请记住,除非证书即将到期,否则证书不会续订,并且每月可能会导致您现有的证书偶尔在续订之前就已经过期。
该程序的名称是
certbot
,它是从 重命名的letsencrypt
。如果您仍在使用letsencrypt
,则需要更新到当前版本。除了这些问题,它和我的 cron 工作差不多。
注意:在 18.04 LTS 中,
letsencrypt
包已(最终)重命名为certbot
. 它现在包括一个systemd
计时器,您可以使用和来安排certbot
续订。但是,Ubuntu 没有提供指定挂钩的方法。在 Canonical 修复此问题之前,您需要设置一个覆盖以使用所需的命令行覆盖。systemctl enable certbot.timer
systemctl start certbot.timer
certbot.service
ExecStart=
我最近(2017 年 10 月)在 Ubuntu 16.04 服务器上安装并运行了 certbot,并在
/etc/cron.d/certbot
.这是创建的 cron 作业:
在创建 crontab 条目之前检查该文件是否已经存在是个好主意。
certbot文档建议每天运行两次脚本:
正如 Michael Hampton 提到的,名称已更改为 certbot,但他们仍然提供 -auto 选项以保持自身更新。该
certbot-auto
命令需要 root 权限才能运行,因此 cron 脚本中的行应如下所示:在我自己的情况下,
certbot-auto
脚本放置在 git-user 的主目录中。确切的命令是请注意,文档中的示例对应于相对路径,如点所示,可能会造成混淆:
./path/to/certbot-auto renew --quiet
请务必事先在 shell 中测试运行 renew 命令以测试路径,如果证书未到期更新,则不会发生任何事情(在没有
--quiet
标志的情况下运行此测试以查看发生了什么)。以这种方式更新证书时,不必重新加载服务器,因为如果设置正确,活动证书的路径不会改变。
如果您正在运行 apache,这是正确的 - 对于 nginx,请考虑添加一个更新挂钩,例如:
在 docker 环境中(编辑 2020-09-18)
尽管据我所知,上述内容仍然正确,但如果您的应用程序在 docker 环境中运行,您可以让这个代理网络处理您的所有证书——无论是在本地还是在实时环境中。我不隶属于该项目,但几年来我一直在愉快地使用它,并且从那时起就没有接触过 cron(用于此任务)或 certbot-scripts。
它具有自动强制通过端口 443 的流量(如果启用它)的额外好处,因此您不必摆弄 apache 或 nginx 配置 - 服务于 Web 应用程序的容器只需要服务端口 80 并且代理负责其余的部分。
你不应该设置任何东西。任何最近的 Debian/Ubuntu 安装的 certbot 都应该安装一个 systemd 计时器和一个 cron 作业(并且 cron 作业只有在 systemd 不活动时才会运行
certbot
,所以你不会同时运行)。系统定时器
您可以使用命令检查您的 systemd 计时器
systemctl list-timers
(或者systemctl list-timers --all
如果您还想显示非活动计时器)。像这样的东西:certbot 计时器应该在这里
/lib/systemd/system/certbot.timer
,它将执行中指定的命令/lib/systemd/system/certbot.service
certbot.timer
在长达 12 小时(43200 秒)的随机延迟后,将在上午 12 点和下午 12 点执行`certbot.service。并将
certbot.service
执行更新命令。定时任务
正如其他人所提到的,还有一个 cron 作业安装在
/etc/cron.d/certbot
:这是在做:
test -x /usr/bin/certbot -a \! -d /run/systemd/system
- 检查是否是/usr/bin/certbot
可执行文件并且/run/systemd/system
不是目录。如果此检查成功,则仅继续下一位。perl -e 'sleep int(rand(43200))'
- 在 0 秒到 12 小时之间随机睡眠(43200 = 12 x 60 x 60)。certbot -q renew
检查您的证书并在需要时更新任何证书。该-q
标志是“安静的”——除非出现错误,否则不产生任何输出。我最初对 cron 作业感到困惑,因为它由于 systemd 而无法运行,那么 certbot 将如何运行?我在这个论坛帖子中找到了答案,这是我这个答案的依据。
其他成员已经提供了更详细的答案。但看起来我应该在这里提到它。
从 certbot 版本 0.21.1 开始,
--renew-hook
标志更改为--deploy-hook
确保您没有使用不推荐使用的标志。对于 LetsEncrypt 证书更新,我通常使用getssl。它是一个非常方便的 shell 包装器,甚至可以通过 SSH 连接在其他机器上安装证书。
cron 条目如下:
01 23 * * * root /root/scripts/getssl/getssl -u -a -q >>/var/log/getssl.log 2>&1 ; /usr/sbin/apache2ctl graceful
正如已经建议的那样,您应该每天运行它,或者更好的是,每天运行两次。
正如 glaux 已经提到的:
来源:https ://certbot.eff.org/all-instructions/#debian-8-jessie-apache
所以我最终使用了这个(每天运行两次,每天 01:00 和 13:00):
甚至更好:
我没有测试,但这也应该有效:
来源:https ://certbot.eff.org/docs/using.html
由于 certbot 的首选安装方法被修改为
snap
,计时器的路径现在是/etc/systemd/system/snap.certbot.renew.timer
.您也可以通过运行检查配置
systemctl show certbot.timer
这就是我使用的:
输出为:
并且它说apache已经重新启动,所以不需要再做一次。如果我再次运行它:
因此每天更新证书不是问题,我的 cron 是:
我使用脚本将日志记录调整到单独的文件,所以这是我的 cronautorenew.sh:
如果您的 Certbot 证书是使用
standalone
插件获得的,那么您可能需要停止 Web 服务器才能使续订成功。这可以使用--pre-hook
和--post-hook
运算符在 cron 中完成:Certbot 文档。