Let’s Encrypt の証明書の更新を自動化する手順 (cron)

投稿者 : OSCA

関東地方の美しい夜景を観にいこう。 夜景サイト「夜景散歩」で夜景スポットを検索

 無料で SSL/TLS 証明書を発行できる Let’s Encrypt の証明書有効期限は3ヶ月間です。 有効期限が近づくと Let’s Encrypt からその旨をお知らせするメールが届くわけですが、毎回手作業で certbot renew コマンドを実行するのは面倒です。 ここでは、Let’s Encrypt の証明書の更新を cron で自動化する手順について解説します。

手順の概要

 どんな Linux ディストリビューションでも、指定したコマンドを定期的に自動で実行してくれる cron がインストールされています。 この cron を利用して、Let’s Encrypt の証明書を更新してくれる certbot renew コマンドを定期的に実行するようにしてあげれば良いでしょう。

cron を設定する前に

 ここから具体的に cron に設定するコマンドを解説していきますが、その前に知っておくと便利なコマンドがあります。 certbot renew コマンドには、シミュレーション実行する –dry-run オプションがあります。 このオプションをつけておくと、実際には証明書の更新を行いません、シミュレーションをするだけになります。 ですので、cron に設定するコマンドが定まるまでは、この –dry-run オプションをつけながら検証することをおすすめします。

certbot renew --dry-run

cron のコマンドを構築する

 さて、それでは cron に証明書の更新コマンドを設定していきましょう。 なお、ここでは少しずつ機能を追加していきますので、一度この記事を一通り目を通してご自身に必要なコマンドを利用していただくか、–dry-run オプションをつけながらコマンドを実行してください。

 また、証明書の更新には root 権限が必要ですので、root ユーザーの cron に設定するようにしてください。

$ crontab -u root -e

最小限のコマンド

 まずは最小限のコマンドを考えてみましょう。 cron に次のように設定すると、定期的に自動で証明書を更新してくれます。 ここでは例として、毎月1日の深夜4:00に証明書を更新するようにします。

00 04 01 * * certbot renew

WEBサーバーも再起動させる

 Let’s Encrypt で発行したSSL/TLS証明書を Apache httpd や Nginx などのWEBサーバーに設定している場合が多いでしょう。 その場合、SSL/TLS証明書を更新したあとにWEBサーバーを再起動する必要があります。 この場合は、次のようにコマンドを設定するのが良いでしょう。

# Apache httpd を利用している場合の例 (CentOS 6 の場合)
00 04 01 * * certbot renew && service httpd restart

# Apache httpd を利用している場合の例 (CentOS 7 の場合)
00 04 01 * * certbot renew && systemctl restart httpd

# Nginx を利用している場合の例 (CentOS 7 の場合)
00 04 01 * * certbot renew && systemctl restart nginx

証明書の更新結果をメールで受け取る

 さて、ここまでのコマンドで証明書の更新は実現できますが、証明書の更新結果をメールで受け取れると便利でしょう。 次のように mail コマンドに結果を食わせることで、結果をメールで受け取ることができます。 ここでは例として、タイトル「Let’s Encrypt update information」というメールを「myname@mydomain.com」に送ります。

00 04 01 * * certbot renew --dry-run 2>&1 | mail -s "Let's Encrypt update information" myname@mydomain.com && systemctl restart httpd

 これで証明書の更新し忘れなどを防げる自動化の仕組みが完成です。 ぜひご利用のサーバーに設定してみてください。

おわりに

 本稿では Let’s Encrypt の証明書を自動的に更新する cron 設定について解説しました。 皆様のお仕事のお役にたてれば幸いです。

著者 : OSCA

OSCA

Java, PHP 系のWEBエンジニア。 WEBエンジニア向けコミュニティ「WEBエンジニア勉強会」を主催。
個人として何か一つでも世の中の多くの人に使ってもらえるものを作ろうと日々奮闘中。
@engineer_osca