このチュートリアルでは、Certificate Manager を使用して、DNS 認証でグローバル Google マネージド証明書をデプロイする方法について説明します。
次のロードバランサは、DNS 認証を使用した Google マネージド証明書をサポートしています。
- グローバル外部アプリケーション ロードバランサ
- 従来のアプリケーション ロードバランサ
- グローバル外部プロキシ ネットワーク ロードバランサ
クロスリージョン ロードバランサまたはリージョン ロードバランサにデプロイする場合は、以下をご覧ください。
DNS 認証を使用して Google マネージド証明書を作成する
証明書を作成する前に、パブリック DNS ゾーンを作成します。次に、DNS 認証を作成し、CNAME レコードをターゲット DNS ゾーンに追加します。
DNS 認証を作成する
DNS 認証は 1 つのドメイン名のみを対象とします。ターゲット証明書で使用するドメイン名ごとに、個別の DNS 認証を作成する必要があります。
*.myorg.example.com などのワイルドカード証明書用の DNS 認証を作成する場合は、親ドメイン(myorg.example.com など)の DNS 認証を構成します。
コンソール
DNS 認証を作成することも、証明書の作成時に既存の DNS 認証を添付することもできます。詳細については、DNS 認証を参照する Google マネージド証明書を作成するをご覧ください。
gcloud
FIXED_RECORD または PER_PROJECT_RECORD の 2 種類の DNS 認証を作成できます。詳細については、DNS 認可をご覧ください。
FIXED_RECORD DNS 認証
FIXED_RECORD DNS 認証を作成するには、次の gcloud certificate-manager dns-authorizations create コマンドを使用します。
gcloud certificate-manager dns-authorizations create AUTHORIZATION_NAME \
    --domain="DOMAIN_NAME" \
    --type=[FIXED_RECORD]
次のように置き換えます。
- AUTHORIZATION_NAME: DNS 認証の名前。
- DOMAIN_NAME: この DNS 認証を作成するターゲット ドメインの名前。ドメイン名は完全修飾ドメイン名(- myorg.example.comなど)にする必要があります。
FIXED_RECORD DNS 認証を作成したら、gcloud certificate-manager dns-authorizations describe コマンドで確認します。
gcloud certificate-manager dns-authorizations describe AUTHORIZATION_NAME
出力は次のようになります。出力で、dnsResourceRecord セクションを見つけます。CNAME レコードを見つけて、レコードの詳細(data、name、type)を DNS 構成に追加します。
createTime: '2022-01-14T13:35:00.258409106Z' dnsResourceRecord: data: 0e40fc77-a37d-4eb8-8fe1-eea2e18d12d9.4.authorize.certificatemanager.goog. name: _acme-challenge.myorg.example.com. type: CNAME domain: myorg.example.com name: projects/myProject/locations/global/dnsAuthorizations/myAuthorization updateTime: '2022-01-14T13:35:01.571086137Z'
PER_PROJECT_RECORD DNS 認証
PER_PROJECT_RECORD DNS 認証を作成するには、次の gcloud certificate-manager dns-authorizations create コマンドを使用します。
gcloud certificate-manager dns-authorizations create AUTHORIZATION_NAME \
    --domain="DOMAIN_NAME" \
    --type=PER_PROJECT_RECORD
