题 Cron的工作让我们加密更新


这是正确的设置方式吗? cron的 在Apache2中更新Let的加密证书? 我使用的是Ubuntu 16.04。

@monthly letsencrypt renew && service apache2 reload

67
2017-07-19 19:07




作为下面的答案之一,certbot v0.19.0(可能还有一些)已经创建了一个crontab条目@ /etc/cron.d/certbot - xgMz
此外,带有tls-sni验证的certbot apache插件将在检索到新证书后重新加载apache作为验证过程的一部分。 - xgMz


答案:


每月不够频繁。此脚本应至少每周运行一次,最好每天运行一次。请记住,证书不会续订,除非它们即将到期,并且每月会导致您的现有证书在续订之前偶尔会过期。

该计划的名称是 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 覆盖 ExecStart= 使用您想要的命令行,直到Ubuntu修复此问题。


102
2017-07-19 19:33



我可以跑了 crontab -e 并粘贴 @daily certbot renew && systemctl reload apache2 它会起作用吧?我对Linux不太熟悉。我不知道如何测试这个cron作业。 - user3448600
@ user3448600您可能希望阅读 serverfault.com/q/449651/126632 - Michael Hampton♦
什么时间窗口“接近到期”? - Andre Figueiredo
@AndreFigueiredo在我的测试中,证书在证书到期前大约一个月自动续订。我不知道这是不是30天(我怀疑是)。 - glaux
对于apache / httpd, certbot renew 会工作的 - aairey


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


42
2017-10-22 15:34



同样的情况对我而言。谢谢你的抬头! - Osborne Cox
我看到运行certbot后我也有这个。很好,让加密做到了这一点!这是一个很棒的项目。 - Bjorn Tipling
值得注意的是上面的cron工作 惯于 跑 certbot renew 如果 /run/systemd/system 存在 - 这是因为系统计时器正在运行certbot - 在这里阅读更多关于certbot和systemd计时器的信息。 - Hamish Downer


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

注意:

如果您正在设置cron或systemd作业,我们建议每天运行两次(在您的证书到期或续订之前,它将不会执行任何操作,但定期运行它会使您的站点有机会保持在线状态案例a由于某种原因,我们发生了加密启动的撤销。请在一小时内随机选择续订任务。

正如迈克尔·汉普顿提到的那样,该名称已经改为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'

35
2018-01-09 09:07



我喜欢这个如何解释,详细说明不需要重新启动服务(如果某人正在做任何事情,每天有两次机会被抓住,它可能会弄得一团糟)并提到所需的权限。 - Gusstavv Gil
这不是真的 - 它 是 必须重新加载服务器,至少使用Nginx - nginx似乎缓存初始证书,即使文件发生变化也不会注册新的证书。有关使用的信息,请参阅此帖子 --renew-hook 仅在成功续订后重新启动: guyrutenberg.com/2017/01/01/... - Whatcould


对于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

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


4
2018-01-09 09:46





正如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


3
2017-07-05 09:49



“请在一小时内为您的续订任务选择一个随机的分钟。” - Isius
根据我上面的说明,你会更好 --renew-hook,仅在证书实际续订时重新启动服务器。 - Whatcould
@Isius谢谢,我把它改成了一个随机的分钟(6)。 - JedatKinports
@JedatKinports:不应该 --post-hook 和 --renew-hook 是 service apache2 restart 代替 service restart apache2? - Paul Ratazzi
命令是 service apache2 restart!该 service restart apache2 是不正确的命令/服务。 - GTodorov


这是我用的:

/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

因此,每天更新证书不是问题,我的cron是:

@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
2017-10-10 11:50





你不应该设置任何东西。任何最近的Debian / Ubuntu安装的certbot应该安装systemd计时器和一个cron作业(并且只有在systemd不活动时才会运行cron作业,因此你不能同时运行)。

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 job

正如其他人所提到的那样,还安装了一个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 flag是“安静” - 除非出现错误,否则不会产生任何输出。

我最初对cron工作感到困惑,因为它不会因为systemd而运行,所以如何运行certbot?我找到了答案 这个论坛帖子 这是我基于这个答案。


1
2017-08-02 20:14



“你不应该设置任何东西”但我的证书最近到期了,我在3个月前安装了certbot。 /etc/cron.d/certbot 存在, systemctl list-timers 节目 certbot.timer,但我的证书没有更新。运行 certbot 手动工作正常,所以我不知道发生了什么。结束了一所旧学校 crontab 条目。 - Dan Dascalescu