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

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

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

このページでは、カスタム ドメインに SSL が設定されているかどうか確認する方法、管理対象の SSL 証明書にアップグレードする方法、独自の SSL 証明書を使用する方法について説明します。

始める前に

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

  • gcloud ツールコマンドを使用する場合は、次のようにします。

    1. Cloud SDK をインストールし、初期化します。

      ダウンロードとインストール

    2. 次を実行してベータ版コンポーネントをインストールします。

      gcloud components install beta
      
  • Admin API を使用する場合は、Admin API へのアクセスの前提条件に関する情報を参照してください。

管理対象の証明書がプロビジョニングされていることを確認する

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

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

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

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

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

    Google 管理の SSL セキュリティ

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

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

    ID               SSL_CERTIFICATE_ID
    example.com      123456
    www.example.com  234567

管理対象の SSL 証明書のトラブルシューティング

管理対象の証明書を確認できない場合、カスタム ドメインの DNS レコードの更新が必要になる可能性があります。これらのレコードが利用できない場合、App Engine は証明書のプロビジョニングを実行できません。

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

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

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

管理対象の SSL 証明書にアップグレードする

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

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

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

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

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

gcloud

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

gcloud beta 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 beta app domain-mappings コマンドを実行します。

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

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

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

独自の 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 beta 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. 先に生成した秘密鍵ファイルを、App Engine でサポートされている暗号化されていない 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 スタンダード環境