次のように置き換えます。
- AUTHORIZATION_NAME: DNS 認証の名前。
- DOMAIN_NAME: この DNS 認証を作成するターゲット ドメインの名前。ドメイン名は完全修飾ドメイン名(- myorg.example.comなど)にする必要があります。
PER_PROJECT_RECORD DNS 認証を作成したら、gcloud certificate-manager dns-authorizations describe コマンドで確認します。
gcloud certificate-manager dns-authorizations describe AUTHORIZATION_NAME
出力は次のようになります。出力で、dnsResourceRecord セクションを見つけます。CNAME レコードを見つけて、レコードの詳細(data、name、type)を DNS 構成に追加します。
createTime: '2022-01-14T13:35:00.258409106Z' dnsResourceRecord: data: 0e40fc77-a37d-4eb8-8fe1-eea2e18d12d9.4.authorize.certificatemanager.goog. name: _acme-challenge_ujmmovf2vn55tgye.myorg.example.com type: CNAME domain: myorg.example.com name: projects/myProject/locations/global/dnsAuthorizations/myAuthorization updateTime: '2022-01-14T13:35:01.571086137Z'
Terraform
DNS 認証を作成するには、google_certificate_manager_dns_authorization リソースを使用します。
Terraform 構成を適用または削除する方法については、基本的な Terraform コマンドをご覧ください。
API
DNS 認証を作成するには、dnsAuthorizations.create メソッドに POST リクエストを送信します。
POST /v1/projects/PROJECT_ID/locations/global/dnsAuthorizations?dns_authorization_id=AUTHORIZATION_NAME"
{
  "domain": "DOMAIN_NAME",
  "type": "PER_PROJECT_RECORD" //optional
}
次のように置き換えます。
- PROJECT_ID: Google Cloud プロジェクトの ID
- AUTHORIZATION_NAME: DNS 認証の名前。
- DOMAIN_NAME: この DNS 認証を作成するターゲット ドメインの名前。ドメイン名は完全修飾ドメイン名(- myorg.example.comなど)にする必要があります。
DNS 認証を参照する Google マネージド証明書を作成する
前の手順で作成した DNS 認証を参照する Google マネージド証明書を作成するには、次の手順に従います。
コンソール
- Google Cloud コンソールで、[Certificate Manager] ページに移動します。 
- [証明書] タブで、[証明書を追加] をクリックします。 
- [証明書名] フィールドに、証明書の一意の名前を入力します。 
- 省略可: [説明] フィールドに証明書の説明を入力します。説明は、証明書を識別するために使用します。 
- [ロケーション] で [グローバル] を選択します。 
- [範囲] で [デフォルト] を選択します。 
- [証明書の種類] で [Google マネージド証明書を作成する] を選択します。 
- [認証局のタイプ] で [公開] を選択します。 
- [ドメイン名] フィールドに、証明書のドメイン名をカンマ区切りで指定します。各ドメイン名は完全修飾ドメイン名( - myorg.example.comなど)にする必要があります。 ドメイン名は、- *.example.comなどのワイルドカード ドメイン名にすることもできます。
- [認証タイプ] で [DNS 認証] を選択します。 - このページには、ドメイン名の DNS 認証が一覧表示されます。ドメイン名に関連付けられた DNS 認証がない場合は、次の手順で作成します。 - [見つからない DNS 認証の作成] をクリックします。
- [DNS 認証名] フィールドに、DNS 認証の名前を指定します。デフォルトの DNS 認証タイプは FIXED_RECORDです。複数のプロジェクトで証明書を個別に管理するには、[プロジェクトごとの認証] チェックボックスをオンにします。
- [DNS 認証を作成] をクリックします。
 
- [ラベル] フィールドで、証明書に関連付けるラベルを指定します。ラベルを追加するには、[ラベルを追加] をクリックして、ラベルのキーと値を指定します。 
- [作成] をクリックします。 - 新しい証明書が証明書のリストに表示されます。 
gcloud
DNS 認証を使用してグローバル Google マネージド証明書を作成するには、dns-authorizations フラグを指定して certificate-manager certificates create コマンドを実行します。
gcloud certificate-manager certificates create CERTIFICATE_NAME \
    --domains="DOMAIN_NAME,*.DOMAIN_NAME" \
    --dns-authorizations="AUTHORIZATION_NAMES"
