GCPのCertificate Managerでドメインの認証が得られない場合の対処法
自己紹介
はじめまして、sousquared (そうそう) と言います!
普段は、機械学習エンジニアとして働いております。
興味領域は「AI x クリエイティブ」領域です。
X: @sou_squared
Instagram: @sousquared
Github: sousquared
はじめに
こんにちは。今回は、Google Cloud Platform(GCP)のCertificate Managerを使用してSSL/TLS証明書を設定する際に、ドメインの認証が得られず証明書が発行されない問題について、その原因と解決方法をまとめます。
TL;DR:
GCPのCertificate Managerで証明書がFAILED_NOT_VISIBLE
となった場合、DNSSECの設定が原因である可能性があります。dig
やdelv
コマンドでDNSSECの状態を確認し、DNSSECを無効化することで問題を解決できます。コンソールから無効化できない場合は、gcloud
コマンドを使用して無効化します。
問題の概要
GCPのCertificate ManagerでSSL/TLS証明書を発行しようとしたとき、証明書のステータスがFAILED_NOT_VISIBLE
となり、証明書が発行されないという問題が発生しました。
トラブルシューティングの手順
1. Aレコードの確認
まず、対象のドメイン(例:example.com)に正しいAレコードが設定されているか確認します。以下のdig
コマンドを使用して、GoogleのPublic DNSサーバー(8.8.8.8)経由でAレコードを取得します。
$ dig A example.com @8.8.8.8
しかし、以下のようにSERVFAIL
エラーが発生し、Aレコードが取得できません。
;; ->>HEADER<<- opcode: QUERY, status: SERVFAIL, id: 24514
...
; OPT=15: 00 09 4e 6f 20 44 4e 53 4b 45 59 20 6d 61 74 63 68 65 73 20 44 53 20 52 52 73 20 6f 66 20 65 78 61 6d 70 6c 65 2e 63 6f 6d ("..No DNSKEY matches DS RRs of example.com")
メッセージに「No DNSKEY matches DS RRs of example.com」とあり、DNSSEC関連のエラーが発生していることが疑われます。つまり、DNSSECの設定に問題があるために、DNSクエリが失敗している可能性があります。
[補足] DNSSECとは
ここで、DNSSEC(DNS Security Extensions)について簡単に説明します。DNSSECは、DNSにおけるセキュリティ拡張機能であり、DNS情報の正当性と完全性を保証するための仕組みです。通常のDNSは通信内容が暗号化されておらず、中間者攻撃による情報の改ざんやなりすましのリスクがあります。DNSSECを導入することで、DNS応答にデジタル署名を付与し、受信側がその署名を検証することで、信頼できる情報かどうかを確認できます。
しかし、DNSSECの設定が正しく行われていない場合、DNSの解決に失敗することがあります。特に、DNSSEC対応のリゾルバ(例: Google Public DNS)では、署名の検証に失敗すると、そのドメインの名前解決を拒否します。これが原因で、Certificate Managerがドメインを確認できず、証明書の発行が失敗する可能性があります。
2. 権威DNSサーバーでの確認
次に、ドメインの権威DNSサーバーに直接問い合わせてみます。
$ dig A example.com @ns-cloud-d1.googledomains.com
この結果、正常にAレコードが返ってきます。
;; ANSWER SECTION:
example.com. 300 IN A 93.184.216.34
3. DNSSECの検証
delv
コマンドを使用して、DNSSECの検証を行います。
$ delv A example.com @ns-cloud-d1.googledomains.com
結果として、以下のようにbroken trust chain
と表示され、DNSSECの検証に失敗していることが分かります。
;; resolution failed: broken trust chain
原因の特定
以上の結果から、DNSSECの設定に問題があり、GoogleのPublic DNSサーバーから正しくドメイン情報が取得できないため、Certificate Managerがドメインを認証できず、証明書の発行が失敗していると考えられます。
なぜDNSSECの設定に問題があると断定できるのか
上記の検証結果から、以下のことが分かります。
- 権威DNSサーバーに直接問い合わせると、Aレコードが正常に返ってくる。
- しかし、Google Public DNSなどのDNSSECを検証するリゾルバを経由すると、
SERVFAIL
エラーが発生し、Aレコードが取得できない。 -
delv
コマンドでDNSSECの検証を行うと、broken trust chain
と表示され、署名の検証に失敗している。
これらの結果から、DNSSECの設定に問題があるために、DNSSECを検証するリゾルバがドメイン情報の取得を拒否していると判断できます。
具体的な問題の可能性
DNSSECの設定における具体的な問題として、以下のような可能性が考えられます。
- DSレコードとDNSKEYレコードの不整合: ドメインの親ゾーン(上位のDNSゾーン)に登録されているDSレコードと、ドメインのゾーンファイルにあるDNSKEYレコードが一致しない場合、署名の検証に失敗します。
- DNSKEYまたはRRSIGレコードの欠落: ドメインのゾーンファイルに必要なDNSSEC関連レコード(DNSKEY、RRSIGなど)が正しく設定されていない場合、署名の検証ができません。
- 署名の期限切れ: RRSIGレコードには有効期限が設定されています。有効期限が過ぎた署名は無効と判断され、検証に失敗します。
- ゾーンの署名忘れ: ゾーンファイルを更新した後に再署名を行っていない場合、署名とデータが一致せず、検証に失敗します。
影響範囲の確認
この問題は、DNSSECを検証するリゾルバに限って発生します。つまり、DNSSECを無視するリゾルバや、権威DNSサーバーに直接問い合わせる場合には影響しません。しかし、Google Public DNSなど多くの公共のDNSリゾルバがDNSSECを検証しているため、インターネット上の多くのユーザーに影響を及ぼす可能性があります。
Certificate Managerへの影響
GCPのCertificate Managerは、ドメインの所有権を検証する際に、Googleのインフラストラクチャ内のDNSリゾルバを使用します。これらのリゾルバはDNSSECの検証を行っているため、DNSSECの設定に問題があると、ドメインの名前解決ができず、所有権の確認ができなくなります。結果として、証明書のステータスがFAILED_NOT_VISIBLE
となり、証明書の発行が失敗します。
解決策: DNSSECを無効にする
DNSSECが必要ない場合、または一時的に無効化して問題を解決する場合は、DNSSECを無効にします。
1. Cloud Domainsのコンソールから無効化
GCPのコンソールでCloud Domainsに移動し、対象のドメイン(例:example.com
)の詳細画面を開きます。DNS設定でDNSSECが有効になっている場合、編集メニューからDNSSECを無効にします。
gcloud
コマンドで無効化
1.a コンソールから操作できない場合や、より確実な方法としてgcloud
コマンドを使用します。
$ gcloud domains registrations configure dns example.com --disable-dnssec
実行結果:
Waiting for 'operation-XXXXXXXXXXXX' to complete...done.
Updated registration [example.com].
これにより、DNSSECが無効化されます。
[補足] 設定の反映に関する注意
DNSの設定変更は即時反映されない場合があります。特にDNSSECの設定変更は、最大で72時間程度かかる可能性があります。設定変更後、少なくとも数時間から一日程度待って、変更が反映されるのを確認します。
設定の確認
1. WHOISデータベースでの確認
WHOISデータベースでドメイン情報を確認し、DNSSECの設定が無効化されていることを確認します。
$ whois example.com
DNSSEC
の項目がunsigned
またはDNSSEC: no
となっていれば、DNSSECが無効になっています。
2. Certificate Managerの証明書ステータス確認
GCPのCertificate Managerで、証明書のステータスがACTIVE
となっていることを確認します。ステータスが更新されるまで時間がかかる場合がありますので、適宜リフレッシュしてください。
結果確認
DNSSECを無効化した後、証明書のステータスがACTIVE
となり、正常にSSL/TLS証明書が発行されました。これにより、HTTPSでの安全な通信が可能になりました。
まとめ
GCPのCertificate Managerでドメインの認証が得られない場合、DNSSECの設定が影響している可能性があります。DNSSECが正しく設定されていないと、GoogleのPublic DNSサーバーからドメイン情報が取得できず、Certificate Managerがドメインの所有権を確認できません。
対処法のポイント
-
dig
やdelv
コマンドでDNSやDNSSECの状態を確認する。 - DNSSECの設定が不要な場合は無効化する。
- ドメイン登録事業者やDNSプロバイダの管理画面からDNSSECの設定を確認・変更する。
- DNS設定の変更後、反映に時間がかかることを考慮する。
注意点
- DNSSECはドメインのセキュリティを強化するための重要な機能です。無効化する場合は、必要に応じて後ほど正しく設定をやり直してください。
- ドメイン登録事業者によっては、DNSSECの設定変更方法が異なる場合があります。必要であれば、サポートに問い合わせてください。
今回の対処法が、同様の問題に直面している方の参考になれば幸いです。
解決策
A. DNSSECを無効にする、または正しく再設定する
DNSSECが必要ない場合、または一時的に無効化して問題を解決する場合は、DNSSECを無効にします。DNSSECを使用する必要がある場合は、DNSSECの設定を正しく再構成します。
A.1.a Cloud Domainsのコンソールから無効化
GCPのコンソールでCloud Domainsに移動し、対象のドメイン(例:example.com
)の詳細画面を開きます。DNS設定でDNSSECが有効になっている場合、編集メニューからDNSSECを無効にします。
gcloud
コマンドで無効化する方法
A.1.b コンソールからDNSSECを無効化できない場合や、より確実な方法としてgcloud
コマンドを使用します。
手順:
-
Cloud Shellを起動するか、ローカル環境で
gcloud
コマンドが使用できることを確認します。 -
ドメインのDNSSECを無効化するコマンドを実行します。
$ gcloud domains registrations configure dns example.com --disable-dnssec
-
example.com
は、対象のドメイン名に置き換えてください。
-
-
実行結果を確認します。
Waiting for 'operation-XXXXXXXXXXXX' to complete...done. Updated registration [example.com].
- 上記のようなメッセージが表示されれば、DNSSECの無効化が成功しています。
-
Cloud Domainsのコンソールで確認します。
- コンソールに戻り、ドメインの詳細ページでDNSSECのステータスが「無効」または「Disabled」になっていることを確認します。
補足:
-
gcloud domains registrations configure dns
コマンドは、ドメインのDNS設定を更新するためのコマンドです。 - DNSプロバイダやネームサーバーの設定も同時に行う場合は、必要に応じて追加のオプションを指定してください。
B. DNSSECを正しく再設定する
DNSSECを引き続き使用する場合は、設定を正しく行う必要があります。具体的には、以下の点を確認・修正します。
- DSレコードの更新: ドメインの親ゾーンに登録されているDSレコードが、現在のDNSKEYレコードに対応しているか確認し、不一致がある場合は正しいDSレコードを登録します。
- DNSKEYおよびRRSIGレコードの確認: 権威DNSゾーンに正しいDNSKEYおよびRRSIGレコードが含まれているか確認し、必要に応じて再生成・再配置します。
- ゾーンの再署名: DNSゾーンファイルを手動で管理している場合、変更後にDNSSECで再署名することを忘れないようにします。
DNSSECの設定は複雑な場合が多いため、不明な点がある場合はDNSプロバイダやドメイン登録事業者のサポートに問い合わせることをおすすめします。
[補足] 設定の反映に関する注意
DNSの設定変更は即時反映されない場合があります。特にDNSSECの設定変更は、最大で72時間程度かかる可能性があります。設定変更後、少なくとも数時間から一日程度待って、変更が反映されるのを確認します。
設定の確認
1. WHOISデータベースでの確認
WHOISデータベースでドメイン情報を確認し、DNSSECの設定が無効化されていることを確認します。
$ whois example.com
DNSSEC
の項目がunsigned
またはDNSSEC: no
となっていれば、DNSSECが無効になっています。
2. DNSSEC関連レコードの確認
dig
コマンドを使用して、DNSSEC関連のレコードが削除されていることを確認します。
$ dig DS example.com
結果が空であれば、DSレコードが削除されており、DNSSECが無効になっています。
3. Certificate Managerの証明書ステータス確認
GCPのCertificate Managerで、証明書のステータスがACTIVE
となっていることを確認します。ステータスが更新されるまで時間がかかる場合がありますので、適宜リフレッシュしてください。
結果確認
DNSSECを無効化した後、証明書のステータスがACTIVE
となり、正常にSSL/TLS証明書が発行されました。これにより、HTTPSでの安全な通信が可能になりました。
まとめ
GCPのCertificate Managerでドメインの認証が得られない場合、DNSSECの設定が影響している可能性があります。DNSSECが正しく設定されていないと、GoogleのPublic DNSサーバーからドメイン情報が取得できず、Certificate Managerがドメインの所有権を確認できません。
対処法のポイント
-
dig
やdelv
コマンドでDNSやDNSSECの状態を確認する。 - DNSSECの設定が不要な場合は無効化する。
- コンソールから無効化できない場合は、
gcloud
コマンドでDNSSECを無効化する。 - DNS設定の変更後、反映に時間がかかることを考慮する。
注意点
- DNSSECはドメインのセキュリティを強化するための重要な機能です。無効化する場合は、必要に応じて後ほど正しく設定をやり直してください。
- ドメイン登録事業者やDNSプロバイダによっては、DNSSECの設定変更方法が異なる場合があります。必要であれば、サポートに問い合わせてください。
- DNSSECを再度有効化する場合は、手順に従い正しく設定してください。
今回の対処法が、同様の問題に直面している方の参考になれば幸いです。
Discussion