Let's Encrypt の更新が失敗した時のデバッグ手順
最終更新: 2026-04-24 · 所要 8 分
結論
- まず certbot renew --dry-run で再現 + 詳細ログ取得
- HTTP-01 challenge が 80 番で受けられない / path 間違いが圧倒的多数
- CDN 前段 (Cloudflare) がある場合は DNS-01 challenge へ切替
- Rate limit (50 certs/week/domain) に当たっている場合は Staging で確認
どういう場面で必要か
certbot の cron / systemd timer が銀色に走っていたはずなのに、/tools/ssl-check で残日数が急に減っている時。
実務で見るポイント
- certbot renew --dry-run --force-renewal で再発行挙動を確認
- /var/log/letsencrypt/letsencrypt.log 最新行で失敗原因を判定
- HTTP-01: acme-challenge へのアクセスが 80 番に届いているか curl -H 'Host: target.com' http://ip/.well-known/acme-challenge/test
- DNS-01: provider API credentials + propagation wait、Cloudflare なら certbot-dns-cloudflare
- Nginx の場合 reload 忘れチェック、certbot --nginx / --webroot の指定
よくある失敗
- Cloudflare Proxy(オレンジ雲)ON + HTTP-01 で 80 番が Cloudflare に吸われて失敗
- certbot --webroot -w /var/www のパスが nginx の root と不一致
- 50 certs/week/domain 制限に到達、--staging で再発行テスト推奨
- expand / --expand 忘れで sub.example.com が取れない
- rate limit エラーを見逃して連続 renew しリセット待ちになる
チェックリスト
- [ ] certbot renew --dry-run 成功
- [ ] /var/log/letsencrypt/letsencrypt.log 確認
- [ ] nginx -t で設定テスト成功
- [ ] systemctl reload nginx or systemctl reload caddy
- [ ] /tools/ssl-check で新証明書の validTo が更新
よくある質問
dry-run は通るのに本番 renew が失敗する
--pre-hook / --post-hook でサーバ停止 → 起動忘れパターンが多いです。フックスクリプトのログも確認してください。
rate limit に到達したら何日待てば良い?
1 週間で解除されます。急ぎの場合は Staging 環境で発行して挙動を確認、または別の ACME CA(ZeroSSL)を検討します。
Cloudflare 経由で HTTP-01 が通らない時は?
DNS-01 challenge + Cloudflare API Token の組み合わせが標準。Cloudflare plugin を導入してください。
certbot の代わりに別ツールは?
acme.sh / lego は軽量で、Caddy はそもそも組み込みです。運用負担を減らしたいなら Caddy への移行を検討。