はじめに
SSL証明書の有効期間は年々短くなっており、無料で取得でき自動更新にも対応しているLet's Encryptへの切り替えを検討するシステムが増えてきました。そこで改めてLet's Encryptとcertbotについて学び直します。
Let's Encryptとは
Let's Encrypt は無料の TLS 証明書を提供する認証局です。
certbot
certbotとはLet's Encryptの証明書を自動更新するためのOSSです。
証明書の期限が残り3分の1未満になった時点で自動更新してくれます。
(certbot 4.0.0より前のバージョンでは、更新期限は30日に固定されていたとのことです)
導入手順はこちらから確認できます。
Linuxの場合、基本的にはsnap(certbotの箱ごと)でのインストールが推奨されます。
証明書の有効期限が切れる前に自動的に更新する cron ジョブまたは systemd タイマーが含まれているため、別途自動更新の設定は必要ありません。
更新成功後の指示
Dockerで構築したシステムの場合、証明書を取得後、システムへ反映するためにコンテナの再起動が必要になることもあるかもしれません。
その場合、certbotのrenew hookで設定することができます。
| フック | 実行タイミング | 主な用途 |
|---|---|---|
--pre-hook |
更新を試みる前に毎回実行 | 証明書取得の妨げになるWebサーバーの停止など |
--deploy-hook |
証明書の発行・更新に成功した場合のみ実行 | コンテナ再起動など、成功時だけ行いたい処理 |
--post-hook |
更新を試みたあと、成否にかかわらず毎回実行 | 停止したWebサーバーの再起動、通知処理など |
certbot renewはcronやsystemdタイマーから引数なしで自動実行されることが多いため、コマンドラインでフックを都度指定するより、以下のディレクトリにスクリプトを置いておく方式が実用的です。ここに置いた実行可能なスクリプトは、certbot renew実行時に自動的に読み込まれます。
/etc/letsencrypt/renewal-hooks/
├── pre/ ← 更新前に実行
├── deploy/ ← 更新に成功した場合のみ実行
└── post/ ← 成否にかかわらず、更新を試みるたびに実行
更新失敗時の指示
更新が失敗した際、そのまま放置すると証明書の期限切れにつながりかねません。そのため、失敗時にはSlackなどの通知先に知らせておきたいところです。
以前はLet's Encrypt自身が証明書の期限切れが近いドメインに通知メールを送ってくれていましたが、このサービスは2025年6月に終了しています。そのため、更新失敗時の通知は自前で用意しておく必要があります。
deploy用スクリプトとpost用スクリプトを分けておくことで、「成功時だけ動かしたい処理」と「成否を毎回チェックしたい処理」の役割がきれいに分離できます。
Let's Encryptを使わない事例
• Let's Encryptが発行するのはDV(ドメイン認証)のみで、OV(組織認証)・EV(拡張認証)は提供していません。企業の実在性を証明書レベルで示したい場合は、有料の証明書が必要になります。
• ワイルドカード証明書自体はLet's EncryptでもDNS-01認証を使えば取得可能です。「ワイルドカードが必要だから有料」という判断は誤りになりやすいので注意が必要です。
• 従来は有効期間の長さ(1〜2年)も有料側のメリットでしたが、CA/Browser Forumの決定により、業界全体で証明書の有効期間が2029年までに段階的に最短47日まで短縮される予定です。このメリットは今後薄れていく見込みです。
おわりに
この記事を書こうと考えたきっかけは、特に設定せずcertbotでLet's Encryptが自動更新されることを知らず、
別途で更新スクリプトを作成し、想定外に更新指示が重複してしまい不具合が発生したことでした。
certbotの機能を適切に活用し、便利なLet's Encryptライフを広げていこうと思います。
参照