Certbot 不会强制 Apache2 读取新生成的证书

Certbot 不会强制 Apache2 读取新生成的证书

系统: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

我刚刚找到了另一种方法,恕我直言,这是最方便的。

  1. 进入Let's Encrypt续订配置目录:

    # cd /etc/letsencrypt/renewal
    
  2. 使用所选的文本编辑器编辑所需的域配置文件。

  3. 确保在本节中:

    [renewalparams]
    

    Apache 停止/启动有钩子:

    pre_hook = service apache2 stop
    post_hook = service apache2 start
    

    这应该确保 Apache2 在更新过程开始之前停止,并在更新过程开始之后启动。

相关内容