Let’s Encryptの証明書更新を自動で行う

Webサイト、SSLにしてますか?我々のように個人で運営しているブログなどでは有料の証明書を導入するのが費用的に難しいので、Let’s Encryptはありがたい存在です。しかしLet’s Encryptの証明書は有効期限が発行から90日と短いので、頻繁に更新しなければなりません。忘れるといけないので自動化しておきました。

Webでよくある説明では –force-renewal を指定するようなのがありますが、うちはそんなことしていません。こんな感じです。

$ more /etc/cron.weekly/lets-encrypt.sh 
#!/bin/bash
cd /usr/local/src/certbot/
./certbot-auto renew

マイルドにrenewしています。そうすると証明書の有効期限が近づいてきた時に勝手に判断して更新してくれるようです。必要なときにしか認証局のリソースを使わない、エコですね。

このスクリプロはcron.weeklyに置いてあるので、基本的に週一で実行されます。証明書を更新すると判断する時期が一週間よりも短いと問題がありますが、そんなことはないようなので大丈夫だと思います。最近では28日ぐらいを切ったところで更新されました。

参考までに、これがMuninで監視している証明書の有効期限です。更新後すぐのグラフです。

設定方法はこっちね。
MuninでSSL証明書の残日数を監視 | 曖昧/旬.

certbotが動いて、証明書が更新不要と判断したときは、以下のようなメッセージが出力されます。

 The following certs are not due for renewal yet:
   /etc/letsencrypt/live/imys.la-0001/fullchain.pem (skipped)
 No renewals were attempted.

最後の一行は、更新対象がないよ、ってやつだね。

そして更新が走って、更新が成功するとこんなのが出ます。

 Congratulations, all renewals succeeded. The following certs have been renewed:
   /etc/letsencrypt/live/imys.la-0001/fullchain.pem (success)

成功したよ、と。こんなのも先に出てるな。

 new certificate deployed with reload of apache server; fullchain is
 /etc/letsencrypt/live/imys.la-0001/fullchain.pem

新しい証明書を発行したからApacheサービスを再読込しろよ、と。なんか色々やってるうちにサーバ再起動とかやったりしてたかも。次回からは意識して再起動した方がいいな。サービスのrestartでいいね。

ちなみに、cron.*** に置いたスクリプトは、名前の通りで定期的に実行されます。実行タイミングはシステムによるだろうし、調整できるはずです。再起動とか停止期間とかがあると、起動時に走っちゃうかもしれないので、大事なスクリプトは気をつけましょう。また出力内容はメールで飛ばしてくれるので、とりあえず色々出力しておけばメールを見て確認できます。メールの転送を設定しておけば、ですけどね。

そんな感じで自動化完了。いい感じで動いています。