📜

GCPのCertificate Managerでドメインの認証が得られない場合の対処法

2024/12/07に公開

自己紹介

はじめまして、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の設定が原因である可能性があります。digdelvコマンドで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を無効にします。

1.a gcloudコマンドで無効化

コンソールから操作できない場合や、より確実な方法として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がドメインの所有権を確認できません。

対処法のポイント

  • digdelvコマンドで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を無効にします。

A.1.b gcloudコマンドで無効化する方法

コンソールからDNSSECを無効化できない場合や、より確実な方法としてgcloudコマンドを使用します。

手順:

  1. Cloud Shellを起動するか、ローカル環境でgcloudコマンドが使用できることを確認します。

  2. ドメインのDNSSECを無効化するコマンドを実行します。

    $ gcloud domains registrations configure dns example.com --disable-dnssec
    
    • example.comは、対象のドメイン名に置き換えてください。
  3. 実行結果を確認します。

    Waiting for 'operation-XXXXXXXXXXXX' to complete...done.
    Updated registration [example.com].
    
    • 上記のようなメッセージが表示されれば、DNSSECの無効化が成功しています。
  4. 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がドメインの所有権を確認できません。

対処法のポイント

  • digdelvコマンドでDNSやDNSSECの状態を確認する。
  • DNSSECの設定が不要な場合は無効化する。
  • コンソールから無効化できない場合は、gcloudコマンドでDNSSECを無効化する。
  • DNS設定の変更後、反映に時間がかかることを考慮する。

注意点

  • DNSSECはドメインのセキュリティを強化するための重要な機能です。無効化する場合は、必要に応じて後ほど正しく設定をやり直してください。
  • ドメイン登録事業者やDNSプロバイダによっては、DNSSECの設定変更方法が異なる場合があります。必要であれば、サポートに問い合わせてください。
  • DNSSECを再度有効化する場合は、手順に従い正しく設定してください。

今回の対処法が、同様の問題に直面している方の参考になれば幸いです。

Discussion