\ お問い合わせはこちら! /

【Docker + nginx-proxy】Let’s Encrypt 証明書が何度も発行される原因と対策

ところが、構成ミスやDNS未設定などにより証明書の自動発行がループしてしまい、Let’s Encrypt の レートリミット(制限)に引っかかることがあります。

今回は実際に起こったケースをもとに、その原因と対応策を解説します。

レートリミットに引っかかる原因

まずは原因から解説します。

nginx-proxyの構成

以下の構成を前提とします。

services:
  nginx-proxy:
    image: jwilder/nginx-proxy:alpine
    container_name: nginx-proxy
    restart: always
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - /var/run/docker.sock:/tmp/docker.sock:ro
      - ./certs:/etc/nginx/certs:rw
      - ./acme:/etc/acme.sh
      - ./vhost.d:/etc/nginx/vhost.d
      - ./html:/usr/share/nginx/html
    networks:
      - proxy

  letsencrypt:
    image: jrcs/letsencrypt-nginx-proxy-companion
    container_name: nginx-letsencrypt
    restart: always
    environment:
      - NGINX_PROXY_CONTAINER=nginx-proxy
      - DEFAULT_EMAIL=tatuya.220@outlook.jp
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock:ro
      - ./certs:/etc/nginx/certs:rw
      - ./acme:/etc/acme.sh
      - ./vhost.d:/etc/nginx/vhost.d
      - ./html:/usr/share/nginx/html
    depends_on:
      - nginx-proxy
    networks:
      - proxy

networks:
  proxy:
    external: true

ボリューム設定は次のようになっているので、証明書やacmeの作業ファイルは永続化されています。

  • ./certs: 証明書(.crt, .key)を保存
  • ./acme: ACMEアカウント、チャレンジ一時ファイル
  • ./vhost.d, ./html: HTTP-01 チャレンジ対応、vhost個別設定

つまり、再起動しても証明書が消える構成ではなく、問題なしです。

証明書が何度も発行される原因

大きく二つの原因があるようです。

1. DNSが未設定(NXDOMAIN)

ログに以下のようなエラーが出ている場合です。

NXDOMAIN looking up A for api.example.com

この場合はapi.example.comに Aレコードが無いため、Let’s Encrypt の認証が通らずに再試行が続きます。

対策としては、VPSの管理画面などでAレコードをサーバーに向ける必要があります。

2. 短期間で証明書の再発行が続く

Let’s Encrypt では同一ドメインに対して 7日間で5回まで の発行制限があります。

Error creating new order. Le_OrderFinalize not found.
detail: "too many certificates (5) already issued for this exact set of identifiers..."
status: 429

上記のようなエラーが出たら、しばらく時間を置く必要があります。

レートリミットに引っかかってしまったら?

レートリミットに引っかかった場合の対処法をご説明します。

次のリトライ可能時刻を確認する

docker logsコマンドを実行して、次のようなログを探しましょう。

"detail": "too many certificates (5) already issued for this exact set of identifiers in the last 168h0m0s, retry after 2025-07-16 20:47:21 UTC"

上記の場合だと、次回の証明書発行は 2025年7月16日 20:47:21 UTC(日本時間 7月17日 5:47頃)以降に可能と分かります。

次のリトライ可能時刻まで コンテナを停止して待機します。

docker compose stop nginx-letsencrypt

DNSレコードが向いているかを調べる

DNSレコードがサーバーに向いていないと、証明書取得は失敗します。

dig コマンドでDNSを確認できます。

dig +short api.example.com

返答が無い場合(空欄)はDNSが未設定なので、VPS管理画面などで設定が必要です。

また、設定してから浸透まで少し時間がかかります。設定後しばらく経ってからdigコマンドで確認するのが確実です。

おわりに

Let’s Encrypt は無料かつ強力なSSL証明書取得システムですが、自動化構成では想定外の再発行ループが起きがちです。

DNS設定やボリュームの永続化、ステージング環境の活用などを意識することで、安全に運用できるようになります。

最後に注意点をまとめます。

対策内容
✅ DNS設定の事前確認各サブドメインに正しくAレコードを設定する
✅ リトライ制御レートリミットにかかったら letsencrypt コンテナを一時停止
✅ 証明書の再利用./certs などの永続ボリュームを削除しないこと

迂回ルートとしてステージング環境を使う方法もありますが、今回は割愛しました。

またの機会にご説明できればと思います。

この記事が気に入ったら
フォローしてね!

シェア・記事の保存はこちら!

この記事を書いた人

CFXLOGのアバター CFXLOG プログラマ

メイン言語はPython。本ブログでは、実務や普段の学習で学んだことをアウトプットしています。
基本情報技術者試験合格者。

コメント

コメントする

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)