以下を置き換えます。
- CERTIFICATE_NAME: 証明書の名前。
- DOMAIN_NAME: ターゲット ドメインの名前。ドメイン名は、完全修飾ドメイン名(- myorg.example.comなど)またはワイルドカード ドメイン(- *.myorg.example.comなど)にする必要があります。アスタリスク ドットの接頭辞(- (*.))は、ワイルドカード証明書を示します。
- AUTHORIZATION_NAMES: 証明書用に作成した DNS 認証の名前のカンマ区切りリスト。
Terraform
API
次のように、certificates.create メソッドに POST リクエストを送信して証明書を作成します。
POST /v1/projects/PROJECT_ID/locations/global/certificates?certificate_id=CERTIFICATE_NAME
{
 "managed": {
  "domains": ["DOMAIN_NAME"],
  "dnsAuthorizations": [
   "projects/PROJECT_ID/locations/global/dnsAuthorizations/AUTHORIZATION_NAME",
  ],
 }
}
次のように置き換えます。
- PROJECT_ID: Google Cloud プロジェクトの ID
- CERTIFICATE_NAME: 証明書の名前。
- DOMAIN_NAME: ターゲット ドメインの名前。ドメイン名は、完全修飾ドメイン名(- myorg.example.comなど)またはワイルドカード ドメイン(- *.myorg.example.comなど)にする必要があります。アスタリスク ドットの接頭辞(*.)は、ワイルドカード証明書を示します。
- AUTHORIZATION_NAMES: DNS 認証の名前のカンマ区切りリスト。
DNS 構成に CNAME レコードを追加する
サードパーティの DNS ソリューションを使用して DNS を管理している場合は、そのドキュメントを参照して、DNS 構成に CNAME レコードを追加してください。Google Cloud を使用して DNS を管理している場合は、このセクションの手順を完了します。
コンソール
レコードセットを作成する手順は次のとおりです。
- Google Cloud コンソールで、[DNS ゾーン] ページに移動します。 
- レコードを追加する DNS ゾーンの名前をクリックします。 
- [ゾーンの詳細] ページで、[標準を追加] をクリックします。 
- [レコードセットの作成] ページの [DNS 名] フィールドに、DNS ゾーンのサブドメインを入力します。 - サブドメイン名を入力するときに、[DNS 名] フィールドに表示されているグレー表示のテキストを含むサブドメイン名が、 - gcloud certificate-manager dns-authorizations describeコマンドの出力に表示されている- dnsResourceRecord.nameフィールドの完全な値と一致していることを確認します。- 次の例をご覧ください。 - dnsResourceRecord.nameフィールドの値が- _acme-challenge.myorg.example.com.で、[DNS 名] フィールドのグレー表示のテキストが- .example.com.の場合は、- _acme-challenge.myorgと入力します。
- dnsResourceRecord.nameフィールドの値が- _acme-challenge.myorg.example.com.で、[DNS 名] フィールドのグレー表示のテキストが- .myorg.example.com.の場合は、- _acme-challengeと入力します。
- dnsResourceRecord.nameフィールドの値が- _acme-challenge_ujmmovf2vn55tgye.myorg.example.com.で、[DNS 名] フィールドのグレー表示のテキストが- .myorg.example.com.の場合は、- _acme-challenge_ujmmovf2vn55tgyeと入力します。
 
- [リソース レコードのタイプ] フィールドで [CNAME] を選択します。 
- [TTL] フィールドに、リソース レコードの有効期間を数値で入力します。これはキャッシュに保存できる時間です。 
- [TTL ユニット] リストから、時間の単位(例: - 30 minutes)を選択します。
- [正規名] フィールドに、 - gcloud certificate-manager dns-authorizations describeコマンドの出力に表示されている- dnsResourceRecord.dataフィールドの完全な値を入力します。
- 追加情報を入力するには、[項目を追加] をクリックします。 
- [作成] をクリックします。 
gcloud
DNS 認証を作成するとき、gcloud CLI コマンドは対応する CNAME レコードを返します。ターゲット ドメインの DNS ゾーンの DNS 構成に CNAME レコードを追加する手順は次のとおりです。
- DNS レコード トランザクションを次のように開始します。 - gcloud dns record-sets transaction start --zone="DNS_ZONE_NAME" - DNS_ZONE_NAMEは、ターゲット DNS ゾーンの名前に置き換えます。
- CNAME レコードをターゲット DNS ゾーンに追加します。 - gcloud dns record-sets transaction add CNAME_RECORD \ --name="VALIDATION_SUBDOMAIN_NAME.DOMAIN_NAME." \ --ttl="30" \ --type="CNAME" \ --zone="DNS_ZONE_NAME"- 以下を置き換えます。 - CNAME_RECORD: 対応する DNS 認証を作成した Google Cloud CLI コマンドによって返される CNAME レコードの完全なデータ値。
- VALIDATION_SUBDOMAIN_NAME: DNS ゾーンのプレフィックス サブドメイン(- _acme-challengeなど)。DNS 認証を作成するの説明に沿って、- gcloud certificate-manager dns-authorizations describeコマンドログから名前をコピーできます。
- DOMAIN_NAME: ターゲット ドメインの名前。ドメイン名は完全修飾ドメイン名(- myorg.example.comなど)にする必要があります。また、ターゲット ドメイン名の後にピリオドを含める必要があります。
- DNS_ZONE_NAME: ターゲット DNS ゾーンの名前。
 - FIXED_RECORDと- PER_PROJECT_RECORDの DNS 認証の違いについては、次の例をご覧ください。2 つの例の違いは、- --nameフラグの値だけです。- FIXED_RECORD DNS 認証 - gcloud dns record-sets transaction add 0e40fc77-a37d-4eb8-8fe1-eea2e18d12d9.4.authorize.certificatemanager.goog. \ --name="_acme-challenge.myorg.example.com." \ --ttl="30" \ --type="CNAME" \ --zone="myorg-example-com"- PER_PROJECT_RECORD DNS 認証 - gcloud dns record-sets transaction add 0e40fc77-a37d-4eb8-8fe1-eea2e18d12d9.4.authorize.certificatemanager.goog. \ --name="_acme-challenge_ujmmovf2vn55tgye.myorg.example.com." \ --ttl="30" \ --type="CNAME" \ --zone="myorg-example-com"
