我从LetsEncrypt的certbot自动更新SSL证书。实际更新正在运行,但我需要自动重新启动服务,以便加载续订的证书。我想知道你是否可以在cronjob中为--renew-hook
使用多个letsencrypt renew
参数?
如何在续订证书时自动重启服务?
答案 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.ini
(see 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