check_mpic.sh は、指定されたFQDN(完全修飾ドメイン名)に対して、証明書発行に必要となる CAAレコード と関連する CNAMEレコード の設定状況をDNSを遡りながら確認し、さらに複数のパブリックDNSからの名前解決結果を照合することで MPIC (Multi-Perspective Issuance Corroboration) の要件を満たしているかを自動的にチェックするシェルスクリプトです。
各種SSL/TLSサーバー証明書の発行に際して、CAAレコードの不備や意図しないCNAMEチェーン、GeoIP制限やスプリットホライズン等に起因するMPIC検証エラー(海外からの名前解決失敗など)のトラブルシューティング・事前確認に役立ちます。
-
基本のレコード確認 対象のFQDNについて、
CAAレコードとCNAMEレコードを引き、その内容を出力します。- CAAレコードが見つからない場合は「CAAレコードがありません」と出力されます。
- CNAMEレコードが見つからない場合は「CNAMEレコードがありません」と出力されます。
-
CNAMEの自動追跡(チェーン解決) 対象のFQDNにCNAMEレコードが設定されている場合、その**参照先(CNAME先のFQDN)**に対しても自動的にCAAとCNAMEの確認を行います。 この処理は、最終的にCNAMEの参照先がなくなる(Aレコード等の実体ドメインに落ち着く)まで繰り返されます。 (※ 無限ループを防ぐため、一度確認したFQDNに再度アクセスした場合はループを自動で検知し追跡を停止します)
-
名前解決の可否判定
digコマンドにおいてNXDOMAIN(ドメインが存在しない)またはSERVFAIL(DNSサーバー側のエラー)のステータスが返ってきた場合、指定されたドメインは「名前解決ができません。DNSの設定を修正しないと証明書発行が抑制されます。また、エラー338の原因になる可能性があります。」というエラーを出力し、それ以上の確認を中断します。 -
特定CA(認証局)の許可チェック 取得したCAAレコードの内容に
secomtrust.netという文字列が含まれていない場合、「CAAレコードが存在しますが、 secomtrust.net が含まれません。発行が抑制され、エラー338の原因になる可能性があります。」という警告を出力し、発行元認証局の制限にひっかかる可能性を示唆します。 -
eTLD+1への遡り(Public Suffix List連携) 各種レコードの有無にかかわらず、サブドメイン(例:
sub.example.co.jp)が指定された場合、そのドメインの所属するゾーンの頂点・ベースドメイン(eTLD+1 相当、例:example.co.jp)に到達するまで、ドメインラベルを1つずつ削りながら親ドメイン側へと遡って確認を繰り返します。- ※ 遡りの終点(eTLD+1)を正確に判定するため、初回実行時に Mozilla の Public Suffix List (
public_suffix_list.dat) を公式から自動でダウンロードします。
- ※ 遡りの終点(eTLD+1)を正確に判定するため、初回実行時に Mozilla の Public Suffix List (
-
代替DNSサーバー(8.8.8.8 / 1.1.1.1)での確認とMPIC判定 ローカル(デフォルト)のDNSサーバーでの一連の確認(遡り処理含む)が完了した後、指定された最初の「ターゲットFQDN」に対してのみ、以下のパブリックDNSサーバーを用いた検証を再度単独で実行します。
- Google Public DNS (
8.8.8.8) - Cloudflare DNS (
1.1.1.1) これにより、DNSキャッシュの浸透状況や、GeoIP制限(海外からの名前解決失敗)、スプリットホライズン(内部/外部でのレコード不一致)などを検出し、MPICの要件を満たすかどうかを自動判定します。
- Google Public DNS (
- OS: Linux / macOS などのUNIX系OS
- 必須コマンド:
bash,dig(bind-utils/dnsutils),curl,awk,grep,sed - ネットワーク接続: DNSクエリ(ポート53)、および初回のみPSLダウンロードのためのインターネット接続(HTTPS)
ドメインは単純に「最後のドットから数個」だけで頂点を判断することができません(例: .com は1つ前が頂点だが、.co.jp や .ac.jp は2つ前が頂点になるため)。
本スクリプトは正確な判定を行うため、スクリプトと同じディレクトリに public_suffix_list.dat というリストファイルを要求します。存在しない場合は curl で自動的にダウンロードして使用します。
ターミナルを開き、スクリプトに対して実行権限を付与します。
chmod +x check_mpic.sh引数として、確認したい対象のFQDNを指定して実行します。
./check_mpic.sh <FQDN>./check_mpic.sh certs.nii.ac.jp実行すると、以下のような形式で情報が順に出力されます。実行過程でどのように判定を行っているかがログとして表示されます。
--> Public Suffix Listを元に算出された頂点ドメイン(eTLD+1): nii.ac.jp
==================================================
対象FQDNと上位ドメイン(デフォルトDNS)の確認
==================================================
=== [certs.nii.ac.jp] の確認 ===
CAAレコードがありません (certs.nii.ac.jp)
CNAMEレコードがありません (certs.nii.ac.jp)
--- 上位FQDN (nii.ac.jp) へ遡ります ---
=== [nii.ac.jp] の確認 ===
CAAレコードがありません (nii.ac.jp)
CNAMEレコードがありません (nii.ac.jp)
--> 頂点ドメイン(eTLD+1: nii.ac.jp) に到達しました。上位への遡りを終了します。
==================================================
指定DNSでの確認 (8.8.8.8)
==================================================
=== [certs.nii.ac.jp] をDNSサーバ 8.8.8.8 で確認 ===
CAAレコードがありません (certs.nii.ac.jp)
CNAMEレコードがありません (certs.nii.ac.jp)
==================================================
指定DNSでの確認 (1.1.1.1)
==================================================
=== [certs.nii.ac.jp] をDNSサーバ 1.1.1.1 で確認 ===
CAAレコードがありません (certs.nii.ac.jp)
CNAMEレコードがありません (certs.nii.ac.jp)
==================================================
【MPIC判定結果】 (Multi-Perspective Issuance Corroboration)
==================================================
判定結果: ✅ パスする可能性が高いです。
複数のDNS拠点からの応答(ステータス、CAA、CNAME)が一致しています。
エラーや警告が出た場合は、DNS側の設定(CAAレコードの追加修正やCNAMEの記述ミス)を見直してください。