Apache2でLet's Encrypt証明書を更新するためにcronを設定するこの正しい方法はありますか?Ubuntu 16.04を使用します。
@monthly letsencrypt renew && service apache2 reload
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
およびでcertbotの更新をスケジュールできるsystemdタイマーが含まれていますsystemctl start certbot.timer
。ただし、Ubuntuはフックを指定する方法を提供しませんでした。Ubuntuがこれを修正するまで、目的のコマンドラインでcertbot.service
オーバーライドExecStart=
するためのオーバーライドを設定する必要があります。
--renew-hook
なく、ユーザーの方がよい場合があります--post-hook
。
certbot renew
ちょうど動作します™
ExecStartPost=/usr/sbin/service nginx reload
。私のために働いた!
ExecStartPost=
することをお勧めします。なぜ私はそれを考えなかったのですか?ただし、このservice
コマンドは廃止されることに注意してください。永遠に続くことはありません。対応するsystemctl
コマンドに切り替えます。
コメントするのに十分な評判がないので、ここで答えます。私は最近(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 renew
場合/run/systemd/system
は実行されないことに注意する価値があります-これは、代わりにsystemdタイマーがcertbotを実行しているためです-certbotとsystemdタイマーの詳細については、こちらをご覧ください。
43 6 * * *
は、毎日午前6時43分に実行されることです。1日1回で十分ですが、どちらでも問題ありません。
certbotのドキュメントでは、一日二回のスクリプトを実行しているお勧めします。
注意:
cronジョブまたはsystemdジョブを設定する場合は、1日に2回実行することをお勧めします(証明書の更新期限または失効するまで何もしませんが、定期的に実行すると、サイトにオンライン状態を維持できる可能性がありますLet's Encryptで開始された失効が何らかの理由で発生した場合)。更新タスクの時間内のランダムな分を選択してください。
マイケル・ハンプトンが言及しているように、名前はcertbotに変更されましたが、それでも更新され続ける-autoオプションを提供します。certbot-auto
コマンドの実行には、ルートpriviledgesを必要とするので、あなたのcronスクリプトの行は次のようになります。
52 0,12 * * * root /full/path/to/certbot-auto renew --quiet
私の場合、certbot-auto
スクリプトはgit-userのホームディレクトリに配置されます。正確なコマンドは
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'
--renew-hook
成功リニューアル後にのみ再起動する:guyrutenberg.com/2017/01/01/...
何も設定する必要はありません。Debian / Ubuntuの最近のcertbotのインストールでは、systemdタイマーとcronジョブをインストールする必要があります(また、cronジョブはcertbot
systemdがアクティブでない場合にのみ実行されるため、両方を実行することはできません)。
コマンドを使用してsystemdタイマーを確認できますsystemctl list-timers
(またはsystemctl list-timers --all
、非アクティブタイマーも表示する場合)。このようなもの:
% 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
他の人が言及したように、cronジョブもインストールされてい/etc/cron.d/certbot
ます:
# 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はどのように実行されますか?私はこのフォーラムの投稿で答えを見つけました。それがこの答えの元になったものです。
/etc/cron.d/certbot
存在しsystemctl list-timers
ますcertbot.timer
が、私の証明書は更新されませんでした。certbot
手動で実行すると正常に機能したため、何が起こっているのかわかりません。古い学校のcrontab
エントリを追加することになりました。
test
を実行してsystemdがアクティブかどうかを確認し、アクティブであれば、cronジョブは実行せずにすぐに終了するcertbot
というものです-cronジョブに関するテキストを参照してください。テキストをより正確に編集します。
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を使用します。
--renew-hook
、証明書が実際に更新された場合にのみサーバーを再起動します。
--post-hook
と--renew-hook
なるservice apache2 restart
代わりにservice restart apache2
?
service restart apache2
は正しいコマンド/サービスではありません。
これは私が使用するものです:
/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
多くのLinuxディストリビューションでは、システムパッケージマネージャーを介してインストールされたパッケージを使用すると、自動更新が提供されます。
システムにこれがすでに自動化されているかどうかわからない場合は、システムのcrontab(通常/etc/crontab/
and /etc/cron.*/*
$ crontab -l
およびsystemd timers )を確認してください$ systemctl list-timers
。
/etc/cron.d/certbot