2026年6月15日

2026年6月15日

CAAレコードの重複を解消する手順|同じ名前の複数行・階層・DNSサービス間の食い違いを整理する

CAAレコードの「重複」は、多くの場合それ自体がエラーなのではなく、同じ名前に並んだ複数の行、親子の名前に分かれた設定、複数のDNSサービスの食い違いが原因で、どのCAが許可されているのか分かりにくくなっている状態です。解消するには、今の応答を全部書き出し、最終的に許可したいCAの一覧を決め、それを1か所にまとめる順で進めます。この記事では、重複のパターンの見分け方と、証明書の発行を止めずに整理する手順を説明します。

「重複」に見える4つのパターン

最初に、手元の状態がどれに当たるかを見分けます。対処が違うためです。

1. 同じ名前に複数のCAA行がある

example.com. 3600 IN CAA 0 issue "letsencrypt.org"
example.com. 3600 IN CAA 0 issue "pki.goog"
example.com. 3600 IN CAA 0 issue ";"

同じ名前・同じ型のレコードは1つの組(RRset)として扱われ、CAはその中のどれか1行が自分を許可していれば発行できます。上の例では Let's Encrypt も Google Trust Services も発行でき、";"(許可するCAなし)の行は他の行を打ち消しません。「全面禁止のつもりで ";" を足したのに発行される」「1行足したら他のCAが使えなくなると思っていた」という誤解の多くはここから来ます。複数行があること自体は正常で、整理の目的は「意図と合っているか」を確かめることです。

まったく同じ内容の行が2つ見える場合、DNSの仕組み上、同一のレコードは1つにまとめられるのが普通です。管理画面に2行表示されているのに dig では1行しか返らないなら、管理画面側の表示上の重複と考えられます。

2. 親と子の名前の両方にCAAがある

example.com と www.example.com の両方にCAAがあると、www の証明書には www 側だけが使われます。CAAは名前から親へさかのぼって最初に見つかった組だけを使うため、親子の設定は合算されません。親で3つのCAを許可していても、子に1つしか書かなければ、子の名前で使えるのは1つだけです。

3. DNSサービスやサーバーによって値が違う

権威DNSを複数のサービスで運用している場合や、セカンダリDNSへの転送が止まっている場合、問い合わせ先によって別のCAAが返ります。CAがどのサーバーに問い合わせるかは選べないため、発行が成功したり失敗したりします。

4. DNSサービスが自動でCAAを足している

CDNやDNSサービスの中には、自社の証明書発行に必要なCAAを自動で追加するものがあります。たとえば Cloudflare は、利用者がCAAを設定すると、自社の証明書に使うCAの行を自動で加える仕組みを案内しています(2026年10月現在。対象のCAや表示のされ方は変わることがあります)。管理画面に無い行が dig に出るときは、このパターンを疑います。自動で足された行を消すと、サービス側の証明書の更新が止まるおそれがあるため、各サービスのドキュメントを確認してから判断します。

ステップ1:現状をすべて書き出す

証明書に載せている名前(example.com、www.example.com、ワイルドカード、サブドメイン)ごとに、権威DNSへ直接問い合わせます。

for name in example.com www.example.com shop.example.com; do
  for ns in $(dig +short NS example.com); do
    echo "== $name @ $ns"
    dig @"$ns" +norecurse +noall +answer "$name" CAA
  done
done

結果は表計算などに「名前・サーバー・タグ・値」の形で写しておくと、比較が楽になります。あわせて、www などがCNAMEになっていないかも確認します。CNAMEの名前のCAAはCNAMEの先で決まるため、自分のゾーンでは整理できない場合があります。

次に、いま実際に使っている証明書の発行元を確かめます。

echo | openssl s_client -connect www.example.com:443 -servername www.example.com 2>/dev/null \
  | openssl x509 -noout -issuer

サーバーが複数あるなら、それぞれで確認します。メインサイトは Let's Encrypt、ロードバランサーはクラウドの証明書サービス、というように、名前によって発行元が違うことはよくあります。

ステップ2:許可したいCAの一覧を決める

書き出した内容から、名前ごとに「今使っているCA」「近く使う予定のCA」を決めます。使っていないCAの行は、残しても発行には害がありませんが、許可範囲が広いままになるので整理の対象です。

決めるときの目安は次のとおりです。

  • 今の証明書の発行元と、自動更新で使うCAは残す
  • CDNやロードバランサーなど、サービス側で証明書を出しているCAは残す(識別子は各サービスの資料で確認)
  • 乗り換えが済んで不要になったCAは削除候補にする
  • ワイルドカードを使うなら issuewild の扱いも決める(issuewild があると、ワイルドカードにはそちらが優先される)

方針として、CAAはできるだけ親(example.com)に集め、子の名前には置かないのが管理しやすい形です。子に別の許可が本当に必要なときだけ、子に「必要なCAをすべて」書きます。

ステップ3:追加してから削除する順で直す

整理の途中で発行可能なCAがゼロになる時間を作らないよう、次の順で変更します。作業前に、DNSの管理画面のエクスポートやゾーンファイルのコピーでバックアップを取っておきます。

  1. CAAのTTLを確認し、長ければ短くしておく(変更後の反映待ちを短くするため)
  2. 親の名前に、決めた一覧どおりの issue / issuewild / iodef をそろえる
  3. 子の名前にあるCAAのうち、親と同じ内容のものを削除する
  4. 権威DNSサーバーごとに、ステップ1と同じコマンドで応答が一致したかを確認する
  5. 不要になったCAの行を削除する
  6. 証明書の更新テストを行う

BINDなどゾーンファイルで管理している場合は、編集後にSOAのシリアル番号を上げ、構文を確認してから読み込みます。

named-checkzone example.com /var/named/example.com.zone
sudo rndc reload example.com

複数のDNSサービスで運用している場合は、すべてのサービスに同じ変更を入れます。片方だけ直すとパターン3の状態が続きます。

ステップ4:発行できるかを確かめる

最後に、実際のCAで判定させます。Let's Encrypt なら、certbot の --dry-run でステージング環境に発行を試せます。

sudo certbot renew --dry-run

クラウドの証明書サービスやCDNの証明書は、管理画面で証明書の状態や次回更新の予定を確認し、更新時期が近ければ注意して見ておきます。CAAの確認は発行の直前にも行われるため、整理した直後の数日は、更新の通知やログに気を配ってください。

つまずきやすい点

  • **";" を足しても禁止にならない**: 同じ組に他の issue 行があれば、そちらが有効です。発行を全面的に止めたいなら、その名前の issue を ";" の1行だけにします。
  • 管理画面とdigの結果が合わない: 自動追加の行か、別のDNSサービスの応答を見ている可能性があります。dig +short NS example.com で、実際に委任されているネームサーバーを先に確かめます。
  • 子のCAAを消したら発行できなくなった: 親のCAAに、その子で使うCAが入っていなかった状態です。親に追加します。
  • 識別子の違い: 同じ会社でも、ブランドや製品によって識別子が複数あることがあります。CAの公式ドキュメントで確かめてください。

まとめ

  • 同じ名前の複数行は「どれか1行が許可すれば発行できる」組として扱われ、それ自体は正常
  • 親子の名前のCAAは合算されず、近いほうだけが使われる
  • 権威DNSサーバーごと・名前ごとに応答を書き出し、今の証明書の発行元と照らし合わせる
  • CAAはなるべく親に集め、追加してから削除する順で直す
  • 最後に certbot --dry-run などで発行を試し、更新時期のログを見守る

お気軽にご相談ください

お見積りへ お問い合わせへ
▲