首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在Ubuntu 20.04上自动更新certbot证书

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

Server Fault用户
提问于 2021-03-17 20:52:08
回答 2查看 14K关注 0票数 5

我在AWS中的Ubuntu20.04上运行certbot,作为一个快速包安装。我不确定certbot更新是否运行正常。我很感激你能帮我找出最好的办法。

这是一个新的服务器,我打开和关闭它时,我准备它的生产。目前它每天运行8到10个小时。它不经常在午夜运行,我认为这是当cron任务运行的时候。这将是24/7在几天后,一旦我完成配置。

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

你不应该设置任何东西。最近Debian/Ubuntu安装certbot时,应该安装一个systemd计时器和一个cron作业(如果systemd没有活动,cron作业只能运行certbot,所以不能同时运行)。

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

定时器和系统d

我发现了一个评论,可能是计时器和快照的问题,所以这可能是一个已知的问题。

systemctl列表定时器

计时器似乎没有运行

代码语言:javascript
复制
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

Certbot计时器似乎指向/dev/null。这个问题表示不应该是这样的。

代码语言:javascript
复制
> root@aws2:/etc/systemd/system# ls -l | grep certbot
lrwxrwxrwx 1 root root    9 Jan  9 06:38 certbot.timer -> /dev/null

我可以在syslog中看到以下内容,但我不知道它意味着什么

代码语言:javascript
复制
Mar 17 16:51:02 aws2 systemd[1]: Started Timer renew for snap application certbot.renew.

Cron

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

代码语言:javascript
复制
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)

下面是/etc/cron.d/certbot (这大概是certbot安装的结果,我对它的功能有了大致的了解,但我不知道test / perl的功能是什么)

代码语言:javascript
复制
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

当我运行整个命令(根、测试、/x等)时,我会得到下面的消息。

代码语言:javascript
复制
Command 'root' not found, but can be installed with: snap install root-framework

当我运行这个部分时,我没有输出(注意,为了测试,我已经从certbot中删除了"-q“)。我不知道测试部分在做什么,但是当我运行这个命令时,certbot似乎什么也不做。

代码语言:javascript
复制
> test -x /usr/bin/certbot -a \! -d /run/systemd/system && perl -e 'sleep int(rand(43200))' && certbot renew

关键问题

  1. 有什么想法吗? systemd计时器是怎么回事,它为什么指向/dev/null?还是我应该忽略这个已知的问题?
  2. 我应该像Ubuntu所建议的那样“快速安装根框架”来安装"root“吗?
  3. “根测试”这个任务似乎什么都没做.有没有人解释那里正在测试什么,以及"cerbot更新“是否真的在运行?

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

注意这不是必要的。系统定时器开始正常工作。

在/etc/cron.day文件夹中,我创建了以下文件夹。我想它会做我想做的事,我会在某个时候查看日志。我仍然对我上面问的问题感兴趣。

代码语言:javascript
复制
SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
/usr/bin/certbot -q renew
EN

回答 2

Server Fault用户

回答已采纳

发布于 2021-10-06 02:53:14

由于您使用的是snap,所以值得一次检查,看看是否有第二个定时器(certbot-更新除外)是由snap实现的,并且确实正确地进行了更新。

在这里,您可以看到,我有两个掩码,以确保正常的certbot.timer被禁用,但是我还安装了一个由snap安装的计时器:

代码语言:javascript
复制
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

我可以看到,它每天运行两次,目前正在等待:

代码语言:javascript
复制
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

别被这个职位愚弄了。它是双重检查,以确保它没有做一些已经由systemd管理的事情:

代码语言:javascript
复制
# 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

其中使用的test返回一个'1‘代码,因此在&&不执行之后的任何内容。

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

因此,回答你的三个问题:

有什么想法吗? systemd计时器是怎么回事,它为什么指向/dev/null?还是我应该忽略这个已知的问题?

这是反复检查是否使用了snap计时器,而certbot的任何系统计时器(例如,通过apt安装时)都不是。

我应该像Ubuntu所建议的那样“快速安装根框架”来安装"root“吗?

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

“根测试”这个任务似乎什么都没做.有没有人解释那里正在测试什么,以及"cerbot更新“是否真的在运行?

如前所述--这个职位在有效地说:“嘿,systemd在运行!我什么也不做!”

最后,您可以在日志文件中验证更新的状态:

代码语言:javascript
复制
# grep -c skipped /var/log/letsencrypt/letsencrypt.log
14

在我的例子中,还没有更新(有效期足够长),但它正在运行-只是非常安静。

票数 6
EN

Server Fault用户

发布于 2021-03-18 00:36:32

关于:

代码语言:javascript
复制
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

没有找到命令根目录,因为在命令中包含了用户root。cron作业文件中的格式为min, hr, day, month, day of week, user, command。如果您想运行它进行测试,只需从命令前面移除用户名即可。

Cron作业通常在设定的时间运行,如果服务器在这段时间内关闭,则作业将不会在稍后运行以弥补缺少它的不足。只有当“警报”再次命中服务器时,它才会运行。

有一个解决方案,cron支持运行时的昵称,其中之一是@rebootCrontab(5)手册

我要做的是设置两个cron作业,一个按计划运行,比如每周一次或每月一次,经销商的选择。然后在@reboot运行第二个任务,以弥补服务器关闭时遗漏的任何内容。当然,如果服务器始终处于关闭状态,这可能意味着它每天都在运行。不管certbot不关心,更新程序会检查您的证书离到期有多近,如果它们未接近到期,它将不会与certbot服务器联系。

除非你需要计时器然后无视这个解决方案..。

保留/etc/cron.d/certbot,但可能改为每周一次,而不是每12小时。

代码语言:javascript
复制
# This would run every Sunday at 01:01
1 1 * * 0 root test -x /usr/bin/certbot -a \! -d /run/systemd/system && perl -e 'sleep int(rand(43200))' && certbot -q renew

并添加到/etc/crontab

代码语言:javascript
复制
#This would run every time the server is booted.
@reboot root test -x /usr/bin/certbot -a \! -d /run/systemd/system && perl -e 'sleep int(rand(43200))' && certbot -q renew

我不知道“快照包”,也不知道为什么需要这些额外的命令行内容。Certbot在一般情况下只需要这个就行了。

代码语言:javascript
复制
@reboot root /usr/bin/certbot renew > /dev/null 2>&1

如果您只希望certbot每周检查一次更新,假设服务器始终处于联机状态,并且不需要certbot与任何控制面板或更新操作一起工作,那么最简单的方法是

内部/etc/crontab添加

代码语言:javascript
复制
1 1 * * 0 root /usr/bin/certbot renew > /dev/null 2>&1
票数 0
EN
页面原文内容由Server Fault提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://serverfault.com/questions/1057412

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档