![Certbot 不会强制 Apache2 读取新生成的证书](https://linux22.com/image/141244/Certbot%20%E4%B8%8D%E4%BC%9A%E5%BC%BA%E5%88%B6%20Apache2%20%E8%AF%BB%E5%8F%96%E6%96%B0%E7%94%9F%E6%88%90%E7%9A%84%E8%AF%81%E4%B9%A6.png)
系统:GNU/Linux Debian 9.5 无头。
情况与问题
我刚刚捕获 Let's Encrypt Certbot 来重新生成 SSL 证书,但没有重新加载 Apache2。这导致域半天无法运行。我想自动化这个。该怎么办呢?
这是我当前的 Certbot CRON 文件/etc/cron.d/certbot
:
# /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(43200))' && certbot -q renew
答案1
出于多种原因,我通常倾向于避免仅仅为了重新启动服务而重新启动服务。所以我建议重新启动 Apache证书更新后。
对于 certbot,似乎您可以在更新证书时重新启动 apache2,放入 crontab:
certbot renew --renew-hook "apachectl -k graceful"
您还可以找到获得新证书的日期,然后仅重新启动 Apache。
只是为了介绍主题,您可以通过以下方式检查 X.509 证书的起始有效日期:
$ openssl x509 -startdate -noout -in ZscalerChain.crt
notBefore=Jan 6 22:36:34 2015 GMT
或纪元时间:
$ date --date $(openssl x509 -startdate -noout -in ZscalerChain.crt | awk -F"=" ' { print $2 } ') +%s
1420583794
或者您可以作弊并检查文件日期。所以类似这样的事情:
FILE=~/tmp/savedate
CERT=~/yourcert.crt
if [ ! -f $FILE ]
then
touch --date="last year" $FILE
fi
DATE1=$(date -r $FILE +%s)
DATE2=$(date -r $CERT +%s)
if [ $DATE2 > $DATE1 ]
then
touch $FILE
sudo apachectl -k graceful
fi
或验证 X.509 证书开始日期:
FILE=~/tmp/savedate
CERT=~/yourcert.crt
if [ ! -f $FILE ]
then
touch --date="last year" $FILE
fi
DATE1=$(date -r $FILE +%s)
DATE2=$(date --date $(openssl x509 -startdate -noout -in $CERT | awk -F"=" ' { print $2 } ') +%s)
if [ $DATE2 > $DATE1 ]
then
touch $FILE
sudo apachectl -k graceful
fi
还有其他方法可以做到这一点。例如,如果在更新证书后立即重新启动 Apache 至关重要,您可以inotify
改为监视文件更改并采取相应措施。
答案2
这可以简单地通过添加以下内容来完成:
&& apachectl -k graceful
每日 Certbot 命令。
这样,每天两次:
将检查证书是否过期,如果过期,则会更新它们。
Apache 将重新加载。 Apache 会建议其线程在空闲时退出,然后 apache 重新加载配置。
答案3
我刚刚找到了另一种方法,恕我直言,这是最方便的。
进入Let's Encrypt续订配置目录:
# cd /etc/letsencrypt/renewal
使用所选的文本编辑器编辑所需的域配置文件。
确保在本节中:
[renewalparams]
Apache 停止/启动有钩子:
pre_hook = service apache2 stop post_hook = service apache2 start
这应该确保 Apache2 在更新过程开始之前停止,并在更新过程开始之后启动。