ACME(証明書の自動更新)手順書

DNS 設定ガイド(HTTP-01 / DNS-01 共通)

2025年10月14日

DNS 設定ガイド(HTTP-01 / DNS-01 共通)

要点(まずここだけ)

  • HTTP-01 を使うなら、発行対象の FQDN が 発行を実行するサーバに向くように A/AAAA を設定し、80/TCP を外部公開します(CDN/リバプロ経由の場合はチャレンジを素通し)。
  • DNS-01 を使うなら、FQDNごとに TXT レコード _acme-challenge.<FQDN> を作成(ワイルドカード *.example.com_acme-challenge.example.com)。
  • 伝播チェックは dig / nslookup権威サーバ以外(8.8.8.8 など)を引いて確認。
  • CAA をカスタムで入れている場合のみ、使用する CA を許可する必要があります(CAA 未設定なら何も不要)。

A. HTTP-01 を使う場合(もっとも簡単)

1) A/AAAA レコードを発行サーバへ向ける

  • 例:example.com → 203.0.113.10(A)/2001:db8::10(AAAA)
  • www.example.comexample.comCNAME 推奨(管理が楽)。
  • 発行は対象 FQDN で行う必要があります。別ホストに向けたままだと HTTP-01 は失敗します。

2) CDN / リバースプロキシを使っている場合

  • Cloudflare 等の CDN を使うなら、発行中は「DNS only(灰色雲)」に切替えるか、下記のパスを キャッシュ無効 & オリジン直通にします:
    /.well-known/acme-challenge/
  • NGINX リバプロの例(素通し設定):
location ^~ /.well-known/acme-challenge/ {
    proxy_pass http://127.0.0.1:8080;   # Webroot/アプリ側に転送
    proxy_set_header Host $host;
    add_header Cache-Control "no-store";
}

3) よくあるつまずき

  • 80 番ポートが閉じている/別サービスが占有。
  • WAF/Rewrite が /.well-known/acme-challenge/ を 301/302 で別ドメインへ飛ばす(NG)。
  • CDN がチャレンジレスポンスを キャッシュしてしまい更新に追従しない。

B. DNS-01 を使う場合(ワイルドカード/背後が複雑なとき)

1) 手動で TXT を作る(まずは試運用に最適)

  1. Certbot を 手動DNS で実行し、表示された値を控えます:
certbot certonly \
  --manual --preferred-challenges dns \
  --server 管理画面で取得したACMEサーバURL \
  -d example.com -d *.example.com \
  -m admin@example.com --agree-tos --no-eff-email \
  --manual-public-ip-logging-ok
# 画面の指示に従い、TXT を作成して Enter
  1. DNS に TXT を追加:_acme-challenge.example.com"(Certbot が表示した値)"
  2. 伝播チェック(どこからも見えること):
dig +short TXT _acme-challenge.example.com @8.8.8.8
nslookup -type=TXT _acme-challenge.example.com 1.1.1.1
  • ワイルドカード *.example.com同じホスト名_acme-challenge.example.com)。
  • 複数 SAN を同時に発行する場合、複数の TXT が必要になることがあります(値を全部残す)。
  • TTL は 60〜300 秒程度が運用しやすいです。

2) 自動化(API プラグイン推奨)

  • Cloudflare:
sudo apt install -y python3-certbot-dns-cloudflare
cat > ~/.secrets/cf.ini <<'EOF'
dns_cloudflare_api_token = <CF_API_TOKEN>
EOF
chmod 600 ~/.secrets/cf.ini

certbot certonly \
  --dns-cloudflare --dns-cloudflare-credentials ~/.secrets/cf.ini \
  --server 管理画面で取得したACMEサーバURL \
  -d example.com -d *.example.com
  • AWS Route53:
sudo apt install -y python3-certbot-dns-route53
# 実行環境に適切な IAM 権限(route53:ChangeResourceRecordSets 等)を付与
certbot certonly \
  --dns-route53 \
  --server 管理画面で取得したACMEサーバURL \
  -d example.com -d *.example.com

3) よくあるつまずき

  • TXT 値の余計な引用符/スペース(コピペ時に混入)。
  • サブドメインが別ゾーンに委任されていて、親側にだけ追加している(無効)。
  • レコード名の打ち間違い:_acme-challenge の前にドットを入れてしまう等。

C. CAA レコード(任意・設定している場合のみ)

CAA を 独自に運用している場合は、使用する認証局(CA)を許可してください。CAA を設定していない場合は、この作業は不要です。

  • 例:example.com. IN CAA 0 issue "ca.example"
  • ワイルドカードを発行する場合は issuewild を使います。
  • CAA を誤設定すると 認証不可 になり発行が失敗します。不明な場合は CAA を一旦削除して検証してください。
  • 参考リンク:CAAレコードの設定例

D. ヘルスチェックと運用小技

  • 発行直前に FQDN の解決先を確認:dig +short A example.com / AAAA
  • HTTP-01 の疎通確認:curl -I http://example.com/.well-known/acme-challenge/test(200/404 が返るか、CDN がリダイレクト地獄になっていないか)
  • DNS-01 の伝播観測:8.8.8.8 / 1.1.1.1 / 9.9.9.9 を使い分けて確認。
  • TTL は短め(60〜300)にしておくとトラブル時の復旧が早い。
  • 自動更新(renew)は 深夜帯に実行し、deploy-hook でサービスを軽くリロード。

よく読まれている質問