Answers:
每月不够频繁。该脚本至少应每周运行一次,最好每天运行一次。请记住,除非证书即将到期,否则不会更新证书,并且每月一次会导致您现有的证书在更新之前偶尔已经过期。
该程序的名称为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.service
以ExecStart=
使用所需的命令行进行替代,直到Ubuntu修复此问题为止。
--renew-hook
而不是--post-hook
,最好是仅在成功更新证书后重新启动,而不是。
certbot renew
将可以正常使用
ExecStartPost=/usr/sbin/service nginx reload
。为我工作!
ExecStartPost=
是一个好主意。我为什么没想到呢?但是请注意,该service
命令已被弃用。它不会永远存在。切换到相应的systemctl
命令。
我没有足够的声誉来发表评论,所以我在这里回答。我最近(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条目之前检查此文件是否已存在。
certbot renew
/run/systemd/system
43 6 * * *
将使其每天在6:43 AM运行。一天一次就足够了,但是任何一个都可以。
该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'
--renew-hook
,只重启成功续期后:guyrutenberg.com/2017/01/01/...
您无需设置任何内容。最近安装的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
而不是目录。如果此检查成功,则仅继续到下一位。
perl -e 'sleep int(rand(43200))'
-在0秒至12小时之间随机睡眠(43200 = 12 x 60 x 60)。certbot -q renew
检查您的证书并根据需要续订。该-q
标志为“安静” -除非有错误不产生任何输出。我最初对cron作业感到困惑,因为由于systemd它将无法运行,所以如何运行certbot?我在此论坛帖子中找到了答案,这正是我根据此答案得出的结论。
/etc/cron.d/certbot
存在,systemctl list-timers
显示certbot.timer
,但是我的证书没有更新。certbot
手动运行效果很好,所以我不知道发生了什么。最终添加了一个旧学校crontab
条目。
test
来检查systemd是否处于活动状态,如果是,则cron作业立即退出而不运行certbot
-请参阅有关cron作业的文本。我将更精确地编辑文本。
对于LetsEncrypt证书续订,我通常使用getssl。这是一个非常方便的外壳包装程序,甚至可以通过SSH连接在其他计算机上安装证书。
cron条目如下:
01 23 * * * root /root/scripts/getssl/getssl -u -a -q >>/var/log/getssl.log 2>&1 ; /usr/sbin/apache2ctl graceful
正如已经建议的那样,您应该每天运行一次,或者甚至最好每天运行两次。
正如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。
--renew-hook
仅在实际更新证书时重新启动服务器。
--post-hook
和--renew-hook
是service apache2 restart
不是service restart apache2
?
service restart apache2
是不正确的命令/服务。
这是我用的:
/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
其他成员已经提供了更多详细的答案。但是看起来我应该在这里提及。
从certbot版本开始,将0.21.1 --renew-hook
标志更改为--deploy-hook
确保您不使用已弃用的标志。
certbot renew --deploy-hook "systemctl restart myservice"
当您使用通过系统软件包管理器安装的软件包时,许多Linux发行版都提供了自动续订。
如果你不能确定是否你的系统中本已自动化,检查系统的crontab(通常在/etc/crontab/
和/etc/cron.*/*
$ crontab -l
和systemd定时器 $ systemctl list-timers
。
/etc/cron.d/certbot