SSL によるカスタム ドメインの保護

App Engine アプリでの SSL サポートは基本の SSL より高度なもので、世界中に分散した SSL エンドポイントを使用し、負荷分散機能が組み込まれているため、アプリを世界中のユーザーに安全、確実、迅速に提供できます。

デフォルトでは、カスタム ドメインの HTTPS 接続は、マネージド SSL 証明書で自動的に有効になります。カスタム ドメインがアプリケーションにマッピングされ、DNS レコードが構成されると、App Engine はマネージド SSL 証明書をプロビジョニングし、有効期限が切れる前に証明書の更新処理を行います。また、アプリケーションからカスタム ドメインが削除されたときは、証明書を取り消します。

始める前に

マネージド証明書がプロビジョニングされていることを確認する

カスタム ドメインを設定して DNS レコードを更新して数分後に、マネージド SSL 証明書が自動的に提供されます。マネージド証明書には、Let's Encrypt という署名が付いています。

証明書のプロビジョニングを確認するには:

Console
  1. Google Cloud Platform Console で [App Engine] > [設定] > [カスタム ドメイン] に移動します。

    [カスタム ドメイン] ページに移動

  2. [SSL セキュリティ] に「Google が管理」が表示されます。

    Google 管理の SSL セキュリティ

gcloud
  1. 次の gcloud app domain-mappings コマンドを実行して、App Engine アプリ用の証明書がプロビジョニングされていることを確認します。

    gcloud app domain-mappings list
  2. ドメイン、サブドメイン、対応するすべての証明書を含むリストが表示されます。次に例を示します。

    ID               SSL_CERTIFICATE_ID
    example.com      123456
    www.example.com  234567
    証明書のプロビジョニングには数分かかる場合があります。この間、証明書は PENDING_AUTO_CERT と表示されます。

マネージド SSL 証明書のトラブルシューティング

  • ドメイン名を確認するため、カスタム ドメインの DNS レコードの更新が必要になる場合があります。App Engine は未確認のドメインの証明書をプロビジョニングできません。

  • Admin API で証明書のステータスを確認するには、AuthorizedCertificate.GET リクエストを使用します。

  • DNS レコードが使用できないためにマネージド証明書がプロビジョニングされていない場合は、ManagedCertificate.ManagementStatus フィールドが FAILED_RETRYING_NOT_VISIBLE になっている可能性があります。DNS レコードが最新の状態であることを確認し、数分待ってから、もう一度試してください。DNS レコードが利用可能になるまでに、最大で 24 時間かかることがあります。

  • ステータスが FAILED_PERMANENT の場合、更新の試行がすベて失敗しています。DNS の設定を確認し、マネージド SSL 証明書の更新の手順に沿ってカスタム ドメインのマッピングを更新します。

マネージド SSL 証明書にアップグレードする

Google が管理する SSL 証明書にアップグレードする前に、マネージド証明書がワイルドカード マッピングをサポートしていないことに注意してください。

サブドメインを使用している場合、マネージド証明書には上限(ベースドメインごとに週あたり 20 個)があります。上限に達した場合、App Engine はすべてのリクエストの処理が完了するまで、マネージド証明書を発行しようとし続けます。

独自の SSL 証明書から Google が管理する SSL 証明書に移行する場合や、マネージド SSL 証明書をカスタム ドメインの既存のアプリに追加する場合には、ドメイン マッピングを更新します。

Console
  1. Google Cloud Platform Console で [App Engine] > [設定] > [カスタム ドメイン] に移動します。

    [カスタム ドメイン] ページに移動

  2. 保護するドメインを選択して、[SSL セキュリティを有効にする] をクリックします。

    [カスタム ドメイン] ページで SSL セキュリティを有効にする

gcloud

次の gcloud app domain-mappings コマンドを実行して、ドメインからアプリケーションへのマッピングを更新します。

gcloud app domain-mappings update DOMAIN --certificate-management='AUTOMATIC'
API

ドメイン マッピングをプログラムで更新し、マネージド SSL 証明書に移行するには、Admin API の apps.domainMappings.patch メソッドを参照してください。

マネージド SSL 証明書を無効にする

マネージド SSL 証明書を無効にするには:

Console
  1. Google Cloud Platform Console で [App Engine] > [設定] > [カスタム ドメイン] に移動します。

    [カスタム ドメイン] ページに移動

  2. ドメインを選択し、[SSL セキュリティを無効にする] をクリックします。

    [カスタム ドメイン] ページで SSL セキュリティを無効にする

gcloud

