LetsEncryptのcertbotからのSSL証明書の更新を自動化しています。実際の更新は機能していますが、更新された証明書をロードするために、サービスの再起動を自動化する必要があります。 --renew-hook
のcronjob内で複数のletsencrypt renew
パラメーターを使用できるかどうか疑問に思っていました。
証明書の更新時にサービスの再起動を自動化する方法?
はい、複数の--renew-hookステートメントを使用できます。 -qフラグも使用して、更新が実際に行われるまで空の通知をメールで送信するようにします。また、更新が発生するまでサービスを再起動しません。これにより、必要に応じてログファイルが電子メールに添付されます。
毎日bashを実行するcronがあります。
私のbash(certbotrenew.sh)の中には単純にこれがあります
#!/bin/bash
cd /opt/certbot
Sudo ./certbot-auto renew --renew-hook "service postfix reload" --renew-hook "service dovecot restart" --renew-hook "service Apache2 reload" -q >> /var/log/certbot-renew.log | mail -s "CERTBOT Renewals" [email protected] < /var/log/certbot-renew.log
exit 0
私のcronは
00 20 * * 1 /bin/certbotrenew.sh
何も起こらなかったにもかかわらず、なぜ私がメールを送信するのかと疑問に思う人もいます。毎日のcronが実行されていることを常に知りたいのです。
CertBotのUbuntu 16.04での新規インストールから見たものから、cronジョブが作成されます。
# /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(3600))' && certbot -q renew --pre-hook
'/bin/run-parts /etc/letsencrypt/pre-hook.d/' --post-hook '/bin/run-parts /etc/letsencrypt/post-hook.d/' --renew-hook '/bin/run-parts
/etc/letsencrypt/renew-hook.d/'
したがって、run-parts
を含む多くのディレクトリで/etc/letsencrypt/renew-hook.d/
を実行します
これらのフックディレクトリのいずれかに実行可能ファイルを追加するだけです(必要なファイルを選択します)。
例として、私のrenew-hook.d
で、次の内容のファイルrestart-nginx
を作成しました。
#!/bin/bash
/etc/init.d/nginx restart
注:run-parts
オプションを使用すると、--test
によって呼び出されるファイルを知ることができます。 (例run-parts --test /etc/letsencrypt/renew-hook.d/
ファイルのグローバルオプションとしてフック(および必要に応じて他のオプション)を設定することもできます/etc/letsencrypt/cli.ini
( ドキュメントを参照 )このように:
# Global config for letsencrypt runs
#
# Note that these options apply automatically to all use of Certbot for
# obtaining or renewing certificates, so options specific to a single
# certificate on a system with several certificates should not be placed
# here.
renew-hook = service postfix reload
post-hook = service nginx reload
ほとんどのシステムで最初にファイルを作成する必要があります。 Letsencryptには付属していません。
グローバルに移行したくない場合は、renewal
フォルダーごとに証明書固有のバージョンを作成することもできます。
フックスクリプトを実行するための最新の推奨方法は、/etc/letsencrypt/cli.ini
からです。ファイルが存在しない場合は、自分で作成できます。もう1つは、--deploy-hook
の代わりに--renew-hook
を使用する必要があるということです。 --renew-hookはまだ存在しますが、最新のドキュメントにも記載されていないため、段階的に廃止されます。
したがって、/etc/letsencrypt/cli.ini
が存在しない場合は作成し、次の行を追加します。deploy-hook = "service postfix reload; service dovecot restart; service Apache2 reload"
それらの特定のサービスをリロードします。
Certbotの実行を制御する場所もあります(ubuntu 16.04 + nginx —以下の設定ファイル)
1)systemdタイマー
コマンドを実行:Sudo systemctl list-timers
出力を参照してください:
Sun 2018-07-08 00:46:59 EEST 7h left Sat 2018-07-07 12:36:26 EEST 4h 51min ago certbot.timer certbot.service
それから
2)
systemctlがCertbotを実行する時間を制御するファイルをチェックします
/etc/systemd/system/timers.target.wants/certbot.timer
これはのシンボリックリンクです
/lib/systemd/system/certbot.timer
時間+ランダムな秒を定義するこの行に注意してください(letsencryptサーバーにストレスを与えないためにランダムな時間を設定してください)
OnCalendar=--* 00,12:00:00
RandomizedDelaySec=3600
それが新しいバージョンだけのためかどうかはわかりませんが、誰かがそれが役に立つと思うことを願っています。少なくとも1つのドメインを追加すると、certbotは3つのサブディレクトリ「deploy」、「post」、「pre」で「renewal-hooks」ディレクトリを作成します。
スクリプトを「post」フォルダーに入れると、更新後に自動的に実行されます。スクリプトに+ xを追加して、実行可能にすることを忘れないでください。
私は、次の内容の「001-restart-nginx.sh」を1つだけ使用しています。
#!/bin/bash
echo "ssl certs updated" && service nginx restart
/etc/letsencrypt/renewal-hooks/post/001-restart-nginx.sh
これにより、手動で--post-hook
すべての特定の指示を持つパラメーター。
実際の更新プロセスでは、次のようなものが表示されます。
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Congratulations, all renewals succeeded. The following certs have been renewed:
/etc/letsencrypt/live/<your-domain-name>/fullchain.pem (success)
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Running post-hook command: /etc/letsencrypt/renewal-hooks/post/001-restart-nginx.sh
Output from post-hook command 001-restart-nginx.sh:
ssl certs updated