LetsEncrypt certbot多个续订钩子

时间:2017-02-17 14:38:49

标签: lets-encrypt

我从LetsEncrypt的certbot自动更新SSL证书。实际更新正在运行,但我需要自动重新启动服务,以便加载续订的证书。我想知道你是否可以在cronjob中为--renew-hook使用多个letsencrypt renew参数?

如何在续订证书时自动重启服务?

6 个答案:

答案 0 :(得分:13)

是的,您可以使用多个--renew-hook语句。还使用-q标志,因此它会通过电子邮件向您发送空白通知,直到实际发生续订为止。在更新发生之前,它也不会重新启动任何服务。如果您愿意,这也会将日志文件附加到电子邮件中。

我有一个每天运行bash的cron。

在我的bash(certbotrenew.sh)里面只是这个

#!/bin/bash
cd /opt/certbot
sudo ./certbot-auto renew --renew-hook "service postfix reload" --renew-hook "service dovecot restart" --renew-hook "service apache2 reload" -q >> /var/log/certbot-renew.log | mail -s "CERTBOT Renewals" me@myemail.com  < /var/log/certbot-renew.log
exit 0

我的cron是

00 20 * * 1 /bin/certbotrenew.sh

有些人质疑我发送电子邮件的原因,无论是否发生任何事情,我总是想知道我的日常用品是在运行。

答案 1 :(得分:8)

从我在CertBot的Ubuntu 16.04中的全新安装中看到的,它创建了一个cron作业:

# /etc/cron.d/certbot: crontab entries for the certbot package
#
# Upstream recommends attempting renewal twice a day
#
# 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(3600))' && certbot -q renew --pre-hook 
'/bin/run-parts /etc/letsencrypt/pre-hook.d/' --post-hook '/bin/run-parts /etc/letsencrypt/post-hook.d/' --renew-hook '/bin/run-parts
/etc/letsencrypt/renew-hook.d/'

因此它在许多目录上执行run-parts,包括/etc/letsencrypt/renew-hook.d/

您只需要在任何这些钩子目录中添加一个可执行文件(选择您需要的那个)。

例如,在我的renew-hook.d我创建了一个文件restart-nginx,内容如下:

#!/bin/bash
/etc/init.d/nginx restart

注意:您可以使用run-parts选项了解--test将调用哪些文件。 (示例run-parts --test /etc/letsencrypt/renew-hook.d/

答案 2 :(得分:4)

你也可以在文件/etc/letsencrypt/cli.inisee documentation)中设置钩子(和其他选项,如果你喜欢的话)作为全局选项:

# Global config for letsencrypt runs
#
# Note that these options apply automatically to all use of Certbot for
# obtaining or renewing certificates, so options specific to a single
# certificate on a system with several certificates should not be placed
# here.

renew-hook = service postfix reload
post-hook = service nginx reload

您必须先在大多数系统上创建该文件。 Letsencrypt没有。

如果您不想走向全球,还可以在每个renewal文件夹中创建特定于证书的版本。

答案 3 :(得分:1)

还有一个地方控制certbot的运行(在ubuntu 16.04 + nginx上—设置文件如下)

1)systemd计时器

运行命令:@Inject constructor

并查看输出:

sudo systemctl list-timers

然后

2)

检查文件,该文件控制systemctl运行Certbot的时间

Sun 2018-07-08 00:46:59 EEST 7h left Sat 2018-07-07 12:36:26 EEST 4h 51min ago certbot.timer certbot.service

这是...的符号链接

/etc/systemd/system/timers.target.wants/certbot.timer

请注意以下定义时间+随机秒数的行(设置随机时间的目的是不给letencrypt服务器带来压力)

/lib/systemd/system/certbot.timer

答案 4 :(得分:1)

运行钩子脚本的最新推荐方法来自/etc/letsencrypt/cli.ini。如果文件不存在,则可以自己创建。另一件事是,您应该使用--deploy-hook而不是--renew-hook。 --renew-hook仍然存在,但由于最新文档中甚至没有提及,因此将被淘汰。

因此,只要创建/etc/letsencrypt/cli.ini(如果不存在)并添加以下行: deploy-hook =“服务postfix重新加载;服务dovecot重新启动;服务apache2重新加载”

重新加载这些特定服务。

答案 5 :(得分:0)

不确定是否仅适用于较新版本,但希望有人会发现它有用。 添加至少1个域后,certbot将创建带有3个子目录“ deploy”,“ post”,“ pre”的“ renewal-hooks”目录。

如果将任何脚本放入“ post”文件夹中,将在续订后自动执行。 不要忘记通过在脚本中添加+ x使其可执行。

我仅使用一个具有以下内容的“ 001-restart-nginx.sh”:

#!/bin/bash
echo "ssl certs updated" && service nginx restart

/etc/letsencrypt/renewal-hooks/post/001-restart-nginx.sh

通过这种方式,您完全不必手动提供--post-hook参数,而无需执行某些指令。

在实际的续订过程中,您将看到类似以下内容:

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

Congratulations, all renewals succeeded. The following certs have been renewed:
  /etc/letsencrypt/live/<your-domain-name>/fullchain.pem (success)
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Running post-hook command: /etc/letsencrypt/renewal-hooks/post/001-restart-nginx.sh
Output from post-hook command 001-restart-nginx.sh:
ssl certs updated