- DNS レコード トランザクションを実行して変更を保存します。 - gcloud dns record-sets transaction execute --zone="DNS_ZONE_NAME" - DNS_ZONE_NAMEは、ターゲット DNS ゾーンの名前に置き換えます。
Terraform
CNAME レコードを DNS 構成に追加するには、google_dns_record_set リソースを使用します。
証明書のステータスを確認する
証明書をロードバランサにデプロイする前に、証明書が有効であることを確認します。証明書の状態が ACTIVE に変わるまで数分かかることがあります。
コンソール
- Google Cloud コンソールで、[Certificate Manager] ページに移動します。 
- [証明書] タブで、証明書の [ステータス] 列を確認します。 
gcloud
証明書のステータスを確認するには、次のコマンドを実行します。
gcloud certificate-manager certificates describe CERTIFICATE_NAME
CERTIFICATE_NAME は、ターゲット Google マネージド証明書の名前に置き換えます。
出力は次のようになります。
createTime: '2021-10-20T12:19:53.370778666Z'
expireTime: '2022-05-07T05:03:49Z'
managed:
  authorizationAttemptInfo:
  - domain: myorg.example.com
    state: AUTHORIZED
  dnsAuthorizations:
    - projects/myProject/locations/global/dnsAuthorizations/myCert
  domains:
  - myorg.example.com
  state: ACTIVE
name: projects/myProject/locations/global/certificates/myCert
pemCertificate: |
  -----BEGIN CERTIFICATE-----
  [...]
  -----END CERTIFICATE-----
sanDnsnames:
  -   myorg.example.com
updateTime: '2021-10-20T12:19:55.083385630Z'
数時間経っても証明書のステータスが ACTIVE にならない場合は、CNAME レコードが DNS 構成に正しく追加されていることを確認してください。
その他のトラブルシューティングの手順については、Certificate Manager のトラブルシューティングをご覧ください。
証明書をロードバランサにデプロイする
グローバル Google マネージド証明書をデプロイするには、証明書マップを使用して証明書をデプロイします。
証明書マップを作成する
証明書に関連付けられた証明書マップエントリを参照する証明書マップを作成します。
gcloud
証明書マップを作成するには、gcloud certificate-manager maps create コマンドを使用します。
gcloud certificate-manager maps create CERTIFICATE_MAP_NAME
CERTIFICATE_MAP_NAME は、ターゲット証明書マップの名前に置き換えます。
Terraform
証明書マップを作成するには、google_certificate_manager_certificate_map リソースを使用します。
証明書マップエントリを作成する
証明書マップエントリを作成し、証明書と証明書マップに関連付けます。
gcloud
証明書マップエントリを作成するには、gcloud certificate-manager maps entries create コマンドを使用します。
gcloud certificate-manager maps entries create CERTIFICATE_MAP_ENTRY_NAME \
    --map="CERTIFICATE_MAP_NAME" \
    --certificates="CERTIFICATE_NAME" \
    --hostname="HOSTNAME"
以下を置き換えます。
- CERTIFICATE_MAP_ENTRY_NAME: 証明書マップ エントリの名前。
- CERTIFICATE_MAP_NAME: 証明書マップエントリが添付されている証明書マップの名前。
- CERTIFICATE_NAME: 証明書マップエントリに関連付ける証明書の名前。
- HOSTNAME: 証明書マップエントリに関連付けるホスト名。- ワイルドカード ドメインとルートドメインの両方をカバーする証明書を作成する場合は、 - example.comや- *.example.comなど、ルートとワイルドカードを使用してホスト名を指定します。また、- example.com用と- *.example.com用の 2 つの証明書マップエントリを指定する必要があります。
Terraform
ルートドメインを使用して証明書マップエントリを作成するには、google_certificate_manager_certificate_map_entry リソースを使用します。
ワイルドカード ドメインを使用して証明書マップエントリを作成するには、google_certificate_manager_certificate_map_entry リソースを使用します。
証明書マップエントリが有効であることを確認する
証明書マップエントリに対応する証明書マップをターゲット プロキシに接続する前に、証明書マップエントリが有効であることを確認します。
証明書マップエントリを確認するには、gcloud certificate-manager maps entries describe コマンドを使用します。
gcloud certificate-manager maps entries describe CERTIFICATE_MAP_ENTRY_NAME \
    --map="CERTIFICATE_MAP_NAME"
