更新を暗号化するためのCronジョブ


93

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

@monthly letsencrypt renew && service apache2 reload

6
以下の回答の1つにあるように、certbot v0.19.0(およびおそらくそれ以前のもの)が既にcrontabエントリを作成します@/etc/cron.d/certbot
xgMz

また、tls-sni検証を備えたcertbot apacheプラグインは、新しい証明書が取得された後、検証手順の一部としてapacheをリロードします。
-xgMz

新規インストール(2019年1月現在)にとって非常に重要な回答が以下にあります。certbotはシステムタイマーとcronジョブスケジュールを自動的に追加するため、cronのセットアップは必要ありません。
コリーロビンソン

回答:


145

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

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


3
「有効期限に近い」時間枠は何ですか?
アンドレフィ

3
証明書が正常に更新された場合にのみ、再起動するのでは--renew-hookなく、ユーザーの方がよい場合があります--post-hook
mwfearnley

6
apache / httpdの場合、certbot renewちょうど動作します™
aairey

1
ExecStartをオーバーライドしてnginxをリロードするのではなく、ExecStartPost行をcertbot.serviceに追加して、完了後にWebサーバーをリロードするだけですExecStartPost=/usr/sbin/service nginx reload。私のために働いた!
JDマレン

1
@JDMallenを使用ExecStartPost=することをお勧めします。なぜ私はそれを考えなかったのですか?ただし、このserviceコマンドは廃止されることに注意してください。永遠に続くことはありません。対応するsystemctlコマンドに切り替えます。
マイケルハンプトン

56

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


1
certbotを実行した後、これも見ました。暗号化できるようになったのはとてもいいことです!それは素晴らしいプロジェクトです。
ビヨン

7
上記のcronジョブが存在するcertbot renew場合/run/systemd/systemは実行されないことに注意する価値があります-これは、代わりにsystemdタイマーがcertbotを実行しているためです-certbotとsystemdタイマーの詳細については、こちらをご覧ください
ハミッシュダウナー

cronjobが既にインストールされていたことに言及してくれてありがとう。あなたの投稿を読むまで、私はそれを知りませんでした。
NilsB

1
不思議な人にとっては、12時間ごとに実行されます。もう1つの答え43 6 * * *は、毎日午前6時43分に実行されることです。1日1回で十分ですが、どちらでも問題ありません。
orrd

42

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'

1
私はこれがどのように説明されるのが好きで、サービスの再起動を詳述する必要はありません(誰かが何かをしていると混乱する可能性があり、1日に2回捕まるチャンスがあります)そして必要な特権について言及します。
グスタフギル

4
これは真実ではない- ある、少なくともnginxので、サーバをリロードする必要が- nginxのは、最初の証明書をキャッシュするように表示され、新しい証明書さえあれば、ファイルの変更を登録しません。使用上の情報については、この記事を参照してください--renew-hook成功リニューアル後にのみ再起動する:guyrutenberg.com/2017/01/01/...
Whatcould

17

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

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ジョブ

他の人が言及したように、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ないことを確認します。このチェックが成功した場合にのみ、次のビットに進みます。
    • チェックの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はどのように実行されますか?私はこのフォーラムの投稿で答えを見つけました。それがこの答えの元になったものです。


1
「何も設定する必要はありません」が、私の証明書は最近失効し、約3か月前にcertbotをインストールしました。/etc/cron.d/certbot存在しsystemctl list-timersますcertbot.timerが、私の証明書は更新されませんでした。certbot手動で実行すると正常に機能したため、何が起こっているのかわかりません。古い学校のcrontabエントリを追加することになりました。
ダンダスカレスク

これは最新かつ正しい答えですが、実行しているdistに依存するという警告があります:certbot.eff.org/docs/using.html#id8
olive_tree

「また、cronジョブはsystemdがアクティブでない場合にのみ実行されます」。この「優先順位」について説明したドキュメントを見つけてください。
タイタス

@titusの説明は、cronジョブが最初にa testを実行してsystemdがアクティブかどうかを確認し、アクティブであれば、cronジョブは実行せずにすぐに終了するcertbotというものです-cronジョブに関するテキストを参照してください。テキストをより正確に編集します。
ハミッシュダウナー

5

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回実行する必要があります。


3

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


1
「更新タスクの時間内にランダムな分を選択してください。」
イシウス

1
上記の私のメモによると--renew-hook、証明書が実際に更新された場合にのみサーバーを再起動します。
whatcould

@Isiusありがとう、ランダムな分(6)に変更しました。
タデジ

1
@JedatKinports:いけない--post-hook--renew-hookなるservice apache2 restart代わりにservice restart apache2
ポールラタッツィ

1
コマンドはservice apache2 restartです!これservice restart apache2は正しいコマンド/サービスではありません。
-GTodorov

1

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

/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

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

certbotバージョン0.21.1の時点で、 非推奨フラグを使用していないことを確認する--renew-hookためにフラグが変更され--deploy-hookています。

certbot renew --deploy-hook "systemctl restart myservice"

0

EFF certbotガイドによると

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

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.