Debian
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
出於幾個原因,我通常傾向於避免僅僅為了重新啟動服務而重新啟動服務。因此,我建議在更新證書後重新啟動 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 重新載入配置。