ドメイン マッピングに関連付けられているマネージド SSL 証明書を無効にできます。あるいは、カスタム ドメインをマッピングするときに、マネージド SSL 証明書を使用しないように選択することもできます。

  • 既存のマッピングから証明書を削除するには、次の gcloud app domain-mappings コマンドを実行します。

    gcloud app domain-mappings update DOMAIN --certificate-management='MANUAL'
    
  • 新しいカスタム ドメインを最初にアプリケーションにマッピングするときに、マネージド SSL 証明書を使用しないように指定するには、次のようにします。

    gcloud app domain-mappings create DOMAIN --certificate-management='MANUAL'
    
API

マネージド SSL 証明書をプログラムで無効にするには、Admin API の apps.domainMappings.patch メソッドを使用して、SSL の手動管理を指定します。

独自の SSL 証明書を使用する

マネージド SSL 証明書を使用する代わりに、独自の証明書を使用できます。証明書に透明性の証明がない場合は、証明書の透明性の証明を適用するため、アプリによって Chrome に SSL の警告が表示されることがあります。証明書の透明性の証明と準拠方法の詳細については、証明書の透明性の適用をご覧ください。

Google マネージド証明書の代わりに独自の SSL 証明書を使用して管理するには:

  1. App Engine プロジェクトですでにカスタム ドメインを設定していることを確認します。

  2. デフォルトの Google 管理証明書を無効にします

  3. 任意の認証局(CA)からドメインの証明書を取得します。正確な手順は認証局によって異なる場合があります。一般的な手順については、証明書の取得をご覧ください。

  4. 秘密鍵と SSL 証明書ファイルを App Engine でサポートされている形式に変換します。ファイルをアップロードする前に、秘密鍵を RSA 秘密鍵に変換し、SSL 証明書を 1 つのファイルに連結する必要があります。詳細については、秘密鍵の変換と SSL 証明書の連結をご覧ください。

  5. GCP Console で適切な権限があることを確認します。また、関連するすべてのドメインまたは親ドメインの所有権を確認(手順 3)します。次に例を示します。

    • www.example.com を対象とする証明書の場合、www.example.com または example.com のいずれかの所有権を確認します。
    • www.example.comsub.example.com を対象とする証明書の場合、www.example.comsub.example.com の両方の所有権、または example.com の所有権を確認します。
    • *.example.com を対象とする証明書の場合、example.com の所有権を確認する必要があります。
  6. 秘密鍵と SSL 証明書をアップロードし、ドメインをアプリにマッピングします。

    Console
    1. Google Cloud Platform Console で [App Engine] > [設定] > [SSL 証明書] の順に移動します。

      [SSL 証明書] ページに移動

    2. [新しい証明書をアップロード] をクリックします。

      証明書のアップロード
    3. [PEM encoded X.509 public key certificate] で連結された SSL 証明書をアップロードし(concat.crt など)、[復号化された PEM でエンコードされた RSA 秘密鍵] で RSA 秘密鍵をアップロードします(myserver.key.pem など)。
    4. [アップロード] をクリックします。アップロードした各 SSL 証明書は、他のすべての GCP プロジェクトで表示および使用できるため、同じ証明書を繰り返しアップロードする必要はありません。
    5. ドメインに割り当てる証明書を選択し、[保存] をクリックしてそのドメインに対して SSL を使用します。
    gcloud
    1. 次の gcloud app ssl-certificates コマンドを実行して、SSL 証明書と秘密鍵をアップロードします。
      gcloud app ssl-certificates create --display-name CERT_DISPLAY_NAME --certificate CERT_DIRECTORY_PATH --private-key KEY_DIRECTORY_PATH

      ここで、

      • CERT_DISPLAY_NAME は、証明書用に選択した表示名です。
        例: example.com
      • CERT_DIRECTORY_PATH は、証明書のディレクトリ パスとファイル名です。
        例: ./cert.crt
      • KEY_DIRECTORY_PATH は、秘密鍵のディレクトリ パスとファイル名です。
        例: ./private.key

      例:

      gcloud app ssl-certificates create --display-name example.com --certificate ./cert.crt --private-key ./private.key
    2. 次の gcloud app domain-mappings コマンドを実行して、SSL を使用するドメインと App Engine アプリの間のマッピングを作成します。
      gcloud app domain-mappings create DOMAIN --certificate-id CERT_ID

      ここで、

      • DOMAIN は、App Engine アプリにマッピングするドメインです。
        例: *.example.com

        ヒント: ワイルドカード マッピングを使用しているときにエラーが発生した場合は、ドメインを引用符で囲みます('*.example.com')。

      • CERT_ID は、SSL に使用する証明書の ID です。
        例: --certificate-id 1234

      例:

      gcloud app domain-mappings create '*.example.com' 1234

  7. ブラウザで https://www.example.com のように https を使用してカスタム ドメインにアクセスし、変更をテストします。

