Cron工作,让我们加密续订


93

这是设置cron以更新Apache2中的“加密加密”证书的正确方法吗?我使用Ubuntu 16.04。

@monthly letsencrypt renew && service apache2 reload

6
作为以下答案之一,certbot v0.19.0(可能还有更早的版本)已经创建了一个crontab条目@/etc/cron.d/certbot
xgMz

此外,具有tls-sni验证的certbot apache插件将在检索到新证书后作为验证过程的一部分重新加载apache。
xgMz

下面的答案对于新安装(自2019年1月起)非常重要,certbot自动添加系统计时器和cron作业计划,因此您不需要cron设置。
科里·罗宾逊

Answers:


144

每月不够频繁。该脚本至少应每周运行一次,最好每天运行一次。请记住,除非证书即将到期,否则不会更新证书,并且每月一次会导致您现有的证书在更新之前偶尔已经过期。

该程序的名称为certbot,从改名letsencrypt。如果仍在使用letsencrypt,则需要更新到当前版本。

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

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

请注意,在18.04 LTS中,letsencrypt软件包已(最终)重命名为certbot。现在,它包含一个systemd计时器,您可以使用systemctl enable certbot.timer和来计划certbot的续订systemctl start certbot.timer。但是,Ubuntu没有提供指定钩子的方法。您需要设置替代certbot.serviceExecStart=使用所需的命令行进行替代,直到Ubuntu修复此问题为止。


3
什么时候接近“到期时间”?
安德烈·菲盖尔多

3
对于用户--renew-hook而不是--post-hook,最好是仅在成功更新证书后重新启动,而不是。
mwfearnley

6
对于apache / httpd,certbot renew将可以正常使用
aairey

1
我只是想添加而不是覆盖ExecStart来重新加载nginx,而只是在certbot.service中添加一个ExecStartPost行以在完成后重新加载Web服务器:ExecStartPost=/usr/sbin/service nginx reload。为我工作!
JD Mallen

1
@JDMallen使用ExecStartPost=是一个好主意。我为什么没想到呢?但是请注意,该service命令已被弃用。它不会永远存在。切换到相应的systemctl命令。
迈克尔·汉普顿

56

我没有足够的声誉来发表评论,所以我在这里回答。我最近(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条目之前检查此文件是否已存在。


1
运行certbot后,我也看到了这一点。让加密做到这一点非常好!这是一个很棒的项目。
比约恩

7
值得注意的是,如果存在,则上述cron作业将不会运行-这是因为相反,是systemd计时器正在运行certbot- 在此处详细了解certbot和systemd计时器certbot renew/run/systemd/system
Hamish Downer

感谢您提到已经安装了cronjob。在阅读您的帖子之前,我还没有意识到这一点。
NilsB

1
对于任何想知道的人,这使其每12小时运行一次。另一个答案43 6 * * *将使其每天在6:43 AM运行。一天一次就足够了,但是任何一个都可以。
Orrd

42

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

注意:

如果您要设置cron或systemd作业,我们建议每天运行两次(在您的证书需要更新或吊销之前,它不会做任何事情,但是定期运行它将使您的网站保持在线状态)如果由于某种原因发生了“让我们进行加密”启动的吊销)。请在小时内随机选择一分钟来执行续订任务。

