web-dev-qa-db-ja.com

更新を暗号化しましょう

Apache2でLet's Encrypt証明書を更新するためにcronを設定するこの正しい方法はありますか?私はUbuntu 16.04を使用しています。

@monthly letsencrypt renew && service Apache2 reload
104
user3448600

毎月の頻度は十分ではありません。このスクリプトは、少なくとも毎週、できれば毎日実行する必要があります。証明書は有効期限に近づかない限り更新されないことに注意してください。毎月、既存の証明書は更新される前にすでに期限切れになることがあります。

プログラムの名前は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=をオーバーライドする必要があります。

158
Michael Hampton

コメントするには評判が足りないので、ここで答えます。最近(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エントリを作成する前に、このファイルがすでに存在するかどうかを確認することをお勧めします。

61
ishigoya

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'
45
glaux

何も設定する必要はありません。最近のcertbotのDebian/Ubuntuインストールでは、systemdタイマーとcronジョブをインストールする必要があります(また、crondジョブは、systemdがアクティブでない場合にのみcertbotを実行するため、両方を実行することはできません)。

systemdタイマー

_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
_

cronジョブ

他の人が述べたように、_/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_がディレクトリではないかどうかを確認します。このチェックが成功した場合のみ、次のビットに進みます。
    • チェックのsystemd部分は、systemdが実行されている場合、cronジョブからcertbotを実行しないことを意味します-タイマーに任せます。
  • Perl -e 'sleep int(Rand(43200))'-0秒から12時間の間でランダムにスリープします(43200 = 12 x 60 x 60)。
  • _certbot -q renew_証明書を確認し、必要に応じて更新してください。 _-q_フラグは「静か」です。エラーがない限り、出力を生成しません。

Systemdが原因で実行されなかったので、元々cronジョブに戸惑っていましたが、certbotはどのように実行されますか?私は このフォーラムの投稿 で答えを見つけました。これは私がこの答えのベースにしたものです。

22
Hamish Downer

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回実行するべきです。

5
shodanshok

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を使用します。

出典: https://certbot.eff.org/docs/using.html

3
Tadej

他のメンバーはすでにより詳細な回答を提供しました。しかし、私はそれをここで言及する必要があるように見えます。

Certbotバージョン0.21.1以降、--renew-hookフラグが--deploy-hookに変更されました。廃止されたフラグを使用していないことを確認してください。

certbot renew --deploy-hook "systemctl restart myservice"
2
Shinebayar G

これは私が使用するものです:

/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
1
Pavel Niedoba

EFF certbotガイド によると

多くのLinuxディストリビューションは、システムパッケージマネージャーを介してインストールされたパッケージを使用すると、自動更新を提供します。

システムでこれがすでに自動化されているかどうかが不明な場合は、システムのcrontabを確認してください(通常は/etc/crontab/および/etc/cron.*/*$ crontab -lおよびsystemdタイマー$ systemctl list-timers

0
Suhayb