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

@monthly letsencrypt renew && service apache2 reload


评论

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

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

下面有一个答案对于新安装非常重要(截至2019年1月),certbot自动添加系统计时器和cron作业计划,因此您不需要cron设置。

#1 楼

每月不够频繁。
此脚本应至少每周运行一次,最好每天运行一次。请记住,除非证书即将过期,否则不会更新证书,并且每月一次可能会导致您现有的证书在更新之前偶尔已经过期。
程序的名称是certbot,从letsencrypt重命名。如果您仍在使用letsencrypt,则需要更新到当前版本。除了这些问题,它与我的cron作业大致相同。
43 6 * * * certbot renew --post-hook "systemctl reload nginx"


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

评论


什么时候接近“到期时间”?

–安德烈·菲格雷多(Andre Figueiredo)
17年5月11日在18:49

使用--renew-hook而不是--post-hook,最好仅在证书成功更新后才重新启动。

–mwfearnley
17-10-6在9:27

我读过使用--deploy-hook而不是--renew-hook,但是我不确定这是否重要。是否需要重新加载Apache?我认为python-certbot-apache软件包会在需要时为我们执行此操作。

–snapfractalpop
17-10-11在6:17

对于apache / httpd,certbot更新将可以正常工作™

–aairey
17-10-25在11:39

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

– J.D. Mallen
18/12/15在6:16

#2 楼

我没有足够的声誉来发表评论,所以我在这里回答。我最近(2017年10月)在Ubuntu 16.04服务器上安装并运行了certbot,并在/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后,我也看到了这一点。很好,让加密完成了!这是一个很棒的项目。

–比约恩
17年12月11日在7:24



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

–汉米·唐纳(Hamish Downer)
18年8月2日在19:55

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

– NilsB
'18 / 12/1在6:58

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

–orrd
19年8月22日在23:38

#3 楼

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

注意:
如果您要设置cron或systemd作业,我们建议每天运行两次(不会执行)在您的证书需要更新或吊销之前可以进行任何操作,但是定期运行该证书将使您的站点有机会保持在线状态,以防万一由于某种原因而让Let's Encrypt发起的撤销发生了。请在一个小时内随机选择一分钟来执行续订任务。 certbot-auto命令需要root特权才能运行,因此cron脚本中的行应如下所示:在我自己的情况下,certbot-auto脚本位于git-user的主目录中。确切的命令是
52 0,12 * * * root /full/path/to/certbot-auto renew --quiet

请注意,文档中的示例与相对路径相对应,如点所示,这可能会造成混淆:事先在shell中执行renew命令来测试路径,如果证书不是由于更新而到期(将在没有./path/to/certbot-auto renew --quiet标志的情况下运行此测试以查看发生的情况),则不会发生任何事情。以这种方式更新证书时的服务器,因为如果正确设置,实时证书的路径不会更改。
如果您运行的是apache,则为true-对于nginx,请考虑添加更新挂钩如:
52 0,12 * * * root /home/git/certbot-auto renew --quiet

在docker环境中(编辑2020-09-18)可以让该代理网络在本地和实时环境中处理所有证书。我不隶属于该项目,但是几年来我一直在愉快地使用它,从那以后就再也没有碰过cron(用于此任务)或certbot脚本了。
它具有附加的优势,即自动强制通过端口443的流量(如果启用),因此您无需费心apache或nginx配置-为Web应用程序提供服务的容器仅需提供端口80,代理即可处理其余的。

评论


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

–Gusstavv Gil
17年2月21日在2:18

这是不正确的-必须至少使用Nginx重新加载服务器-nginx似乎会缓存初始证书,即使文件更改也不会注册新证书。有关使用--renew-hook仅在成功续约后重新启动的信息,请参阅此帖子:guyrutenberg.com/2017/01/01/…

–有什么可能
17年8月18日在1:43



#4 楼

您无需设置任何内容。最近安装的certbot的Debian / Ubuntu安装都应安装systemd计时器和cron作业(如果systemd未处于活动状态,则cron作业将仅运行certbot,因此您不会同时运行两者)。

systemd计时器

您可以使用命令systemctl list-timers(或systemctl list-timers --all,如果您还想显示不活动的计时器)来检查systemd计时器。像这样的东西: certbot.service在最多延迟12小时(43200秒)的随机延迟后的12点和12点。

% 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


/lib/systemd/system/certbot.timer将执行续订命令。

# 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


cron作业

正如其他人所述,/lib/systemd/system/certbot.service中还安装了cron作业:

这是在做:



certbot.timer-检查certbot.service是否是可执行文件,并且/etc/cron.d/certbot不是目录。仅在此检查成功后才继续进行下一个操作。



test -x /usr/bin/certbot -a \! -d /run/systemd/system-在0秒至12小时之间随机睡眠(43200 = 12 x 60 x 60)。

/usr/bin/certbot检查您的证书并根据需要续订。 /run/systemd/system标志是“安静”的-除非出现错误,否则不会产生任何输出。

我最初对cron作业感到困惑,因为由于systemd它将无法运行,所以会运行certbot吗?我在此论坛帖子中找到了答案,这就是我基于此答案的原因。

评论


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

– Dan Dascalescu
18-10-16在5:20

这是最新和正确的答案,但需要注意的是,它取决于您正在运行的距离:certbot.eff.org/docs/using.html#id8

–olive_tree
18年11月22日在20:16

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

–titus
19年5月31日在11:22

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

–汉米·唐纳(Hamish Downer)
19年6月1日在18:42

在2018年或之后建立的最新系统的最有效答案。

–最大
20年5月11日在10:26

#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

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

#6 楼

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

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

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


#7 楼

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


或什至更好: />
--pre-hook和--post-hook挂钩在每次续订尝试之前和之后运行。如果希望挂接仅在成功续订后才能运行,
在这样的命令中使用--renew-hook。 .org / docs / using.html

评论


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

–Isius
17年8月17日在15:55

按照上面的说明,最好使用--renew-hook,它仅在实际更新证书时才重新启动服务器。

–有什么可能
17年8月18日在1:48

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

–塔德杰
17年8月18日在6:19

@JedatKinports:--post-hook和--renew-hook是否应该重新启动服务apache2而不是重新启动服务apache2?

– Paul Ratazzi
18年4月13日在18:29



命令是service apache2 restart!服务重启apache2不是正确的命令/服务。

–GTodorov
18年6月12日在15:33

#8 楼

这就是我用的:

/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)


,那么每天续签证书都没有问题,那么我的事务就是:
我使用脚本来调整日志记录以分离文件,所以这是我的cronautorenew.sh:

Cert not yet due for renewal


#9 楼

根据EFF certbot指南


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


如果不确定系统是否已将其自动化,请检查系统的crontab(通常在/etc/crontab//etc/cron.*/*$ crontab -l和systemd计时器$ systemctl list-timers中。