話題の記事

【新サービス】最大100万個の証明書を管理可能!Google Cloud Certificate Manager が発表されました

最大100万個の証明書やワイルドカード証明書を管理できる Google Cloud Certificate Manager が発表されました。SaaS/PaaS でユーザーごとにドメインを払い出す場合など大量に証明書を必要とする場合でも1個のロードバランサで対応可能です。

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

ウィスキー、シガー、パイプをこよなく愛する大栗です。

Google Cloud で大量の証明書やワイルドカード証明書を管理できる Certificate Manager がプレビューとして発表されたので試してみます。Certificate Manager は SaaS 規模の証明書でも管理可能です。

Introducing Certificate Manager to simplify SaaS scale TLS and certificate management

Google Cloud Certificate Manager は2022年1月31日現在において、プレビューのステータスです。このプロダクトまたは機能は、Google Cloud Platform の利用規約の一般提供前のサービス規約の対象となります。一般提供前のプロダクトと機能では、サポートが制限されることがあります。また、一般提供前のプロダクトや機能に変更が加えられると、他の一般提供前バージョンと互換性がない場合があります。詳細については、リリースステージの説明をご覧ください。

Google Cloud Certificate Manager

元々 Google Cloud ではロードバランサにセルフマネージド SSL 証明書と Google マネージド SSL 証明書を無料で設定する機能があります。しかし、今回発表された Certificate Manager では、大量の証明書を一つのロードバランサーに集約したり、ワイルドカード証明書を利用できます。

大量の証明書

以前からあったロードバランサのマネージド証明書では最大15個の制限がありましたが、Certificate Manager ではロードバランサごとに最大100万の証明書をサポートします(デフォルトでは 100 に制限されています)。このため、ユーザーごと、リソースごとにドメインを分けるような Saas/Paas などで証明書を利用する場合などでも一つのロードバランサで管理できます。

Manage certificates beyond the Cloud Load Balancing's limit of 15 certificates per load balancer. Certificate Manager supports up to a million certificates per load balancer.

Certificate Manager overview

ワイルドカード証明書

Certificate Manager では、ワイルドカード証明書を発行できます。そのため大量のサブドメインがある場合などに手間がかからず効率的に証明書を管理できます。

料金

プレビュー期間中、Certificate Manager は無料です。ただし、Google Cloud プロジェクトで構成されている他のリソースや機能に対して料金が発生する場合があります。

証明書は最初の 100個まで無料です。100 を超える証明書を使用する場合は証明書ごと、月ごとの料金で課金されます。一般提供に移行されてから価格設定が有効になります。

証明書数 料金
0-100 無料
100-2K $0.20/証明書/月
2K+ $0.10/証明書/月

注意

  • Certificate Manager は、従来のグローバル外部 HTTP(S) ロードバランサで利用可能です。ロードバランサは Network Service Tiers がプレミアム ティアにある必要があります。
  • 管理できる証明書は公的に信頼されている CA の証明書です。つまり、公開されているドメインに対してのみ Google マネージド証明書を発行できます。
  • Certificate Manager は Google マネージド証明書で Google CA とLet's Encrypt CA のみサポートしています。
  • Google マネージド証明書のドメイン(Subject Alternative Names)の数は、DNS 認証の場合は最大 100 まで、ロードバランサ認証の場合は最大 5 までと制限されています(これらのクオータを増やすことはできません)。
  • Google マネージド証明書に指定するプライマリドメインは、64文字より短い名前である必要があります。この制限を超えるドメインで Google マネージド証明書が必要な場合は複数ドメイン(SAN)を持つ証明書を作成し、プライマリドメインの後に長いドメイン名を指定します。プライマリドメイン以外のドメインの長さはロードバランサ認証を使用する場合は 253 文字、DNS 認証を使用する場合は 237 文字です。

やってみた

Google マネージド証明書を使用する前提で、Certificate Manager を試してみます。内容はチュートリアルに沿って進めていきます。

gcloudコマンドを使用するため、事前に最新化しておきましょう。またグローバル外部 HTTP(S) ロードバランサは事前にlb-ccm-testという名前で準備済みとします。

パブリック DNS ゾーンを作成する

Cloud Console で Cloud DNS を開き、CREATE ZONEをクリックします。

Zone TypePublicを選択します。Zone nameには任意の判別するための名称を入力して、DNS nameに管理するゾーンのドメイン名を入力します。DNSSECCloud Loggingは任意に設定してください。ここではDNSSECOffにします。

SOAレコードとNSレコードが作成されました。NSレコードのレコード名をクリックします。

登録されている DNS サーバを確認します。

