この記事は以下のような方を対象としています。
・CronやCrontabが何たるかについて知らない人
・Let's Encryptを用いて初めてSSL証明書を取得しwebサイトを公開したが、有効期限が切れてしまい途方に暮れている人
はじめに
普段私の運営するとあるサイトのSSL証明書をLet's Encryptで取得しているのですが、更新があまりにも面倒くさい!!
今回はLinux標準搭載のCronを用いて更新の自動化を行うことを考えます。
設定
まずは現在の証明書の状態を確認しましょう。
ブラウザで確認することもできますが、今回はサーバー上で確認します。
以下、コマンドの実行には管理者権限が必要です。
certbot certificates
$ sudo certbot certificates
Saving debug log to /var/log/letsencrypt/letsencrypt.log
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Found the following certs:
Certificate Name: example.net
Serial Number: XXXXXXXX
Key Type: ...
Domains: example.net
Expiry Date: 2025-01-01 00:00:00+00:00 (INVALID: EXPIRED)
Certificate Path: ...
Private Key Path: ...
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
どうやら2025年1月1日で期限切れになっているようです。
手動で更新するには、同じくターミナル上で
certbot renew
$ sudo certbot renew
Saving debug log to /var/log/letsencrypt/letsencrypt.log
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Processing /etc/letsencrypt/renewal/example.net.conf
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Renewing an existing certificate for example.net
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Congratulations, all renewals succeeded:
/etc/letsencrypt/live/example.net/fullchain.pem (success)
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
これでcertbotを用いてSSL証明書を更新することができました。
ただ有効期限の3か月が近づくたびにこれを手動で行うのはとても面倒ですよね。
万が一更新を忘れて期限切れのままになってしまったら、ユーザーは二度と戻ってこないかもしれません。
↑トラウマ。
そこでUNIX標準のCronを用いてこの作業を自動化することを考えます。
Cron
Cronは、多くのUNIX環境で標準搭載されているタスクスケジューラです。
分単位で指定した動作を常駐的に行わせることができるので、今回の証明書更新のように定期的に単純な処理を行わせるのに適しています。
設定ファイルを開くには、以下のコマンドを使用します。
crontab -e
cronの設定ファイルはユーザー毎なので、管理者権限のあるユーザーで設定を行ってください。(※証明書の更新に管理者権限が必要なため)
一般ユーザーでsudo権限を用いて行っても良いですが、その場合はvisudoでrequire ttyが設定されていないことを確認してください。(対話モードを必要にしているとスクリプト上でsudoコマンドが使えません)
開いた画面で、以下のように記述します。
0 4 1 * * certbot renew
記法についてですが、
[分] [時] [日] [月] [曜日] [コマンド]
のように記述します。*は任意値を表します。
よって先ほどのコマンドは、
「毎月1日4時0分にcertbot renewを実行」ということになります。
適宜時間の部分はトラフィックの少ない時間帯に変えていただいて大丈夫ですが、Let'sEncryptの仕様上
・期限が30日以上残っている状態で更新できない
・更新にレート制限がある
等の問題から毎月更新くらいのペースが最適かと思います。
最後に、
systemctl start cron
systemctl enable cron #常駐化
で設定完了です!最初の1回だけ正常に更新できているか確認することをお勧めします。