Infra Ops Hub

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 への移行を検討。

関連ツール・比較・ガイド

SSL / Domain

このテーマの関連ページ