別のプロジェクトや Google Cloud 以外でドメインを管理している場合には、DNS サーバを元に NS レコードを作成して対象ドメインの管理を Cloud DNS にします。

DNS 認証を作成する

gcloud beta certificate-manager dns-authorizations createコマンドで DNS 認証を作成します。--domainオプションで 証明書を作成するドメインを設定します。ここでは DNS 認証の名前にccm-test-domainと設定しました。

$ gcloud beta certificate-manager dns-authorizations create ccm-test-domain \
>     --domain="ccm.example.net"
API [certificatemanager.googleapis.com] not enabled on project [123456789012]. Would you like to enable and retry (this will take a few minutes)? (y/N)?  y

Enabling service [certificatemanager.googleapis.com] on project [123456789012]...
Operation "operations/abcd.a1-123456789012-abcdefgh-1234-abcd-1234-1a2b3c4d5e6f" finished successfully.
Create request issued for: [ccm-test-domain]
Waiting for operation [projects/project-id/locations/global/operations/operation-1234567890123-a1b2c3d4e5f6g-1a2b3c4d-a1b2c3d4] to complete...done.
Created dnsAuthorization [ccm-test-domain].
NAME               DOMAIN             DNS_RECORD                          RECORD_TYPE  DNS_VALUE
ccm-test-domain    ccm.example.net    _acme-challenge.ccm.example.net.    CNAME        1234abcd-5678-efgh-90ij-123456abcdef.99.authorize.certificatemanager.goog.

コマンドは DNS に登録する CNAME レコードを返します。

DNS に CNAME レコードを追加します。

対象のドメインについて DNS レコードのトランザクションを開始します。--zoneオプションで任意の DNS レコードセットの名称を設定します。

$ gcloud dns record-sets transaction start --zone="ccm-test-domain"
Transaction started [transaction.yaml].

DNS 認証の CNAME レコードを追加します。作成した DNS 認証の内容を設定します。--nameオプションには DNS_RECORD の内容を設定します。CNAME も DNS_RECORD も最後の.を含めて入力します。

$ gcloud dns record-sets transaction add 1234abcd-5678-efgh-90ij-123456abcdef.99.authorize.certificatemanager.goog. \
>    --name="_acme-challenge.ccm.example.net." \
>    --ttl="30" \
>    --type="CNAME" \
>    --zone="ccm-test-domain"
Record addition appended to transaction at [transaction.yaml].

DNS レコードのトランザクションを実行して、変更を保存します。

