Debian

Certbot 不強制 Apache2 讀取新生成的證書

  • October 28, 2018

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

出於幾個原因,我通常傾向於避免僅僅為了重新啟動服務而重新啟動服務。因此,我建議在更新證書後重新啟動 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並採取相應措施。

這可以通過添加簡單地完成:

&& apachectl -k graceful

到每日 Certbot 命令。

這樣,一天兩次:

  • 證書將被檢查是否過期,如果過期,它們將被更新。
  • Apache 將被重新載入。Apache 將建議其執行緒在空閒時退出,然後 apache 重新載入配置。

引用自:https://unix.stackexchange.com/questions/478195