以下を置き換えます。
- CERTIFICATE_MAP_ENTRY_NAME: 証明書マップ エントリの名前。
- CERTIFICATE_NAME: 証明書マップエントリに関連付ける証明書の名前。
出力は次のようになります。
certificates: createTime: '2021-09-06T10:01:56.229472109Z' hostname: example.com name: projects/my-project/locations/global/certificateMaps/myCertMap/certificateMapEntries/myCertMapEntry state: ACTIVE updateTime: '2021-09-06T10:01:58.277031787Z'
証明書マップをターゲット プロキシに添付する
証明書マップは、新しいターゲット プロキシまたは既存のターゲット プロキシに接続できます。
gcloud
証明書マップを新しいターゲット プロキシに添付するには、gcloud compute target-https-proxies create コマンドを使用します。
gcloud compute target-https-proxies create PROXY_NAME \
    --certificate-map="CERTIFICATE_MAP_NAME" \
    --url-map="URL_MAP" \
    --global
以下を置き換えます。
- PROXY_NAME: ターゲット プロキシの名前
- CERTIFICATE_MAP_NAME: 証明書マップエントリと関連する証明書を参照する証明書マップの名前。
- URL_MAP: URL マップの名前。
証明書マップを既存のターゲット HTTPS プロキシに添付するには、gcloud compute target-https-proxies update コマンドを使用します。既存のターゲット プロキシの名前がわからない場合は、[ターゲット プロキシ] ページに移動して、ターゲット プロキシの名前を確認します。
gcloud compute target-https-proxies update PROXY_NAME \
    --certificate-map="CERTIFICATE_MAP_NAME" \
    --global
ターゲット プロキシを作成または更新したら、次のコマンドを実行して確認します。
gcloud compute target-https-proxies list
Terraform
証明書マップをターゲット プロキシに添付するには、google_compute_target_https_proxy リソースを使用します。
ターゲット プロキシを構成するときに、TLS(SSL)証明書を直接添付し、証明書マップを介して添付すると、プロキシは証明書マップで参照される証明書を使用し、直接添付された TLS(SSL)証明書を無視します。
クリーンアップ
このチュートリアルで使用したリソースについて Google Cloud アカウントに課金されないようにするには、リソースを削除します。
- ロードバランサとそのリソースを削除します。 - ロード バランシングの設定をクリーンアップするをご覧ください。 
- 証明書マップを削除するか、プロキシから切断します。 - 証明書マップを削除するには、次のコマンドを実行します。 - gcloud compute target-https-proxies delete PROXY_NAME - ターゲット HTTPS プロキシを保持する場合は、証明書マップをプロキシから切り離します。 - プロキシに直接 TLS(SSL)証明書が添付されている場合、証明書マップを切断すると、プロキシは直接添付された TLS(SSL)証明書を使用して再開します。
- プロキシに直接 TLS(SSL)証明書が添付されていない場合、証明書マップをプロキシから切断することはできません。証明書マップを切断するには、まず少なくとも 1 つの TLS(SSL)証明書をプロキシに直接添付する必要があります。
 - 証明書マップを切断するには、次のコマンドを実行します。 - gcloud compute target-https-proxies update PROXY_NAME \ --clear-certificate-map- PROXY_NAMEは、ターゲット プロキシの名前に置き換えます。
- 証明書マップから証明書マップエントリを削除します。 - gcloud certificate-manager maps entries delete CERTIFICATE_MAP_ENTRY_NAME \ --map="CERTIFICATE_MAP_NAME"- 以下を置き換えます。 - CERTIFICATE_MAP_ENTRY_NAME: 証明書マップ エントリの名前。
- CERTIFICATE_MAP_NAME: 証明書マップの名前。
 
- 証明書マップを削除します。 - gcloud certificate-manager maps delete CERTIFICATE_MAP_NAME - CERTIFICATE_MAP_NAMEは、証明書マップの名前に置き換えます。
- Google マネージド証明書を削除します。 - コンソール- Google Cloud コンソールで、[Certificate Manager] ページに移動します。 
- [証明書] タブで、証明書のチェックボックスをオンにします。 
- [削除] をクリックします。 
- 表示されたダイアログで、[削除] をクリックして確定します。 
 - gcloud- gcloud certificate-manager certificates delete CERTIFICATE_NAME - CERTIFICATE_NAMEは、ターゲット証明書の名前に置き換えます。
- DNS 認証を削除します。 - gcloud certificate-manager dns-authorizations delete AUTHORIZATION_NAME - AUTHORIZATION_NAMEは、DNS 認証の名前に置き換えます。