メンテナンス・トラブルシュート - SSL 無料証明書(Let's Encrypt) - 自動更新


 クラウディア


1. 概要
2. スクリプトの作成
3. cron への登録
4. 自動更新確認
5. 参考サイト

1. 概要

 前ページでうまく更新することまで確認できましたので、今度は、スクリプトを作成して、定期的に実行します。  これで、自動的に更新するようになります。

2. スクリプトの作成

 スクリプト作成。  オプションの意味等は、前ページをご参照ください。  今度は、強制的でなく、証明書に更新が発生しているときのみの更新です。

#!/bin/sh
/usr/local/bin/certbot \
	renew \
	--standalone \
	--pre-hook "/usr/local/etc/rc.d/apache24 stop" \
	--post-hook "/usr/local/etc/rc.d/apache24 start"
 スクリプトの実行結果。

Saving debug log to /var/log/letsencrypt/letsencrypt.log

-------------------------------------------------------------------------------
Processing /ディレクトリ名/letsencrypt/renewal/www.example.com.conf
-------------------------------------------------------------------------------
Cert not yet due for renewal

-------------------------------------------------------------------------------
Processing /ディレクトリ名/letsencrypt/renewal/freebsd.example.com.conf
-------------------------------------------------------------------------------
Cert not yet due for renewal

-------------------------------------------------------------------------------

The following certs are not due for renewal yet:
  /ディレクトリ名/letsencrypt/live/www.example.com/fullchain.pem (skipped)
  /ディレクトリ名/letsencrypt/live/freebsd.example.com/fullchain.pem (skipped)
No renewals were attempted.
No hooks were run.
-------------------------------------------------------------------------------
 うむ、とても満足です。

3. cron への登録

 前項のスクリプトを定期的に実行するように、「cron」へ登録します。  末尾で紹介している、参考サイトには興味深い話が書いてあります。  「『cron』で『--force-renewal』を使用しない」というのは納得です。  というかあたりまえか、更新が発生していないのに更新するのはナンセンスです。  アクセスする時刻をランダムにするというのは、当初納得していましたが・・・。  最近はそうでもない。  負荷を考えるといっても、相手が一体、何台相手にしているの?という話で。  こちらの1台や2台が遠慮したところで、負荷には影響しないと考えます。  「00:00」に動作しても、日本であれば、「UTC」から 9 時間ずれている。  全世界、「00:00」としても、単純計算で48分の1になるわけです。  なので、ディレイはやめました。  それよりも、「cron」の動作を毎日でないようにすべきです。  「Let\'s Encrypt」が、発行する証明書の有効期限は、90日。  残り、30日以内になって、更新確認すると、更新してくれます。  つまり、残り 30日の間に更新しちゃえば、問題ないわけです。  週1回、更新確認するとすれば、30日の間に、4回、更新するチャンスがあります。  じゅうぶん間に合うでしょ。  シェルスクリプト名を「script.sh」として。

0  2  *  *  2  root /path/script.sh
 「root」の直前の数字が、曜日を表していて、0 が日曜日です。  なので、毎週火曜日 02:00 に実行することになります。  02:00 にしたのは、「daily run」「daily security run 」あたりに遠慮しております。  日曜日、月曜日をさけたのは、休みの日は、ログをチェックしたくないからです。  (今は、ハッピーマンデーとかのせいで、月曜日の休みも結構多いのだ)

4. 自動更新確認

 でこれを書いているのが、当初、毎日実行していた時の、2018年2月17日の朝なのです。  2月が28日までしかないせい?なのかわからないのですが。  どうも今朝、動いたようです。  ブラウザから確認すると有効期限が「2018年5月17日」に更新されていることがわかります。

 「cron」からのメールを確認してみます。(一部伏字)


Saving debug log to /var/log/letsencrypt/letsencrypt.log

-------------------------------------------------------------------------------
Processing /usr/local/etc/letsencrypt/renewal/www.example.com.conf
-------------------------------------------------------------------------------
Cert is due for renewal, auto-renewing...
Plugins selected: Authenticator standalone, Installer None
Running pre-hook command: /usr/local/etc/rc.d/apache24 stop
Output from apache24:
Stopping apache24.
Waiting for PIDS: 988.

Renewing an existing certificate
Performing the following challenges:
tls-sni-01 challenge for www.example.com
tls-sni-01 challenge for freebsd.example.com
Waiting for verification...
Cleaning up challenges

-------------------------------------------------------------------------------
new certificate deployed without reload, fullchain is
/usr/local/etc/letsencrypt/・・・
-------------------------------------------------------------------------------

-------------------------------------------------------------------------------
Processing /usr/local/etc/letsencrypt/renewal/・・・
-------------------------------------------------------------------------------
Cert is due for renewal, auto-renewing...
Plugins selected: Authenticator standalone, Installer None
Pre-hook command already run, skipping: /usr/local/etc/rc.d/apache24 stop
Renewing an existing certificate
Performing the following challenges:
tls-sni-01 challenge for freebsd.example.com
Waiting for verification...
Cleaning up challenges

-------------------------------------------------------------------------------
new certificate deployed without reload, fullchain is
/usr/local/etc/letsencrypt/live/freebsd.example.com/fullchain.pem
-------------------------------------------------------------------------------

-------------------------------------------------------------------------------
Processing /usr/local/etc/letsencrypt/renewal/・・・
-------------------------------------------------------------------------------
Cert not yet due for renewal

-------------------------------------------------------------------------------

The following certs are not due for renewal yet:
  /usr/local/etc/letsencrypt/live/ns.example.com/fullchain.pem (skipped)
Congratulations, all renewals succeeded. The following certs have been renewed:
  /usr/local/etc/letsencrypt/live/www.example.com/fullchain.pem (success)
  /usr/local/etc/letsencrypt/live/freebsd.example.com/fullchain.pem (success)
-------------------------------------------------------------------------------
Running post-hook command: /usr/local/etc/rc.d/apache24 start
Output from apache24:
Performing sanity check on apache24 configuration:
Starting apache24.

Error output from apache24:
Syntax OK
 最後の方の「Error output from apache24:」に一瞬びっくりしましたが、「apache24」からのエラーはなかったってことですな。  で、これを読んでいてはたと気づいたのが、ログのローテーションを設定していなかった?  これは、あとでおいおい。

5. 参考サイト

 本ページは、下記のサイトを参考にさせていただきました。
cronでcertbot renewの--force-renewalを使用してはいけない

AbemaTV 無料体験
ネットオークションの相場、統計、価格比較といえばオークファン