正如迈克尔·汉普顿(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

请确保事先在外壳程序中运行renew命令以测试路径,如果证书不是由于更新而到期,则什么也不会发生(运行该测试时不带--quiet标志以查看发生了什么)。

以这种方式续订证书时,由于使用有效证书的路径设置正确,因此不必严格重新加载服务器。

如果您正在运行apache,则为true-对于nginx,请考虑添加一个更新钩子,例如:

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

1
我喜欢这种解释方式,不需要重新启动服务(如果有人在上面做任何事情,一天有两次被抓住的机会,可能会弄得一团糟),而且提到需要的特权。
Gusstavv Gil

4
这是不正确的-这需要重新加载服务器,至少nginx的- Nginx的出现缓存初始证书和未注册一个新的证书,即使该文件的变化。有关使用该职位信息--renew-hook,只重启成功续期后:guyrutenberg.com/2017/01/01/...
Whatcould

17

您无需设置任何内容。最近安装的certbot的Debian / Ubuntu安装都应安装systemd计时器和cron作业(并且cron作业仅certbot在systemd处于非活动状态时才运行,因此不会同时运行)。

系统计时器

您可以使用命令检查systemd计时器systemctl list-timers(或者systemctl list-timers --all是否还希望显示不活动的计时器)。像这样:

% sudo systemctl list-timers
NEXT                         LEFT        LAST                         PASSED      UNIT                         ACTIVATES
Fri 2018-08-03 06:17:25 UTC  10h left    Thu 2018-08-02 06:27:13 UTC  13h ago     apt-daily-upgrade.timer      apt-daily-upgrade.service
Fri 2018-08-03 11:43:29 UTC  15h left    Thu 2018-08-02 16:54:52 UTC  3h 7min ago certbot.timer                certbot.service
Fri 2018-08-03 12:44:58 UTC  16h left    Thu 2018-08-02 19:14:58 UTC  47min ago   apt-daily.timer              apt-daily.service
Fri 2018-08-03 19:43:44 UTC  23h left    Thu 2018-08-02 19:43:44 UTC  18min ago   systemd-tmpfiles-clean.timer systemd-tmpfiles-clean.service
Mon 2018-08-06 00:00:00 UTC  3 days left Mon 2018-07-30 00:00:09 UTC  3 days ago  fstrim.timer                 fstrim.service

certbot计时器应该在此处/lib/systemd/system/certbot.timer,它将执行在中指定的命令/lib/systemd/system/certbot.service

certbot.timer 在最多延迟12小时(43200秒)后,将在上午12点和下午12点执行`certbot.service。

# cat /lib/systemd/system/certbot.timer
[Unit]
Description=Run certbot twice daily

[Timer]
OnCalendar=*-*-* 00,12:00:00
RandomizedDelaySec=43200
Persistent=true

[Install]
WantedBy=timers.target

certbot.service执行更新命令。

# cat /lib/systemd/system/certbot.service
[Unit]
Description=Certbot
Documentation=file:///usr/share/doc/python-certbot-doc/html/index.html
Documentation=https://letsencrypt.readthedocs.io/en/latest/
[Service]
Type=oneshot
ExecStart=/usr/bin/certbot -q renew
PrivateTmp=true

计划工作

正如其他人提到的那样,在以下位置还安装了一个cron作业/etc/cron.d/certbot

# Eventually, this will be an opportunity to validate certificates
# haven't been revoked, etc.  Renewal will only occur if expiration
# is within 30 days.
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

这是在做:

  • test -x /usr/bin/certbot -a \! -d /run/systemd/system-检查是否/usr/bin/certbot是可执行文件,/run/systemd/system不是目录。如果此检查成功,则仅继续到下一位。
    • 检查的systemd部分有效地意味着,如果systemd正在运行,请不要从cron作业中运行certbot-将其留给计时器。
  • perl -e 'sleep int(rand(43200))' -在0秒至12小时之间随机睡眠(43200 = 12 x 60 x 60)。
  • certbot -q renew检查您的证书并根据需要续订。该-q标志为“安静” -除非有错误不产生任何输出。

我最初对cron作业感到困惑,因为由于systemd它将无法运行,所以如何运行certbot?我在此论坛帖子中找到了答案,正是我根据此答案得出的结论。


1
“您不必设置任何内容”,但是我的证书最近过期了,大约3个月前我安装了certbot。/etc/cron.d/certbot存在,systemctl list-timers显示certbot.timer,但是我的证书没有更新。certbot手动运行效果很好,所以我不知道发生了什么。最终添加了一个旧学校crontab条目。
Dan Dascalescu

这是最新和正确的答案,但需要注意的是,它取决于您正在运行的距离
olive_tree

“并且cron作业将仅在systemd未激活时运行”。您能帮您找到一些有关此“优先顺序”的文档吗?
titus

@titus的解释是cron作业首先运行a test来检查systemd是否处于活动状态,如果是,则cron作业立即退出而不运行certbot-请参阅有关cron作业的文本。我将更精确地编辑文本。
Hamish Downer

5

对于LetsEncrypt证书续订,我通常使用getssl。这是一个非常方便的外壳包装程序,甚至可以通过SSH连接在其他计算机上安装证书。

cron条目如下:

01 23 * * * root /root/scripts/getssl/getssl -u -a -q >>/var/log/getssl.log 2>&1 ; /usr/sbin/apache2ctl graceful

正如已经建议的那样,您应该每天运行一次,或者甚至最好每天运行两次。


3

正如glaux所提到的:

注意:如果您要设置cron或systemd作业,我们建议每天运行两次(在您的证书需要更新或吊销之前,它不会做任何事情,但是定期运行它将为您的网站留下一个留下的机会)在线(以防因某种原因而发生的让我们加密发起的撤销)。请在小时内随机选择一分钟来执行续订任务。

资料来源:https : //certbot.eff.org/all-instructions/#debian-8-jessie-apache

所以我最终使用了它(每天运行两次,分别在每天的01:00和13:00进行):

6 1,13 * * * certbot renew --post-hook "service apache2 restart"

甚至更好:

6 1,13 * * * certbot renew --renew-hook "service apache2 restart"

我没有测试,但这也应该工作:

6 1,13 * * * certbot renew --post-hook "/etc/init.d/apache2 restart"
6 1,13 * * * certbot renew --renew-hook "/etc/init.d/apache2 restart"

--pre-hook和--post-hook挂钩在每次续订尝试之前和之后运行。如果您希望挂钩仅在成功续订后才能运行,请在这样的命令中使用--renew-hook。

资料来源:https : //certbot.eff.org/docs/using.html


1
“请在小时内随机选择一分钟来执行续订任务。”
Isius

1
根据上述说明,最好使用,最好--renew-hook仅在实际更新证书时重新启动服务器。
Whatcould

@Isius谢谢,我将其更改为随机分钟(6)。
塔德吉

1
@JedatKinports:应该不--post-hook--renew-hookservice apache2 restart不是service restart apache2
Paul Ratazzi

1
命令是service apache2 restart!这service restart apache2是不正确的命令/服务。
GTodorov

1

这是我用的:

/opt/letsencrypt/letsencrypt-auto renew

输出为:

Upgrading certbot-auto 0.8.1 to 0.9.1...
Replacing certbot-auto...
Creating virtual environment...
...
new certificate deployed with reload of apache server; fullchain is
/etc/letsencrypt/live/host.simplecoin.cz/fullchain.pem
-------------------------------------------------------------------------------

Congratulations, all renewals succeeded. The following certs have been renewed:
  /etc/letsencrypt/live/host.simplecoin.cz/fullchain.pem (success)

俗话说,apache已经重新启动,因此无需再次进行。如果我再次运行它:

Cert not yet due for renewal

因此,每天续订证书都没问题,我的事务就是:

@daily /opt/letsencrypt/cronautorenew.sh

我使用脚本来调整日志记录到单独的文件,所以这是我的cronautorenew.sh:

#!/usr/bin/env bash
printf "\nattempt to renew certificates" >>/var/log/letsencrypt_cron.log 2>&1
date >>/var/log/letsencrypt_cron.log 2>&1
/opt/letsencrypt/letsencrypt-auto renew >>/var/log/letsencrypt_cron.log 2>&1
printf "renew finished\n" >>/var/log/letsencrypt_cron.log 2>&1

1

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

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

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

0

根据EFF certbot指南

当您使用通过系统软件包管理器安装的软件包时,许多Linux发行版都提供了自动续订。

如果你不能确定是否你的系统中本已自动化,检查系统的crontab(通常在/etc/crontab//etc/cron.*/* $ crontab -lsystemd定时器 $ systemctl list-timers

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.