システム: GNU/Linux Debian 9.5 ヘッドレス。
状況と問題
私はSSL証明書を再生成するためにLet's Encrypt Certbotをキャッチしましたが、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コマンド。
したがって、1日に2回:
証明書が期限切れかどうかを確認し、期限が切れた場合は更新されます。
Apacheが再ロードされます。 Apacheはアイドル状態のときにスレッドが終了することを提案し、Apacheは設定を再ロードします。
答え3
私はIMHOが最も便利な別の方法を見つけました。
Let's Encrypt 更新構成ディレクトリを入力します。
# cd /etc/letsencrypt/renewal
選択したテキストエディタを使用して、必要なドメイン設定ファイルを編集します。
このセクションで以下を確認してください。
[renewalparams]
Apacheの停止/開始にはフックがあります。
pre_hook = service apache2 stop post_hook = service apache2 start
これにより、更新プロセスが開始される前にApache2が停止し、その後に開始されるようにする必要があります。