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

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

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

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

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

始める前に

権限

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

  • プロジェクトのオーナーまたは編集者である。
  • プロジェクトで compute.loadBalancerAdmin ロールが割り当てられているか、compute.securityAdmin ロールと compute.networkAdmin ロールの両方が割り当てられている。
  • プロジェクトで割り当てられているカスタムロールに、compute.sslCertificates.* 権限と、compute.targetHttpsProxies.* または compute.targetSslProxies.* のいずれか、あるいはその両方(使用するロードバランサによる)が含まれている。

ロードバランサ

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

ステップ 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 属性だけに依存しないためです。
  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 を信頼するように構成されている場合は、独自の 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

リージョン SSL 証明書を内部 HTTP(S) ロードバランサのターゲット 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 証明書のリージョン(該当する場合)

ステップ 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 証明書を削除するには、まず、その証明書を参照する各ターゲット プロキシを更新する必要があります。ターゲット プロキシごとに、削除する SSL 証明書が含まれなくなるようにターゲット プロキシの CERTIFICATE_LIST を更新するために、適切な gcloud update コマンドを実行します。各ターゲット 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 フラグを指定した 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 -connect IP_ADDRESS:443 -verify 99 -verify_return_error
    
  4. 15 分間待ち、すべての Google Front End(GFE)が置換証明書を利用できるようにします。

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

次のステップ