如何在 Ubuntu 20.04 上自动更新 certbot 证书

Tim*_*Tim 5 linux certbot

我在 AWS 中的 Ubuntu 20.04 上运行 certbot,作为快照包安装。我不确定 certbot 续订是否正常运行。我希望得到一些帮助来确定如何最好地使其发挥作用。

这是一台新服务器,我在准备生产时打开和关闭它。目前每天运行约8-10小时。它并不经常在午夜运行,我认为这是 cron 作业运行的时间。一旦我完成配置,几天后就会24/7。

我发现的一件事是这个问题的答案

您不必设置任何东西。任何最近安装的 certbot 的 Debian/Ubuntu 都应该安装一个 systemd 计时器和一个 cron 作业(并且 cron 作业只会在 systemd 未激活时运行 certbot,因此您不会同时运行两者)。

在我看来,certbot 计时器没有运行,如果运行了,它似乎指向 /dev/null。因为 systemd 处于活动状态,所以我想知道 cron 作业是否正在运行。

定时器和系统

我发现一条评论可能存在计时器和快照问题,所以也许这是一个已知问题。

systemctl 列表定时器

计时器似乎没有运行

NEXT                        LEFT          LAST                        PASSED       UNIT                         ACTIVATES
Wed 2021-03-17 23:44:00 UTC 3h 24min left n/a                         n/a          snap.certbot.renew.timer     snap.certbot.renew.service
Run Code Online (Sandbox Code Playgroud)

Certbot 计时器似乎指向 /dev/null。这个问题表明事情不应该如此。

> root@aws2:/etc/systemd/system# ls -l | grep certbot
lrwxrwxrwx 1 root root    9 Jan  9 06:38 certbot.timer -> /dev/null
Run Code Online (Sandbox Code Playgroud)

我可以在系统日志中看到以下内容,但我不确定这意味着什么

Mar 17 16:51:02 aws2 systemd[1]: Started Timer renew for snap application certbot.renew.
Run Code Online (Sandbox Code Playgroud)

克朗

在 syslog 中,我可以看到 cron 作业正在运行,但没有输出

Mar 16 00:00:01 aws2 CRON[2072]: (root) CMD (test -x /usr/bin/certbot -a \! -d /run/systemd/system && perl -e 'sleep int(rand(43200))' && certbot -q renew)
Run Code Online (Sandbox Code Playgroud)

以下内容位于 /etc/cron.d/certbot 中(这可能是由 certbot 安装放在那里的,我大致了解它的作用,但我不知道 test / perl 的东西是做什么的)

SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin

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

当我运行整个命令(root test /x 等)时,我收到以下消息。

Command 'root' not found, but can be installed with: snap install root-framework
Run Code Online (Sandbox Code Playgroud)

当我运行这部分时,我没有得到任何输出(请注意,我已从 certbot 中删除了“-q”以进行测试)。我不确定测试部分在做什么,但当我运行此命令时 certbot 似乎没有执行任何操作。

> test -x /usr/bin/certbot -a \! -d /run/systemd/system && perl -e 'sleep int(rand(43200))' && certbot renew
Run Code Online (Sandbox Code Playgroud)

关键问题

  1. 你知道 systemd 计时器发生了什么吗?为什么它指向 /dev/null?或者我应该忽略这个已知问题?
  2. 我应该像 Ubuntu 建议的那样“快速安装 root-framework”来安装“root”吗?
  3. cron 作业“root test”似乎没有做任何事情...任何人都解释一下那里正在测试什么以及“cerbot renew”是否实际上正在运行?

更新 - 建议的解决方案(再次更新)

请注意,这不是必需的。systemd 计时器开始正常工作。

在 /etc/cron.daily 文件夹中,我创建了以下文件夹。我认为它会做我想要的,我会在某个时候检查日志来查看。我对上面提出的问题仍然很感兴趣。

SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
/usr/bin/certbot -q renew
Run Code Online (Sandbox Code Playgroud)

ale*_*xjs 7

由于您使用的是 snap,因此值得仔细检查是否有第二个计时器(除了 certbot-renew),它是由 snap 实现的,并且确实正确地进行了更新。

在这里你可以看到我有两个掩码来确保正常的 certbot.timer 被禁用,但我也有一个通过 snap 安装的计时器:

root@pi:/etc/systemd/system # ls -l *certbot*
lrwxrwxrwx 1 root root   9 Oct  6 10:42  certbot.timer -> /dev/null
-rw-r--r-- 1 root root 293 Oct  6 05:26  snap.certbot.renew.timer
Run Code Online (Sandbox Code Playgroud)

我可以看到它每天运行两次并且当前正在等待:

root@pi:/etc/systemd/system # systemctl list-units | grep certbot.renew
snap.certbot.renew.timer    loaded active waiting   Timer renew for snap application certbot.renew

root@pi:/etc/systemd/system # cat snap.certbot.renew.timer [Unit]
# Auto-generated, DO NOT EDIT 
Description=Timer renew for snap application certbot.renew 
Requires=snap-certbot-1515.mount 
After=snap-certbot-1515.mount 
X-Snappy=yes

[Timer] 
Unit=snap.certbot.renew.service 
OnCalendar=*-*-* 07:09 
OnCalendar=*-*-* 19:46

[Install] 
WantedBy=timers.target
Run Code Online (Sandbox Code Playgroud)

不要被 cronjob 愚弄了。它会仔细检查以确保它没有执行已由 systemd 管理的操作:

# grep test /etc/cron.d/certbot
0 */12 * * * root test -x /usr/bin/certbot -a \! -d /run/systemd/system && perl -e 'sleep int(rand(43200))' && certbot -q renew
Run Code Online (Sandbox Code Playgroud)

其中使用test的返回“1”代码,因此 && 之后的任何内容都不会执行。

您的解决方法不会导致问题 - 但库存安装应该做正确的事情。

所以回答你的三个问题:

你知道 systemd 计时器发生了什么吗?为什么它指向 /dev/null?或者我应该忽略这个已知问题?

这是双重检查是否使用了快照计时器,并且没有使用 certbot 的任何系统计时器(例如,通过 apt 安装时)

我应该像 Ubuntu 建议的那样“快速安装 root-framework”来安装“root”吗?

存储在 /etc/cron.d 中的 Cron 文件的语法包括执行时使用的用户名。root这里表示cronjob是以root用户运行的。您不需要安装 root-framework - “root”一词不是命令本身的一部分。

cron 作业“root test”似乎没有做任何事情...任何人都解释一下那里正在测试什么以及“cerbot renew”是否实际上正在运行?

如上所述 - 这个 cronjob 有效地说“嘿,systemd 正在运行!” 我什么也不会做!

最后,您可以在日志文件中验证续订状态:

# grep -c skipped /var/log/letsencrypt/letsencrypt.log
14
Run Code Online (Sandbox Code Playgroud)

就我而言,尚未发生续订(有效期足够长),但它正在运行 - 只是非常安静。