2026年6月19日
2026年6月19日
Certbotで Let’s Encrypt SSL を自動更新
はじめに
HTTPSは今やWebサイトの最低限の要件となり、Google Chromeなど主要ブラウザはHTTP接続を警告表示する仕様に切り替わって久しいです。Let's Encryptは無料でDV証明書を発行してくれる認証局で、Certbotという公式クライアントを使うことで取得から更新まで完全に自動化できます。
ただしLet's Encrypt証明書の有効期間は90日と短く、手動更新では必ず期限切れ事故を起こします。Certbotはsystemdタイマー(またはcron)で定期実行することを前提に設計されており、適切に設定すれば管理者は何もしなくても永続的に有効な証明書を維持できます。
本記事ではNginx環境を例に、証明書取得から自動更新、更新前後のフックスクリプトまで一通り設定する方法を解説します。
症状・背景
- 証明書の期限切れでサイトに「保護されていない通信」警告が表示された
- 手動更新を運用ルールにしていたら担当者の異動で更新漏れが発生した
- 複数ドメインの証明書を一元的に管理したい
- 更新時にNginxやApacheを自動的にreloadさせたい
手順・設定方法
ステップ1: Certbotのインストール
snapまたはaptで導入します。
# Ubuntu 22.04の場合(snapが推奨)
sudo snap install --classic certbot
# certbotコマンドへのシンボリックリンク
sudo ln -sf /snap/bin/certbot /usr/bin/certbot
# バージョン確認
certbot --version
# プラグイン一覧を確認
certbot plugins
ステップ2: 証明書を取得
Nginxプラグインで自動設定します。
# Nginx設定込みで証明書を取得・適用
sudo certbot --nginx -d example.com -d www.example.com \
--email admin@example.com --agree-tos --no-eff-email
# 取得済み証明書を一覧表示
sudo certbot certificates
# 証明書ファイルの実体を確認
sudo ls -la /etc/letsencrypt/live/example.com/
# 期限を確認
sudo openssl x509 -in /etc/letsencrypt/live/example.com/cert.pem -noout -dates
ステップ3: 自動更新タイマーの確認
Certbotはインストール時にsystemdタイマーを自動登録します。
# certbot.timerが有効か確認
sudo systemctl status certbot.timer
# 次回実行予定を確認
sudo systemctl list-timers | grep certbot
# dry-runで更新動作をテスト(実際には更新しない)
sudo certbot renew --dry-run
# 必要に応じて手動で更新実行
sudo certbot renew
ステップ4: 更新フックでWebサーバーをreload
証明書更新後に自動でNginxを再読込します。
# deployフック用ディレクトリを確認
sudo ls /etc/letsencrypt/renewal-hooks/deploy/
# Nginxリロード用フックを作成
sudo tee /etc/letsencrypt/renewal-hooks/deploy/reload-nginx.sh > /dev/null <<'EOF'
#!/bin/bash
systemctl reload nginx
EOF
# 実行権限を付与
sudo chmod +x /etc/letsencrypt/renewal-hooks/deploy/reload-nginx.sh
# 更新ログを確認
sudo tail -50 /var/log/letsencrypt/letsencrypt.log
注意事項
- 80番ポートが外部から到達可能でないとHTTP-01チャレンジが失敗する
- レート制限(同一登録ドメインで週20件など)があるため
--dry-runでテストする - DNS-01チャレンジを使うとワイルドカード証明書を取得できる
- 証明書ファイルのパスは
/etc/letsencrypt/live/配下のシンボリックリンクを参照する(実体はarchive/)
まとめ
1. Certbotインストール はsnap版が公式推奨
2. --nginx / --apache プラグイン で設定込みワンコマンド発行
3. systemd timer が標準で有効化され完全自動更新
4. renew --dry-run で運用前に動作テスト
5. deployフック でreload自動化と完全無停止運用
関連記事: