セルフマネージド SSL 証明書の使用

セルフマネージド SSL 証明書は、ご自分で取得、プロビジョニング、更新する証明書です。このリソースを使用して、クライアントとロードバランサ間の通信を保護できます。

セルフマネージド証明書には、次の証明書の種類を自由に組み合わせることができます。

  • ドメイン認証(DV)
  • 組織認証(OV)
  • 拡張認証(EV)

このページでは、有効な証明書を取得し、証明書をアップロードして Google Cloud SSL 証明書リソースを作成する手順について説明します。

始める前に

権限

このガイドのタスクを実行するには、プロジェクトで SSL 証明書を作成および変更できる必要があります。次のいずれかの役割またはタイトルがある場合は、これらの権限が付与されます。

  • プロジェクトのオーナーまたは編集者です。
  • プロジェクトで compute.loadBalancerAdmin ロールと compute.securityAdmin ロールが付与されている。
  • プロジェクトで compute.sslCertificates.* 権限と、使用しているロードバランサのタイプに応じて、compute.targetHttpsProxies.* と compute.targetSslProxies.* の一方または両方が含まれているカスタムロールがある。

ロードバランサ

特定のタイプの Google Cloud ロードバランサには、次のような SSL 証明書が必要です。

ステップ 1: 秘密鍵と証明書を作成する

すでに秘密鍵と認証局(CA)の証明書がある場合は、このセクションをスキップして SSL 証明書リソースの作成に移動します。

秘密鍵を選択または作成する

Google Cloud SSL 証明書には、PEM 形式の秘密鍵と証明書の両方が含まれます。秘密鍵は次の条件を満たす必要があります。

  • PEM 形式にする必要があります。
  • パスフレーズで保護することはできません。Google Cloud は、秘密鍵を独自の暗号化形式で保存します。
  • 暗号化アルゴリズムは、RSA-2048 または ECDSA P-256 のいずれかにする必要があります。

次の OpenSSL コマンドを使用して、PEM 形式で RSA-2048 暗号化を使用して新しい秘密鍵を作成できます。

openssl genrsa -out PRIVATE_KEY_FILE 2048

PRIVATE_KEY_FILE を新しい秘密鍵ファイルのパスとファイル名に置き換えます。

CSR を作成する

秘密鍵を取得したら、OpenSSL を使用して PEM 形式の証明書署名リクエスト(CSR)を生成できます。CSR は次の条件を満たす必要があります。

  • PEM 形式にする必要があります。
  • 共通名(CN)またはサブジェクト代替名(SAN)属性を設定する必要があります。事実上、シングル ドメイン向けの証明書であっても、CN 属性と SAN 属性の両方を設定する必要があります。macOS と iOS の最新バージョンなどの最新のクライアントは、CN 属性だけに依存することがないためです。
  1. 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
    
  2. 次の 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_1SUBJECT_ALTERNATIVE_NAME_2: 証明書のサブジェクト代替名。証明書が 1 つのホスト名のみを対象としている場合、共通名に一致する単一のサブジェクト代替名を定義するだけです。3 つ以上のサブジェクト代替名が必要な場合は、DNS の後の数値を増やして(DNS.3DNS.4 など)、構成ファイルに追加します。
  • PRIVATE_KEY_FILE: 秘密鍵ファイルのパス
  • CSR_FILE: ファイル名を含む、CSR のパス

CSR に署名する

認証局が CSR に署名すると、独自の秘密鍵を使用して証明書を作成します。

公的に信頼できる CA の使用

  • CSR に署名するよう公的に信頼できる CA にリクエストすると、その証明書はその公開 CA を信頼するすべてのクライアントによって信頼されます。
  • 署名済み証明書を作成するには、公開 CA に CSR のみが必要です。

自分の CA の管理

  • 自分の CA を管理している場合は、CSR に署名できます。これを実行すると、内部的に信頼できる証明書が作成されます。クライアントが自分の CA を信頼するように構成されている場合、これによって内部的に信頼された証明書が作成されます。

自己署名証明書の使用

  • CSR を作成するために使用した秘密鍵と同じ秘密鍵を CSR に使用して CSR に署名する場合は、自己署名証明書を作成します。クライアントが証明書の検証をスキップするように構成されていない場合、自己署名証明書は信頼されません。たとえば、ウェブブラウザ クライアントは、自己署名証明書を信頼するかどうかを尋ねるメッセージを表示します。自己署名証明書はテストにのみ使用してください。

独自の CA を管理する場合や、テスト用の自己署名証明書を作成する場合は、次の OpenSSL コマンドを使用できます。

openssl x509 -req \
    -signkey PRIVATE_KEY_FILE \
    -in CSR_FILE \
    -out CERTIFICATE_FILE \
    -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 証明書は、[負荷分散] ページの [証明書] タブで操作できます。

  1. Google Cloud Console の [証明書] ページに移動します。
    [証明書] ページに移動
  2. [SSL 証明書を作成] をクリックします。
  3. 証明書の名前と説明(省略可)を入力します。
  4. [証明書をアップロードする] を選択します。
  5. 証明書を貼り付けるか、[アップロード] をクリックして、証明書ファイルに移動します。
    証明書と同じファイルに CA 証明書チェーンを含めることもできます。Google Cloud は証明書チェーンを検証しません。検証はお客様の責任です。
  6. 秘密鍵を貼り付けるか、[アップロード] をクリックして、秘密鍵ファイルに移動します。
  7. [作成] をクリック

gcloud

外部 HTTP(S) ロードバランサまたは SSL プロキシ ロードバランサに使用できるグローバル SSL 証明書を作成するには、--global フラグを指定して gcloud compute ssl-certificates create コマンドを使用します。

gcloud compute ssl-certificates create CERTIFICATE_NAME \
    --certificate=CERTIFICATE_FILE \
    --private-key=PRIVATE_KEY_FILE \
    --global

内部 HTTP(S) ロードバランサに使用できるリージョン 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

外部 HTTPS および SSL プロキシ ロードバランサの場合は、sslCertificates.insert API メソッドを使用します。

内部 HTTPS ロードバランサの場合は、regionSslCertificates.insert API メソッドを使用します。

これらのメソッドを使用するには、API リクエストでファイルのコンテンツを送信する必要があるため、最初に証明書と秘密鍵ファイルを読み取る必要があります。コードサンプルについては、API リファレンス ページをご覧ください。

ステップ 3: SSL 証明書をターゲット プロキシに関連付ける

各 HTTPS プロキシまたは SSL プロキシに少なくとも 1 つの SSL 証明書を関連付ける必要があります。ターゲット HTTPS またはターゲット SSL プロキシごとの SSL 証明書の最大数までターゲット プロキシを構成できます。複数のセルフマネージド証明書が、同じターゲット プロキシで参照できます。

Console

Google Cloud Console を使用して既存のロードバランサを編集すると、自動的に SSL 証明書が適切なターゲット プロキシに関連付けられます。

gcloud

グローバル SSL 証明書を外部 HTTP(S) ロードバランサのターゲット 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 プロキシ ロードバランサのターゲット SSL プロキシに関連付けるには、gcloud compute target-ssl-proxies update コマンドを使用します。

gcloud compute target-ssl-proxies update TARGET_PROXY_NAME \
    --ssl-certificates=CERTIFICATE_LIST

内部 HTTP(S) ロードバランサのターゲット HTTPS プロキシにリージョン SSL 証明書を関連付けるには、--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 証明書のリージョン

ステップ 4: ロードバランサの IP アドレスを指すように DNS A および AAAA レコードを更新する

登録事業者のサイト、DNS ホスト、または ISP(DNS レコードが管理されている場所)で、ドメインとサブドメインの DNS A レコード(IPv4 の場合)および DNS AAAA レコード(IPv6 の場合)を追加または更新して、ロードバランサーの転送ルールまたはルールと関連付けられた IP アドレスを指すようにします。

Cloud DNSGoogle 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: 31748
;; flags: qr rd ra; QUERY: 1, ANSWER: 4, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 512
;; QUESTION SECTION:
;www.example.com.           IN  A

;; ANSWER SECTION:
www.example.com.        1742    IN  CNAME   www.example.com.edgekey.net.
www.example.com.edgekey.net. 21330 IN   CNAME   www.example.com.edgekey.net.globalredir.akadns.net.
www.example.com.edgekey.net.globalredir.akadns.net. 3356 IN CNAME   e6858.dsce9.akamaiedge.net.
e6858.dsce9.akamaiedge.net. 19  IN  A   203.0.113.5

;; Query time: 43 msec
;; SERVER: 8.8.8.8#53(8.8.8.8)
;; WHEN: Wed Jun 03 16:54:44 PDT 2020
;; MSG SIZE  rcvd: 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 証明書のステータスは、[負荷分散] ページの [証明書] タブで確認できます。

  1. Google Cloud Console の [証明書] ページに移動します。
    [証明書] ページに移動
  2. (省略可)SSL 証明書のリストをフィルタリングします。

gcloud

外部 HTTP(S) ロードバランサまたは SSL プロキシ ロードバランサで使用できるグローバル SSL 証明書をリスト表示するには、--global フラグを指定して、gcloud compute ssl-certificates list コマンドを使用します。

gcloud compute ssl-certificates list \
   --global

内部 HTTP(S) ロードバランサに使用できるリージョン SSL 証明書を一覧表示するには、region フィルタで、gcloud compute ssl-certificates list コマンドを使用します。

gcloud compute ssl-certificates list \
   --filter="region:(REGION ...)"

プレースホルダを有効な値に置き換えます。

  • REGION: Google Cloud のリージョン。スペース区切りリストとして複数のリージョンを含めます。

SSL 証明書を説明する

Console

SSL 証明書の詳細は、[負荷分散] ページの [証明書] タブで確認できます。

  1. Google Cloud Console の [証明書] ページに移動します。
    [証明書] ページに移動
  2. (省略可)SSL 証明書のリストをフィルタリングします。
  3. 詳細を表示するには、証明書名をクリックします。

gcloud

グローバル SSL 証明書(外部 HTTP(S) ロードバランサまたは SSL プロキシ ロードバランサの場合)の説明を表示するには、--global フラグを指定して、gcloud compute ssl-certificates describe コマンドを使用します。

gcloud  compute ssl-certificates describe CERTIFICATE_NAME \
   --global

リージョン SSL 証明書(内部 HTTP(S) ロードバランサの場合)の説明を表示するには、--region フラグを指定して、gcloud compute ssl-certificates describe コマンドを使用します。

gcloud compute ssl-certificates describe CERTIFICATE_NAME \
   --region=REGION

プレースホルダを有効な値に置き換えます。

  • CERTIFICATE_NAME: SSL 証明書の名前
  • REGION: Google Cloud のリージョン

SSL 証明書を削除する

SSL 証明書を削除する前に、証明書を参照する各ターゲット プロキシを更新する必要があります。ターゲット プロキシごとに、適切な gcloud update コマンドを実行して、削除する必要がある SSL 証明書が含まれなくなるようにターゲット プロキシの CERTIFICATE_LIST を更新します。各ターゲット SSL プロキシまたはターゲット HTTPS プロキシは、少なくとも 1 つの SSL 証明書を参照する必要があります。

ターゲット プロキシを更新した後、SSL 証明書を削除できます。

Console

SSL 証明書は、[負荷分散] ページの [証明書] タブで削除できます。

  1. Google Cloud Console の [証明書] ページに移動します。
    [証明書] ページに移動
  2. 削除する SSL 証明書を選択します。
  3. [削除] をクリックします。
  4. もう一度 [削除] をクリックして確定します。

gcloud

グローバル SSL 証明書(外部 HTTP(S) ロードバランサまたは SSL プロキシ ロードバランサの場合)を削除するには、gcloud compute ssl-certificates delete コマンドと --global コマンドを使用します。

gcloud compute ssl-certificates delete CERTIFICATE_NAME \
    --global

リージョン SSL 証明書(内部 HTTP(S) ロードバランサの場合)を削除するには、gcloud compute ssl-certificates delete コマンドと --region コマンドを使用します。

gcloud compute ssl-certificates delete CERTIFICATE_NAME \
    --region=REGION

プレースホルダを有効な値に置き換えます。

  • CERTIFICATE_NAME: SSL 証明書の名前
  • REGION: Google Cloud のリージョン

SSL 証明書の置き換え

SSL 証明書の置き換えまたはローテーションの必要がある場合は、次の手順を実行します。

  1. 新しい SSL 証明書リソースを作成する。新しい SSL 証明書には、プロジェクト内で一意の名前を付ける必要があります。
  2. ターゲット プロキシを更新し、SSL 証明書のリストの最初の場所に新しい SSL 証明書が含まれるようにして、それをプライマリ証明書にする。新しい証明書の後に、保持する必要がある既存の SSL 証明書を含めます。不要になった古い SSL 証明書は必ず除外してください。ダウンタイムを回避するには、--ssl-certificates フラグを指定して 1 つの 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) ロードバランサの場合:

    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
    
  3. 次の OpenSSL コマンドを実行して、ロードバランサが置換証明書を提供していることを確認します。

    echo | openssl s_client -showcerts -servername DOMAIN -connect IP_ADDRESS:443 -verify 99 -verify_return_error
    
  4. 15 分間待ち、すべての Google Front Ends(GFE)が置換証明書を利用できるようにします。

  5. (省略可)古い SSL 証明書を削除します。

次のステップ