Apache2でLet's Encrypt証明書を更新するためにcronを設定するこの正しい方法はありますか?私はUbuntu 16.04を使用しています。
@monthly letsencrypt renew && service Apache2 reload
毎月の頻度は十分ではありません。このスクリプトは、少なくとも毎週、できれば毎日実行する必要があります。証明書は有効期限に近づかない限り更新されないことに注意してください。毎月、既存の証明書は更新される前にすでに期限切れになることがあります。
プログラムの名前はcertbot
で、letsencrypt
から名前が変更されました。引き続きletsencrypt
を使用している場合は、現在のバージョンに更新する必要があります。
これらの問題は別として、それは私のcronジョブとほぼ同じです。
43 6 * * * certbot renew --post-hook "systemctl reload nginx"
18.04 LTSでは、letsencryptパッケージの名前が(最終的に)certbotに変更されました。これには、systemctl enable certbot.timer
およびsystemctl start certbot.timer
を使用して、certbotの更新をスケジュールできるsystemdタイマーが含まれています。しかし、Ubuntuはフックを指定する方法を提供していませんでした。 Ubuntuがこれを修正するまでは、certbot.service
のオーバーライドを設定して、必要なコマンドラインでExecStart=
をオーバーライドする必要があります。
コメントするには評判が足りないので、ここで答えます。最近(2017年10月)、Ubuntu 16.04サーバーにcertbotをインストールして実行しました。更新cronジョブは、/etc/cron.d/certbot
に自動的に作成されました。
作成されたcronジョブは次のとおりです。
0 */12 * * * root test -x /usr/bin/certbot -a \! -d /run/systemd/system && Perl -e 'sleep int(Rand(3600))' && certbot -q renew
Crontabエントリを作成する前に、このファイルがすでに存在するかどうかを確認することをお勧めします。
certbotドキュメント は、スクリプトを1日に2回実行することをお勧めします。
注意:
cronジョブまたはsystemdジョブを設定している場合は、1日に2回実行することをお勧めします(証明書の更新期限または失効するまで何もしませんが、定期的に実行すると、サイトをオンラインに保つ機会が与えられますLet's Encryptによって開始された失効が何らかの理由で発生した場合)。更新タスクの時間内でランダムな分を選択してください。
Michael Hamptonが言及するように、名前はcertbotに変更されましたが、それらは引き続きそれ自体を更新する-autoオプションを提供します。 certbot-auto
コマンドを実行するにはroot権限が必要なので、cronスクリプトの行は次のようになります。
52 0,12 * * * root /full/path/to/certbot-auto renew --quiet
私の場合、certbot-auto
スクリプトはgitユーザーのホームディレクトリに配置されています。正確なコマンドは
52 0,12 * * * root /home/git/certbot-auto renew --quiet
ドキュメントの例は、わかりにくいドットで示されているように、相対パスに対応していることに注意してください。
./path/to/certbot-auto renew --quiet
事前にシェルで更新コマンドをテスト実行してパスをテストしてください。証明書が更新の期限ではない場合、何も起こりません(何が行われているかを確認するには、--quiet
フラグなしでこのテストを実行してください)。
正しく設定されていればライブ証明書へのパスは変更されないため、この方法で証明書が更新されたときにサーバーをリロードする必要は必ずしもありません。
これは、Apacheを実行している場合に当てはまります。nginxの場合、次のような更新フックの追加を検討してください。
52 0,12 * * * root certbot renew --renew-hook 'service nginx reload'
何も設定する必要はありません。最近のcertbotのDebian/Ubuntuインストールでは、systemdタイマーとcronジョブをインストールする必要があります(また、crondジョブは、systemdがアクティブでない場合にのみcertbot
を実行するため、両方を実行することはできません)。
_systemctl list-timers
_コマンド(または、非アクティブなタイマーも表示したい場合は_systemctl list-timers --all
_)を使用してsystemdタイマーを確認できます。このようなもの:
_% Sudo systemctl list-timers
NEXT LEFT LAST PASSED UNIT ACTIVATES
Fri 2018-08-03 06:17:25 UTC 10h left Thu 2018-08-02 06:27:13 UTC 13h ago apt-daily-upgrade.timer apt-daily-upgrade.service
Fri 2018-08-03 11:43:29 UTC 15h left Thu 2018-08-02 16:54:52 UTC 3h 7min ago certbot.timer certbot.service
Fri 2018-08-03 12:44:58 UTC 16h left Thu 2018-08-02 19:14:58 UTC 47min ago apt-daily.timer apt-daily.service
Fri 2018-08-03 19:43:44 UTC 23h left Thu 2018-08-02 19:43:44 UTC 18min ago systemd-tmpfiles-clean.timer systemd-tmpfiles-clean.service
Mon 2018-08-06 00:00:00 UTC 3 days left Mon 2018-07-30 00:00:09 UTC 3 days ago fstrim.timer fstrim.service
_
Certbotタイマーはここに_/lib/systemd/system/certbot.timer
_である必要があり、_/lib/systemd/system/certbot.service
_で指定されたコマンドを実行します
_certbot.timer
_は、最大12時間(43200秒)のランダムな遅延の後、午前12時と午後12時に `certbot.serviceを実行します。
_# cat /lib/systemd/system/certbot.timer
[Unit]
Description=Run certbot twice daily
[Timer]
OnCalendar=*-*-* 00,12:00:00
RandomizedDelaySec=43200
Persistent=true
[Install]
WantedBy=timers.target
_
および_certbot.service
_は更新コマンドを実行します。
_# cat /lib/systemd/system/certbot.service
[Unit]
Description=Certbot
Documentation=file:///usr/share/doc/python-certbot-doc/html/index.html
Documentation=https://letsencrypt.readthedocs.io/en/latest/
[Service]
Type=oneshot
ExecStart=/usr/bin/certbot -q renew
PrivateTmp=true
_
他の人が述べたように、_/etc/cron.d/certbot
_にはcronジョブもインストールされています:
_# 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
_
これはやっています:
test -x /usr/bin/certbot -a \! -d /run/systemd/system
_-_/usr/bin/certbot
_が実行可能ファイルであり、_/run/systemd/system
_がディレクトリではないかどうかを確認します。このチェックが成功した場合のみ、次のビットに進みます。Perl -e 'sleep int(Rand(43200))'
-0秒から12時間の間でランダムにスリープします(43200 = 12 x 60 x 60)。certbot -q renew
_証明書を確認し、必要に応じて更新してください。 _-q
_フラグは「静か」です。エラーがない限り、出力を生成しません。Systemdが原因で実行されなかったので、元々cronジョブに戸惑っていましたが、certbotはどのように実行されますか?私は このフォーラムの投稿 で答えを見つけました。これは私がこの答えのベースにしたものです。
LetsEncrypt証明書の更新には、通常 getssl を使用します。これは、SSH接続を介して他のマシンに証明書をインストールすることもできる非常に便利なシェルラッパーです。
Cronエントリは次のとおりです。
01 23 * * * root /root/scripts/getssl/getssl -u -a -q >>/var/log/getssl.log 2>&1 ; /usr/sbin/Apache2ctl graceful
すでに示唆したように、あなたはそれを毎日、またはさらに良いことに、1日2回実行するべきです。
Glauxがすでに述べたように:
注:cronジョブまたはsystemdジョブを設定する場合は、1日に2回実行することをお勧めします(証明書の更新期限または失効するまで何もしませんが、定期的に実行するとサイトに滞在する機会が与えられますLet's Encryptによって開始された失効が何らかの理由で発生した場合に備えて、オンラインで行います)。更新タスクの時間内でランダムな分を選択してください。
出典: https://certbot.eff.org/all-instructions/#debian-8-jessie-Apache
したがって、私はこれを使用することになりました(実行は1日2回、毎日01:00と13:00です):
6 1,13 * * * certbot renew --post-hook "service Apache2 restart"
またはさらに良い:
6 1,13 * * * certbot renew --renew-hook "service Apache2 restart"
私はテストしませんでしたが、これもうまくいくはずです:
6 1,13 * * * certbot renew --post-hook "/etc/init.d/Apache2 restart"
6 1,13 * * * certbot renew --renew-hook "/etc/init.d/Apache2 restart"
--pre-hookおよび--post-hookフックは、すべての更新試行の前後に実行されます。更新が成功した後でのみフックを実行したい場合は、このようなコマンドで--renew-hookを使用します。
他のメンバーはすでにより詳細な回答を提供しました。しかし、私はそれをここで言及する必要があるように見えます。
Certbotバージョン0.21.1以降、--renew-hook
フラグが--deploy-hook
に変更されました。廃止されたフラグを使用していないことを確認してください。
certbot renew --deploy-hook "systemctl restart myservice"
これは私が使用するものです:
/opt/letsencrypt/letsencrypt-auto renew
出力は次のようになります。
Upgrading certbot-auto 0.8.1 to 0.9.1...
Replacing certbot-auto...
Creating virtual environment...
...
new certificate deployed with reload of Apache server; fullchain is
/etc/letsencrypt/live/Host.simplecoin.cz/fullchain.pem
-------------------------------------------------------------------------------
Congratulations, all renewals succeeded. The following certs have been renewed:
/etc/letsencrypt/live/Host.simplecoin.cz/fullchain.pem (success)
また、Apacheはすでに再起動されているため、やり直す必要はありません。もう一度実行すると:
Cert not yet due for renewal
したがって、証明書を毎日更新することは問題ではありません。私のcronは次のようになります。
@daily /opt/letsencrypt/cronautorenew.sh
スクリプトを使用してログを個別のファイルに微調整するので、ここにcronautorenew.shを示します。
#!/usr/bin/env bash
printf "\nattempt to renew certificates" >>/var/log/letsencrypt_cron.log 2>&1
date >>/var/log/letsencrypt_cron.log 2>&1
/opt/letsencrypt/letsencrypt-auto renew >>/var/log/letsencrypt_cron.log 2>&1
printf "renew finished\n" >>/var/log/letsencrypt_cron.log 2>&1
EFF certbotガイド によると
多くのLinuxディストリビューションは、システムパッケージマネージャーを介してインストールされたパッケージを使用すると、自動更新を提供します。
システムでこれがすでに自動化されているかどうかが不明な場合は、システムのcrontabを確認してください(通常は/etc/crontab/
および/etc/cron.*/*
$ crontab -l
およびsystemdタイマー$ systemctl list-timers
。