提供する証明書から新しい証明書へマッピングを転送する

証明書の有効期限が近づいたら、新しい証明書をアップロードし、古い証明書の既存のマッピングを新しい証明書に転送する必要があります。次の手順は、既存の証明書がまだ有効で、現在カスタム ドメインに提供されていることを想定しています。

現在提供中の証明書からマッピングを転送する場合:

  1. 任意の認証局(CA)からドメインの新しい証明書を取得します。一般的な手順については、証明書の取得をご覧ください。

  2. 秘密鍵と SSL 証明書ファイルを App Engine でサポートされている形式に変換します。詳細については、秘密鍵の変換と SSL 証明書の連結をご覧ください。

  3. RSA 秘密鍵と連結された SSL 証明書をアップロードします。

    Console
    1. [SSL 証明書] ページで SSL 証明書をアップロードします。

      [SSL 証明書] ページに移動
      1. [新しい証明書をアップロード] をクリックします。

        証明書のアップロード
      2. [PEM でエンコードされた X.509 公開鍵証明書] で連結された SSL 証明書をアップロードし(concat.crt など)、[復号化された PEM でエンコードされた RSA 秘密鍵] で RSA 秘密鍵をアップロードします(myserver.key.pem など)。
      3. [アップロード] をクリックします。
    2. 追加した新しい証明書を証明書リストから選択し、古い証明書によって提供されているドメインを選択します。
    3. [保存] をクリックして、古い証明書から新しい証明書へマッピングを転送します。
    gcloud

    次の gcloud app ssl-certificates コマンドを実行して、SSL 証明書と秘密鍵を更新します。

    gcloud app ssl-certificates update CERT_ID --certificate CERT_DIRECTORY_PATH --private-key KEY_DIRECTORY_PATH

    ここで、

    • CERT_ID は、更新する SSL 証明書の ID です。
      例: 1234
    • CERT_DIRECTORY_PATH は、SSL 証明書のディレクトリ パスとファイル名です。
      例: ./cert.crt
    • KEY_DIRECTORY_PATH は、秘密鍵のディレクトリ パスとファイル名です。
      例: ./private.key

    例:

    gcloud app ssl-certificates update 1234 --certificate ./cert.crt --private-key ./private.key

証明書の取得

SSL 証明書を取得するためのプロセスは、使用する認証局によって異なります。ここに記載された手順は、多少調整が必要となる場合があります。通常、各認証局から、プロセスの指示が提供されます。

App Engine アプリで使用する証明書を取得するには、次の手順を行います。

  1. openssl ツールを使用して、秘密鍵と証明書署名リクエスト(CSR)を生成します。

    1. server.csr ファイルを作成するディレクトリから次のコマンドを実行します。

      openssl req -nodes -newkey rsa:2048 -keyout [MY_PRIVATE_KEY].key -out [MY_CSR].csr
      

      ここで:

      • [MY_PRIVATE_KEY].key は、秘密鍵が格納される生成ファイルです。例: myserver.key
      • [MY_CSR].csr は、証明書署名リクエストのために生成されたファイルです。例: server.csr
    2. プロンプトが表示されたら、次の情報を入力します。

      • 2 桁の国コード(米国の場合は US など)。
      • 市区町村。
      • 会社名。会社がない場合は、自分の名前を使用することができます。
      • 組織部門。ない場合は「NA」。
      • ドメインを表す共通名(www.example.com など)。
      • メールアドレス。

    他の値は、指定する必要がなく、すべてオプションです。

  2. どの認証機関が適しているかを決定し、証明書を購入します。たとえば、SSLMateThawteComodo などの認証機関を使用できます。

    サポートされている証明書の種類の詳細については、App Engine の SSL 証明書のサポートをご覧ください。

  3. CA が CSR ファイルの内容をリクエストしたら、指示に従って、先に生成した .csr ファイル(server.csr など)の内容をコピーして貼り付けます。

  4. CA がドメイン所有者の承認をリクエストしたら、プロンプトに従います。

    ヒント: メールの承認方法を使用するのが最も簡単です。CA の承認リクエストを受信して対応できるように、ドメイン アカウントにメールアドレス(admin@example.com など)を設定する必要があります。

    注: 証明書のリクエストを送信すると、CA から実際の証明書を受け取るまで数日かかることがあります。

  5. ドメイン所有者の承認を得た後、CA は証明書を送信します。これは通常、.zip ファイル形式です。そのファイルを作業ディレクトリに解凍して、これらの証明書を連結して App Engine にアップロードできるようにします。

