セルフマネージド SSL 証明書は、ご自分で取得、プロビジョニング、更新する証明書です。このリソースを使用して、クライアントとロードバランサ間の通信を保護できます。
セルフマネージド証明書には、次の証明書の種類を自由に組み合わせることができます。
- ドメイン認証(DV)
- 組織認証(OV)
- 拡張認証(EV)
セルフマネージド証明書は、次のロードバランサでサポートされています。
- グローバル証明書
- グローバル外部 HTTP(S) ロードバランサ(プレビュー)。
- グローバル外部 HTTP(S) ロードバランサ(従来)
- SSL プロキシ ロードバランサ
- リージョン証明書
- リージョン外部 HTTP(S) ロードバランサ(プレビュー)
- 内部 HTTP(S) ロードバランサ
このページでは、有効な証明書を取得し、証明書をアップロードして Google Cloud SSL 証明書リソースを作成する手順を説明します。
始める前に
- SSL 証明書の概要を十分に理解します。
- セルフマネージド SSL 証明書に使用するドメイン名があることを確認します。Google Domains を使用している場合は、ステップ 1: Google Domains を使用してドメイン名を登録するをご覧ください。
権限
このガイドのタスクを行うには、プロジェクトで SSL 証明書を作成および変更できる必要があります。次のいずれかに該当する場合は、この操作を行うことができます。
- プロジェクトのオーナーまたは編集者(
roles/owner
またはroles/editor
)である。 - プロジェクトに Compute セキュリティ管理者ロール(
compute.securityAdmin
)と Compute ネットワーク管理者ロール(compute.networkAdmin
)の両方がある。 - プロジェクトで割り当てられているカスタムロールに、
compute.sslCertificates.*
権限と、compute.targetHttpsProxies.*
またはcompute.targetSslProxies.*
のいずれか、あるいはその両方(使用するロードバランサによる)が含まれている。
ステップ 1: 秘密鍵と証明書を作成する
すでに秘密鍵と認証局(CA)の証明書がある場合は、このセクションをスキップして SSL 証明書リソースを作成するステップに進みます。
秘密鍵を選択または作成する
Google Cloud SSL 証明書には、PEM 形式の秘密鍵と証明書の両方が含まれます。秘密鍵は次の条件を満たす必要があります。
- PEM 形式にする必要があります。
- パスフレーズで保護することはできません。Google Cloud は、秘密鍵を独自の暗号化形式で保存します。
- 暗号化アルゴリズムは、RSA-2048 または ECDSA P-256 のいずれかにする必要があります。
PEM 形式で RSA-2048 暗号化を使用して新しい秘密鍵を作成するには、次の OpenSSL コマンドを使用します。
openssl genrsa -out PRIVATE_KEY_FILE 2048
PRIVATE_KEY_FILE は、新しい秘密鍵ファイルのパスとファイル名に置き換えます。
CSR を作成する
秘密鍵を取得したら、OpenSSL を使用して PEM 形式の証明書署名リクエスト(CSR)を生成できます。CSR は次の条件を満たす必要があります。
- PEM 形式にする必要があります。
- 共通名(
CN
)またはサブジェクト代替名(SAN
)属性を設定する必要があります。事実上、シングル ドメイン向けの証明書であっても、CN
属性とSAN
属性の両方を設定する必要があります。macOS と iOS の最新バージョンなどの最新のクライアントはCN
属性だけに依存しないためです。
OpenSSL 構成ファイルを作成します。次の例では、サブジェクトの代替名が
[sans_list]
に定義されています。cat <<'EOF' >CONFIG_FILE [req] default_bits = 2048 req_extensions = extension_requirements distinguished_name = dn_requirements [extension_requirements] basicConstraints = CA:FALSE keyUsage = nonRepudiation, digitalSignature, keyEncipherment subjectAltName = @sans_list [dn_requirements] countryName = Country Name (2 letter code) stateOrProvinceName = State or Province Name (full name) localityName = Locality Name (eg, city) 0.organizationName = Organization Name (eg, company) organizationalUnitName = Organizational Unit Name (eg, section) commonName = Common Name (e.g. server FQDN or YOUR name) emailAddress = Email Address [sans_list] DNS.1 = SUBJECT_ALTERNATIVE_NAME_1 DNS.2 = SUBJECT_ALTERNATIVE_NAME_2 EOF
下の OpenSSL コマンドを実行して、証明書署名リクエスト(CSR)ファイルを作成します。このコマンドはインタラクティブ形式となっていて、前のステップで CONFIG_FILE の
[sans_list]
に定義したサブジェクト代替名以外の属性の入力を求められます。openssl req -new -key PRIVATE_KEY_FILE \ -out CSR_FILE \ -config CONFIG_FILE
両方のステップで、プレースホルダを有効な値に置き換えます。
- CONFIG_FILE: OpenSSL 構成ファイルのパス(ファイル名を含む)。ファイルはこの手順の完了後削除できます。
- SUBJECT_ALTERNATIVE_NAME_1 と SUBJECT_ALTERNATIVE_NAME_2: 証明書のサブジェクト代替名。証明書が 1 つのホスト名のみを対象としている場合は、共通名に一致する単一のサブジェクト代替名だけを定義します。3 つ以上のサブジェクト代替名が必要な場合は、
DNS
の後に続く数値を増やして(DNS.3
、DNS.4
など)、構成ファイルに追加します。 - PRIVATE_KEY_FILE: 秘密鍵ファイルのパス
- CSR_FILE: CSR のパス(ファイル名を含む)
CSR に署名する
認証局は CSR に署名する際、独自の秘密鍵を使用して証明書を作成します。
公的に信頼できる CA の使用
- CSR に署名するよう公的に信頼できる CA にリクエストすると、その証明書はその公開 CA を信頼するすべてのクライアントに信頼されます。
- 署名済み証明書を作成するために公開 CA が必要とするのは、CSR のみです。
自分の CA の管理
- 独自の CA を管理している場合は、CSR の署名に使用できます。クライアントも独自の CA を信頼するように構成されている場合は、独自の CA を使用して CSR に署名することで、内部的に信頼できる証明書が作成されます。
自己署名証明書の使用
- CSR を作成するために使用した秘密鍵と同じ秘密鍵を使用して CSR に署名する場合は、自己署名証明書が作成されます。クライアントが証明書の検証をスキップするように構成されていない場合、自己署名証明書は信頼されません。たとえば、ウェブブラウザ クライアントは、自己署名証明書を信頼するかどうかを尋ねるメッセージを表示します。自己署名証明書はテストにのみ使用してください。
独自の CA を管理する場合や、テスト用の自己署名証明書を作成する場合は、次の OpenSSL コマンドを使用できます。
openssl x509 -req \ -signkey PRIVATE_KEY_FILE \ -in CSR_FILE \ -out CERTIFICATE_FILE \ -extfile CONFIG_FILE \ -extensions extension_requirements \ -days TERM
プレースホルダを有効な値に置き換えます。
- PRIVATE_KEY_FILE: CA の秘密鍵のパス。テスト用の自己署名証明書を作成する場合、この秘密鍵は CSR の作成に使用されたものと同じです。
- CSR_FILE: CSR のパス
- CERTIFICATE_FILE: 作成する証明書ファイルのパス
- TERM: 検証するクライアントが証明書を有効と見なす日数
共通名のワイルドカード
セルフマネージド SSL 証明書では、共通名にワイルドカードを使用できます。たとえば、共通名 *.example.com.
の証明書は、ホスト名 www.example.com
および foo.example.com
と一致しますが、a.b.example.com
または example.com
とは一致しません。ロードバランサが証明書を選択するときは、ワイルドカードを使用した証明書よりもワイルドカードを使用しない証明書とのホスト名の一致を常に優先します。
ワイルドカード フラグメント(f*.example.com
など)を含む証明書はサポートされていません。
ステップ 2: セルフマネージド SSL 証明書リソースを作成する
Google Cloud SSL 認証リソースを作成するには、秘密鍵と証明書が必要です。まだ作成または取得していない場合は、秘密鍵と証明書を作成するをご覧ください。
Console
グローバル SSL 証明書は、Cloud Console の [証明書] タブで操作できます。リージョン SSL 証明書は Cloud Console では作成できません。gcloud
または REST API を使用してください。
- Google Cloud Console の [証明書] タブに移動します。
[証明書] タブに移動 - [SSL 証明書を作成] をクリックします。
- 証明書の名前と説明(省略可)を入力します。
- [証明書をアップロードする] を選択します。
- 証明書を貼り付けるか、[アップロード] をクリックして、証明書ファイルに移動します。
証明書と同じファイルに CA 証明書チェーンを含めることもできます。Google Cloud は証明書チェーンを検証しません。お客様ご自身で検証していただく必要があります。 - 秘密鍵を貼り付けるか、[アップロード] をクリックして、秘密鍵ファイルに移動します。
- [作成] をクリックします。
gcloud
グローバル SSL 証明書を作成するには、--global
フラグを指定して gcloud compute ssl-certificates
create
コマンドを使用します。
gcloud compute ssl-certificates create CERTIFICATE_NAME \ --certificate=CERTIFICATE_FILE \ --private-key=PRIVATE_KEY_FILE \ --global
リージョン SSL 証明書を作成するには、--region
フラグを指定して gcloud compute ssl-certificates
create
コマンドを使用します。
gcloud compute ssl-certificates create CERTIFICATE_NAME \ --certificate=CERTIFICATE_FILE \ --private-key=PRIVATE_KEY_FILE \ --region=REGION
プレースホルダを有効な値に置き換えます。
- CERTIFICATE_NAME: 作成するグローバル証明書リソースの名前
- CERTIFICATE_FILE: PEM 形式の証明書ファイルのパス。証明書と同じファイルに CA 証明書チェーンを含めることもできます。Google Cloud は証明書チェーンを検証しません。お客様自身で検証していただく必要があります。
- PRIVATE_KEY_FILE: PEM 形式の秘密鍵のパス。秘密鍵をパスフレーズで保護することはできません。
- REGION: 該当する場合は、リージョン SSL 証明書のリージョン。この証明書リソースが内部 HTTP(S) ロードバランサ用またはリージョン外部 HTTP(S) ロードバランサ用である場合、リージョンはロードバランサのリージョンと同じである必要があります。
API
API メソッドを使用するには、API リクエストでファイルのコンテンツを送信する必要があるため、最初に証明書と秘密鍵ファイルを読み取る必要があります。
証明書と秘密鍵ファイルを読み取り、SSL 証明書を作成します。次の例に、Python を使用してこれを行う方法を示します。
グローバル SSL 証明書の場合は、sslCertificates.insert API メソッドを使用します。
リージョン SSL 証明書の場合は、regionSslCertificates.insert API メソッドを使用します。
コードサンプルについては、API リファレンス ページをご覧ください。
ステップ 3: SSL 証明書をターゲット プロキシに関連付ける
HTTPS プロキシまたは SSL プロキシごとに少なくとも 1 つの SSL 証明書を関連付ける必要があります。ターゲット HTTPS またはターゲット SSL プロキシごとの SSL 証明書の最大数までターゲット プロキシを構成できます。同じターゲット プロキシで複数のセルフマネージド証明書を参照できます。
Console
Google Cloud Console を使用して既存のロードバランサを編集すると、自動的に SSL 証明書が適切なターゲット プロキシに関連付けられます。
gcloud
グローバル SSL 証明書をターゲット HTTPS プロキシに関連付けるには、--global
と --global-ssl-certificates
フラグを指定して gcloud compute target-https-proxies
update
コマンドを実行します。
gcloud compute target-https-proxies update TARGET_PROXY_NAME \ --global \ --ssl-certificates=CERTIFICATE_LIST \ --global-ssl-certificates
グローバル SSL 証明書をターゲット SSL プロキシに関連付けるには、gcloud compute target-ssl-proxies
update
コマンドを使用します。
gcloud compute target-ssl-proxies update TARGET_PROXY_NAME \ --ssl-certificates=CERTIFICATE_LIST
リージョン SSL 証明書をターゲット HTTPS プロキシに関連付けるには、--region
と --ssl-certificates-region
フラグを指定して gcloud compute target-https-proxies
update
コマンドを使用します。
gcloud compute target-https-proxies update TARGET_PROXY_NAME \ --region=REGION \ --ssl-certificates=CERTIFICATE_LIST \ --ssl-certificates-region=REGION
プレースホルダを有効な値に置き換えます。
- TARGET_PROXY_NAME: ロードバランサのターゲット プロキシの名前
- CERTIFICATE_LIST: Google Cloud SSL 証明書名のカンマ区切りリスト
- REGION: リージョン ターゲット プロキシとリージョン SSL 証明書のリージョン(該当する場合)
API
グローバル SSL 証明書を外部 HTTP(S) ロードバランサのターゲット HTTPS プロキシに関連付けるには、targetHttpsProxies.insert
メソッドに POST
リクエストを行い、PROJECT_ID
をプロジェクト ID に置き換えます。
POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/global/targetHttpsProxy { "name": "l7-xlb-proxy", "urlMap": "projects/PROJECT_ID/global/urlMaps/l7-xlb-map", "sslCertificates": /projectsPROJECT_IDglobal/sslCertificates/SSL_CERT_NAME }
グローバル SSL 証明書を SSL プロキシ ロードバランサのターゲット HTTPS プロキシに関連付けるには、targetSslProxies.insert
メソッドに POST
リクエストを行い、PROJECT_ID
をプロジェクト ID に置き換えます。
POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/global/targetSslProxy { "name": "l7-ssl-proxy", "sslCertificates": /projectsPROJECT_IDglobal/sslCertificates/SSL_CERT_NAME }
リージョン SSL 証明書を外部 HTTP(S) ロードバランサのターゲット HTTPS プロキシに関連付けるには、targetHttpsProxies.insert
メソッドに POST
リクエストを行い、PROJECT_ID
をプロジェクト ID に置き換えます。
POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/global/targetHttpsProxy { "name": "l7-xlb-proxy", "urlMap": "projects/PROJECT_ID/global/urlMaps/l7-ilb-map", "region": "us-west1" "sslCertificates": /projectsPROJECT_IDregions/us-west1/sslCertificates/SSL_CERT_NAME }
ステップ 4: ロードバランサの IP アドレスを指すように DNS A および AAAA レコードを更新する
登録事業者のサイト、DNS ホスト、または ISP(DNS レコードが管理されている場所)で、ドメインとサブドメインの DNS A レコード(IPv4 の場合)および DNS AAAA レコード(IPv6 の場合)を追加または更新して、これらのレコードでロードバランサの転送ルールまたはルールと関連付けられた IP アドレスを参照するようにします。
Cloud DNS と Google Domains を使用している場合は、ドメインを設定し、ネームサーバーを更新します。
単一の証明書に複数のドメインを使用する場合は、すべてのドメインとそのサブドメインの DNS レコードを追加または更新して、すべてのレコードでロードバランサの IP アドレスを参照するようにする必要があります。
DNS 伝播が完了したら、dig
コマンドを実行して設定を確認できます。たとえばドメインが www.example.com
の場合は、次の dig
コマンドを実行します。
dig www.example.com
; <<>> DiG 9.10.6 <<>> www.example.com ;; global options: +cmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: ;; flags: ra; QUERY: 1, ANSWER: 4, AUTHORITY: 0, ADDITIONAL: ;; PSEUDOSECTION: ; EDNS: version: 0, flags:; udp: ;; SECTION: ;www.example.com. ;; SECTION: www.example.com. www.example.com.edgekey.net. www.example.com.edgekey.net. www.example.com.edgekey.net.globalredir.akadns.net. www.example.com.edgekey.net.globalredir.akadns.net. e6858.dsce9.akamaiedge.net. e6858.dsce9.akamaiedge.net. 203.0.113.5 ;; time: ;; SERVER: 8.8.8.8#53(8.8.8.8) ;; WHEN: 16:54:44 ;; rcvd: 31748 qr rd 1 OPT 512 QUESTION IN A ANSWER 1742 IN CNAME 21330 IN CNAME 3356 IN CNAME 19 IN A Query 43 msec Wed Jun 03 PDT 2020 MSG SIZE 193>
この例では、203.0.113.5
がロードバランサの IP アドレスです。
ステップ 5: OpenSSL でテストする
証明書とドメインのステータスがアクティブになった後、ロードバランサがセルフマネージド SSL 証明書の使用を開始するまでに最大 30 分かかる場合があります。
テストするには、次の OpenSSL コマンドを実行します。DOMAIN は DNS 名に置き換え、IP_ADDRESS はロードバランサの IP アドレスに置き換えます。
echo | openssl s_client -showcerts -servername DOMAIN -connect IP_ADDRESS:443 -verify 99 -verify_return_error
このコマンドは、ロードバランサがクライアントに提示する証明書を出力します。他の詳細情報とともに、出力には証明書チェーンと Verify return code: 0 (ok)
が含まれているはずです。
セルフマネージド SSL 証明書を操作する
以降のセクションで、SSL 証明書リソースを一覧表示、表示、削除、置換する方法を説明します。
SSL 証明書を一覧表示する
Console
グローバル SSL 証明書のステータスは、[Cloud Load Balancing] ページの [証明書] タブで確認できます。リージョン SSL 証明書は Cloud Console では管理できません。gcloud
または REST API を使用してください。
- Google Cloud Console の [証明書] ページに移動します。
[証明書] ページに移動 - (省略可)SSL 証明書のリストをフィルタリングします。
gcloud
グローバル SSL 証明書を一覧表示するには、--global
フラグを指定して gcloud compute ssl-certificates
list
コマンドを使用します。
gcloud compute ssl-certificates list \ --global
リージョン SSL 証明書を一覧表示するには、region
フィルタを使用して gcloud compute ssl-certificates
list
コマンドを実行します。
gcloud compute ssl-certificates list \ --filter="region:(REGION ...)"
プレースホルダを有効な値に置き換えます。
- REGION: Google Cloud のリージョン。複数のリージョンは、スペース区切りリストとして含めます。
SSL 証明書の説明を表示する
Console
SSL 証明書の詳細は、[ロード バランシング] ページの [証明書] タブで確認できます。
- Google Cloud Console の [証明書] ページに移動します。
[証明書] ページに移動 - (省略可)SSL 証明書のリストをフィルタリングします。
- 詳細を表示するには、証明書名をクリックします。
gcloud
グローバル SSL 証明書の説明を取得するには、--global
フラグを指定して gcloud compute ssl-certificates
describe
コマンドを使用します。
gcloud compute ssl-certificates describe CERTIFICATE_NAME \ --global
リージョン SSL 証明書を記述するには、--region
フラグを指定して gcloud compute ssl-certificates
describe
コマンドを使用します。
gcloud compute ssl-certificates describe CERTIFICATE_NAME \ --region=REGION
プレースホルダを有効な値に置き換えます。
- CERTIFICATE_NAME: SSL 証明書の名前
- REGION: Google Cloud のリージョン
SSL 証明書の削除
SSL 証明書を削除するには、まず、その証明書を参照する各ターゲット プロキシを更新する必要があります。ターゲット プロキシごとに、削除する SSL 証明書が含まれなくなるようにターゲット プロキシの CERTIFICATE_LIST を更新するために、適切な gcloud update
コマンドを実行します。各ターゲット SSL プロキシまたはターゲット HTTPS プロキシは、少なくとも 1 つの SSL 証明書を参照する必要があります。
ターゲット プロキシを更新したら、SSL 証明書を削除できます。
Console
SSL 証明書は、[ロード バランシング] ページの [証明書] タブで削除できます。
- Google Cloud Console の [証明書] ページに移動します。
[証明書] ページに移動 - 削除する SSL 証明書を選択します。
- [削除] をクリックします。
- もう一度 [削除] をクリックして確定します。
gcloud
グローバル SSL 証明書を削除するには、gcloud compute ssl-certificates
delete
コマンドと --global
コマンドを使用します。
gcloud compute ssl-certificates delete CERTIFICATE_NAME \ --global
リージョン SSL 証明書を削除するには、gcloud compute ssl-certificates
delete
コマンドと --region
コマンドを使用します。
gcloud compute ssl-certificates delete CERTIFICATE_NAME \ --region=REGION
プレースホルダを有効な値に置き換えます。
- CERTIFICATE_NAME: SSL 証明書の名前
- REGION: Google Cloud のリージョン
有効期限が切れる前に SSL 証明書を置き換えまたは更新する
セルフマネージド SSL 証明書では、アクティブで機能する証明書を指定する必要があります。SSL 証明書が 1 つしかない場合は、新しい証明書が機能するまでこの SSL 証明書を削除しないでください。トラフィックの処理を継続するには、ターゲット プロキシが少なくとも 1 つのアクティブな SSL 証明書を引き続き参照する必要があります。
SSL 証明書の置き換え、更新、またはローテーションを行う必要がある場合は、次の手順に沿って操作します。
- 現在の証明書に対して
gcloud compute ssl-certificates describe
コマンドを実行して、有効期限が間もなく切れるかどうかを確認します。 - 新しい SSL 証明書リソースを作成します。新しい SSL 証明書には、プロジェクト内で一意の名前を付ける必要があります。
ターゲット プロキシを更新して、新しい SSL 証明書を SSL 証明書のリストの最初の位置に追加し、プライマリ証明書にします。新しい証明書の後に、保持する必要がある既存の SSL 証明書を追加します。証明書が 1 つのみの場合は、有効期限が迫っていても削除しないでください。
ダウンタイムを回避するには、
--ssl-certificates
フラグを指定したgcloud
を単一のコマンドで実行します。例:グローバル外部 HTTP(S) ロードバランサの場合:
gcloud compute target-https-proxies update
コマンドを使用し、--global
フラグを指定します。gcloud compute target-https-proxies update TARGET_PROXY_NAME \ --global \ --ssl-certificates=new-ssl-cert,other-certificates \ --global-ssl-certificates
リージョン外部 HTTP(S) ロードバランサと内部 HTTP(S) ロードバランサの場合:
gcloud compute target-https-proxies update
コマンドを使用し、--region
フラグを指定します。gcloud compute target-https-proxies update TARGET_PROXY_NAME \ --region REGION \ --ssl-certificates=new-ssl-cert,other-certificates \ --global-ssl-certificates
SSL プロキシ ロードバランサの場合:
gcloud compute target-ssl-proxies update
コマンドを使用し、--backend-service
フラグを指定します。gcloud compute target-ssl-proxies update TARGET_PROXY_NAME \ --ssl-certificates=new-ssl-cert,other-certificates
次の OpenSSL コマンドを実行して、ロードバランサが置換証明書を提供していることを確認します。
echo | openssl s_client -showcerts -connect IP_ADDRESS:443 -verify 99 -verify_return_error
15 分間待ち、すべての Google Front End(GFE)が置換証明書を利用できるようにします。
ターゲット プロキシを更新して、有効期限が迫っている証明書を削除します。
(省略可)古い SSL 証明書を削除します。
SSL 証明書を定期的にローテーションする
このサンプル ソリューションでは、Google Cloud ロードバランサで使用されている証明書のステータスを定期的にチェックし、有効期間に達した時点で証明書をローテーションします。このツールは、Certificate Authority Service を使用して構成された CA を使用します。
このソリューションは、次のロードバランサで動作します。
- グローバル外部 HTTP(S) ロードバランサ
- グローバル外部 HTTP(S) ロードバランサ(従来)
- リージョン外部 HTTP(S) ロードバランサ
- 内部 HTTP(S) ロードバランサ
- SSL プロキシ ロードバランサ
次のステップ
- SSL 証明書のトラブルシューティングについては、SSL 証明書のトラブルシューティングをご覧ください。