$ gcloud dns record-sets transaction execute --zone="ccm-test-domain"
Executed transaction [transaction.yaml] for managed-zone [ccm-test-domain].
Created [https://dns.googleapis.com/dns/v1/projects/project-id/managedZones/ccm-test-domain/changes/3].
ID  START_TIME                STATUS
3   2022-01-31T22:34:59.963Z  pending

DNS 認証を参照する Google マネージド証明書を作成します

作成した DNS 認証を参照する Google マネージド証明書を新規に作成するために、次のコマンドを実行します。ここでは証明書の名前にcert-ccmと設定しました。

$ gcloud beta certificate-manager certificates create cert-ccm \
>     --domains=ccm.example.net --dns-authorizations=ccm-test-domain
Create request issued for: [cert-ccm]
Waiting for operation [projects/project-id/locations/global/operations/operation-1234567890123-a1b2c3d4e5f6g-1a2b3c4d-a1b2c3d4] to complete...done.
Created certificate [cert-ccm].

証明書をロードバランサーにデプロイします

証明書マップを作成します。ここでは証明書マップの名前にcert-mapと設定しました。

$ gcloud beta certificate-manager maps create cert-map
Waiting for 'operation-1234567890123-a1b2c3d4e5f6g-1a2b3c4d-a1b2c3d4' to complete...done.                         
Created certificate map [cert-map].

証明書マップエントリを作成して、証明書と証明書マップに関連付けます。ここでは証明書マップエントリの名前にcert-map-entry-1と設定しました。

$ gcloud beta certificate-manager maps entries create cert-map-entry-1 \
>     --map="cert-map" \
>     --certificates="cert-ccm" \
>     --hostname="ccm.example.net"
Waiting for 'operation-1234567890123-a1b2c3d4e5f6g-1a2b3c4d-a1b2c3d4' to complete...done.                         
Created certificate map entry [cert-map-entry-1].

証明書マップエントリがアクティブであることを確認します

証明書マップエントリの内容を表示してstateACTIVEになっていることを確認します。

$ gcloud beta certificate-manager maps entries describe cert-map-entry-1 \
>     --map="cert-map"
certificates:
- projects/123456789012/locations/global/certificates/cert-ccm
createTime: '2022-01-31T23:57:37.965726317Z'
hostname: ccm.example.net
name: projects/project-id/locations/global/certificateMaps/cert-map/certificateMapEntries/cert-map-entry-1
state: ACTIVE
updateTime: '2022-01-31T23:57:38.357486815Z'

証明書の内容を表示してstateACTIVEになっていることを確認します。

$ gcloud beta certificate-manager certificates describe cert-ccm
createTime: '2022-01-31T22:45:52.947151263Z'
expireTime: '2022-05-01T21:45:54Z'
managed:
  authorizationAttemptInfo:
  - domain: ccm.example.net
    state: AUTHORIZED
  dnsAuthorizations:
  - projects/123456789012/locations/global/dnsAuthorizations/ccm-test-domain
  domains:
  - ccm.example.net
  state: ACTIVE
name: projects/project-id/locations/global/certificates/cert-ccm
: |
  -----BEGIN CERTIFICATE-----
  ・
  ・
  ・
  -----END CERTIFICATE-----
  -----BEGIN CERTIFICATE-----
  ・
  ・
  ・
  -----END CERTIFICATE-----
  -----BEGIN CERTIFICATE-----
  ・
  ・
  ・
  -----END CERTIFICATE-----
sanDnsnames:
- ccm.example.net
updateTime: '2022-01-31T22:45:53.517894284Z'

ロードバランサに HTTPS プロキシを作成しつつ証明書マップをアタッチします。ここでは HTTPS プロキシの名前にlb-ccm-test-https-target-proxyと設定しました。

$ gcloud beta compute target-https-proxies create lb-ccm-test-https-target-proxy \
>   --url-map=lb-ccm-test \
>   --certificate-map="cert-map"
Created [https://www.googleapis.com/compute/beta/projects/project-id/global/targetHttpsProxies/lb-ccm-test-https-target-proxy].
NAME                            SSL_CERTIFICATES  URL_MAP      CERTIFICATE_MAP
lb-ccm-test-https-target-proxy                    lb-ccm-test  cert-map

HTTPS 用の受信リクエストをプロキシに転送するグローバル転送ルールを作成します。必要に応じて--addressオプションで IP アドレスを指定するなどしてください。ここでは転送ルールの名前にlb-ccm-test-https-forwarding-ruleと設定しました。

$ gcloud beta compute forwarding-rules create lb-ccm-test-https-forwarding-rule \
>   --load-balancing-scheme=EXTERNAL \
>   --network-tier=PREMIUM \
>   --global \
>   --target-https-proxy=lb-ccm-test-https-target-proxy \
>   --ports=443
Created [https://www.googleapis.com/compute/beta/projects/project-id/global/forwardingRules/lb-ccm-test-https-forwarding-rule].

グローバル転送ルールを確認して、付与されている IP アドレスを確認します。

$ gcloud beta compute forwarding-rules describe lb-ccm-test-https-forwarding-rule --global
IPAddress: 203.0.113.253
IPProtocol: TCP
creationTimestamp: '2022-01-31T16:49:55.288-08:00'
description: ''
fingerprint: ab1234ABCD1=
id: '1234567890123456789'
ipVersion: IPV4
kind: compute#forwardingRule
labelFingerprint: 12AcCd34567=
loadBalancingScheme: EXTERNAL
name: lb-ccm-test-https-forwarding-rule
networkTier: PREMIUM
portRange: 443-443
selfLink: https://www.googleapis.com/compute/beta/projects/project-id/global/forwardingRules/lb-ccm-test-https-fo
rwarding-rule
target: https://www.googleapis.com/compute/beta/projects/project-id/global/targetHttpsProxies/lb-ccm-test-https-t
arget-proxy

最後に、確認した IP アドレスを管理対象ドメインの A レコードとして登録します。

アクセスする

ロードバランサのバックエンドに、以下の様な PHP スクリプトを用意しておきました。

<?php
    phpinfo(INFO_VARIABLES);

ブラウザからアクセスしてみます。このように問題なく表示され、https でアクセスできています。

証明書も確認してみましょう。発行者名を確認すると、Google Trust Services で発行された証明書であることが分かります。また証明書の期限は3ヶ月になっています。

さいごに

今まではロードバランサ辺り証明書が 15 個までという制限があり、多数のドメインをホストするユースケースではロードバランサを多数用意する必要がありました。Certificate Manager によって、多数のマルチドメインやワイルドカードの証明書が発行せきるため、リソースを集約することが可能になります。

特に最大100万個の証明書までホストできるため、特に SaaS や PaaS の提供者にとって重要なアップデートになっていると思われます。まだ一般提供前ですが、早く一般提供になってほしいサービスです。