秘密鍵の変換と SSL 証明書の連結

秘密鍵と SSL 証明書を App Engine にアップロードする前に、秘密鍵を RSA 秘密鍵に変換して、すべての SSL 証明書を連結する必要があります。

  1. 前に生成した秘密鍵ファイルを、暗号化されていない RSA 秘密鍵に変換します。たとえば、次の openssl rsa コマンドを実行できます。

    openssl rsa -in [MY_PRIVATE_KEY].key -out [MY_RSA_KEY].key.pem
    

    ここで:

    • [MY_PRIVATE_KEY].key は、秘密鍵が格納された生成ファイルです。例: myserver.key
    • [MY_RSA_KEY].key は、暗号化されていない RSA 秘密鍵を含む生成ファイルです。例: myserver.key.pem

    例:

    openssl rsa -in myserver.key -out myserver.key.pem
    
  2. 次のコマンドを使用して、CA のすべての .crt ファイルを 1 つのファイルに連結します。

    cat [MY_DOMAIN_CERT].crt [MY_SecureServerCA].crt [MY_TrustCA].crt [MY_TrustExternalCARoot].crt > [MY_CONCAT_CERT].crt
    

    ここで、

    • [MY_DOMAIN_CERT].crt は、ドメインの証明書です。例: www_example_com.crt
    • [MY_SecureServerCA].crt[MY_TrustCA].crt、および [MY_TrustExternalCARoot].crt は、CA が提供するその他の証明書ファイルです。
    • [MY_CONCAT_CERT].crt は、CA からのすべての .crt 証明書ファイルを含む連結ファイルです。例: concat.crt

    例:

    cat www_example_com.crt AddTrustExternalCARoot.crt RSADomainValidationSecureServerCA.crt RSAAddTrustCA.crt > concat.crt
    
  3. SSL 証明書と秘密鍵を確認します。

    1. 秘密鍵と証明書が一致することを確認するために、openssl x509 コマンドと openssl rsa コマンドを使用できます。次に例を示します。

      openssl x509 -noout -modulus -in concat.crt | openssl md5
      openssl rsa -noout -modulus -in myserver.key.pem | openssl md5
      

      openssl x509 コマンドと openssl rsa コマンドは、いずれも同じ出力を返すはずです。

    2. 証明書とその CA チェーンが有効であることを確認するには、openssl verify コマンドを使用します。次に例を示します。

      openssl verify -verbose -CAfile concat.crt concat.crt
      
  4. 準備ができたら、RSA 秘密鍵と連結された証明書を App Engine にアップロードできます

App Engine での SSL 証明書のサポート

App Engine は次の種類の証明書をサポートします。

  • 単一のドメイン / ホスト名
  • 自己署名
  • ワイルドカード
  • サブジェクト代替名(SAN)/ マルチドメイン

証明書と鍵について、次のことが必要です。

  • 秘密鍵と証明書は、PEM 形式にしてアップロードしてください。
  • 秘密鍵は暗号化しないでください。
  • 証明書ファイルに格納できる証明書の数は最大で 5 つです。この数にはチェーン証明書と中間証明書が含まれます。
  • ホスト証明書のすべてのサブジェクト名は、ユーザーの確認済みのドメインと一致するか、そのサブドメインである必要があります。
  • 秘密鍵では RSA 暗号化を使用する必要があります。
  • 鍵の最大許容モジュラス: 2048 ビット

ホスト証明書が中間証明書またはチェーン証明書(多くの認証局が発行)を必要とする場合、公開証明書ファイルの最後に中間証明書またはチェーン証明書を追加する必要があります。

一部の App Engine 機能では特殊サブドメインを使用します。たとえば、サブドメインを使用して、アプリケーション サービスに対応したり、アプリケーションの異なるバージョンに対応することができます。これらを SSL で使用するには、SAN またはワイルドカード証明書を設定するのが適切です。ワイルドカード証明書は、サブドメインの 1 つのレベルのみをサポートします。

Strict-Transport-Security ヘッダーの使用

セキュリティ上の理由から、すべてのアプリケーションは、https 接続を使用するようクライアントに促すべきです。Strict-Transport-Security ヘッダーを使用して、https よりも http を優先するようにブラウザに指示できます。

HTTP Strict Transport Security を実装する場合は注意が必要です。このヘッダーを過去に受信したことがあるクライアントは、何かの理由で https が機能しなくなったり無効になったりすると、接続を拒否します。詳細については、HTTP Strict Transport Security のクイック リファレンスをご覧ください。

このページは役立ちましたか?評価をお願いいたします。

フィードバックを送信...

Go の App Engine スタンダード環境