App Engine アプリでの SSL サポートは基本の SSL より高度なもので、世界中に分散した SSL エンドポイントを使用し、ロード バランシング機能が組み込まれているため、アプリを世界中のユーザーに安全、確実、迅速に提供できます。
デフォルトでは、カスタム ドメインの HTTPS 接続は、マネージド SSL 証明書で自動的に有効になります。カスタム ドメインがアプリケーションにマッピングされ、お客様が DNS レコードの構成を完了すると、App Engine によってマネージド SSL 証明書がプロビジョニングされます。また、有効期限が切れる前に証明書が更新され、お客様がアプリケーションからカスタム ドメインを削除すると証明書が取り消されます。
始める前に
App Engine プロジェクトですでにカスタム ドメインを設定していることを確認します。
Cloud Load Balancing とサーバーレス NEG を使用して App Engine アプリにトラフィックをルーティングする場合は、カスタム ドメインをアプリに直接マッピングするのではなく、ロードバランサにマッピングし、ロードバランサ用に作成された SSL 証明書を使用することを推奨します。これにより、サーバーレス アプリごとに個別の SSL 証明書を管理する必要がなくなります。さらに、Cloud Load Balancing を使用すると、ロードバランサがクライアントとネゴシエートする際に使用する SSL の機能を制御する SSL ポリシーを設定できます。詳しくは次のページをご覧ください。
次の制限に注意してください。
- アプリがロードバランサ(および使用している場合は VPC)から送信されたリクエストのみを受信するように、上り(内向き)制御を使用することをおすすめします。使用しない場合、ユーザーはアプリの App Engine URL を使用して、ロードバランサ、Google Cloud Armor セキュリティ ポリシー、SSL 証明書、ロードバランサを経由して渡される秘密鍵をバイパスできます。
マネージド証明書のプロビジョニングを確認する
カスタム ドメインを設定して DNS レコードを更新して数分後に、マネージド SSL 証明書が自動的に提供されます。マネージド証明書は、Google Trust Services(GTS)または Let's Encrypt によって署名されています。
証明書のプロビジョニングを確認するには:
-
Google Cloud Console で [App Engine] > [設定] > [カスタム ドメイン] に移動します。
-
[SSL セキュリティ] に、[Google が管理] として表示されます。
マネージド 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 証明書をカスタム ドメインの既存のアプリに追加する場合は、ドメイン マッピングを更新します。
-
Google Cloud Console で [App Engine] > [設定] > [カスタム ドメイン] に移動します。
-
保護するドメインを選択して、[マネージド セキュリティを有効にする] をクリックします。
マネージド SSL 証明書を無効にする
マネージド SSL 証明書を無効にするには:
-
Google Cloud Console で [App Engine] > [設定] > [カスタム ドメイン] に移動します。
-
ドメインを選択し、[マネージド セキュリティを無効にする] をクリックします。
独自の SSL 証明書を使用する
マネージド SSL 証明書を使用する代わりに、お客様独自の証明書を使用することもできます。証明書に透明性の証明がない場合は、証明書の透明性の証明が強制的に適用されているために、Chrome に SSL の警告が表示されることがあります。証明書の透明性の証明と準拠方法の詳細については、証明書の透明性の強制適用をご覧ください。
Google マネージド証明書の代わりに独自の SSL 証明書を使用して管理するには:
App Engine プロジェクトですでにカスタム ドメインを設定していることを確認します。
任意の認証局(CA)からドメインの証明書を取得します。正確な手順は認証局によって異なる場合があります。一般的な手順については、証明書の取得をご覧ください。
秘密鍵と SSL 証明書ファイルを、App Engine でサポートされている形式に変換します。ファイルをアップロードする前に、秘密鍵を RSA 秘密鍵に変換し、SSL 証明書を連結して 1 つのファイルにする必要があります。詳細については、秘密鍵の変換と SSL 証明書の連結をご覧ください。
コンソールで適切な権限があることを確認します。また、関連するすべてのドメインもしくは親ドメインの所有権が確認済みであることが必要です(ステップ 3)。例:
www.example.com
を対象とする証明書の場合、www.example.com
またはexample.com
のいずれかのオーナー権限を確認します。www.example.com
とsub.example.com
を対象とする証明書の場合、www.example.com
sub.example.com
の両方の所有権、またはexample.com
のいずれかの所有権を確認します。*.example.com
を対象とする証明書の場合、example.com
の所有権を確認する必要があります。
秘密鍵と SSL 証明書をアップロードし、ドメインをアプリにマッピングします。
-
Google Cloud Console で [App Engine] > [設定] > [SSL 証明書] に移動します。
-
[新しい証明書をアップロード] をクリックします。
- 連結された SSL 証明書(
concat.crt
など)を [PEM encoded X.509 public key certificate
] でアップロードし、RSA 秘密鍵(myserver.key.pem
など)を [復号化された PEM でエンコードされた RSA 秘密鍵] でアップロードします。 - [アップロード] をクリックします。アップロードした各 SSL 証明書は他のすべての Cloud プロジェクトで表示し、使用できるため、同じ証明書を繰り返しアップロードする必要はありません。
- ドメインに割り当てる証明書を選択し、[保存] をクリックしてそのドメインに対して SSL を使用します。
-
ブラウザで
https
(https://www.example.com
など)を使用してドメインにアクセスし、変更内容をテストします。
提供中の証明書から新しい証明書にマッピングを転送する
証明書の有効期限が近づいたら、新しい証明書をアップロードし、古い証明書の既存のマッピングを新しい証明書に転送する必要があります。次の手順は、既存の証明書がまだ有効で、現在カスタム ドメインに提供されていることを想定しています。
現在提供中の証明書からマッピングを転送するには:
任意の認証局(CA)からドメインの新しい証明書を取得します。一般的な手順については、証明書の取得をご覧ください。
秘密鍵と SSL 証明書ファイルを、App Engine でサポートされている形式に変換します。詳細については、秘密鍵の変換と SSL 証明書の連結をご覧ください。
RSA 秘密鍵と連結された SSL 証明書をアップロードします。
-
[SSL 証明書] ページで SSL 証明書をアップロードします。
[SSL 証明書] ページに移動-
[新しい証明書をアップロード] をクリックします。
-
連結された SSL 証明書(
concat.crt
など)を [PEM でエンコードされた X.509 公開鍵証明書] でアップロードし、RSA 秘密鍵(myserver.key.pem
など)を [復号化された PEM でエンコードされた RSA 秘密鍵] でアップロードします。 - [アップロード] をクリックします。
-
- 追加した新しい証明書を証明書リストから選択し、古い証明書によって提供されているドメインを選択します。
- [保存] をクリックして、古い証明書から新しい証明書へマッピングを転送します。
-
証明書の取得
SSL 証明書を取得するためのプロセスは、使用する認証局によって異なります。ここに記載された手順は、多少調整が必要となる場合があります。通常、プロセスの指示は各認証局から提供されます。
App Engine アプリで使用する証明書を取得するには:
openssl ツールを使用して、秘密鍵と証明書署名リクエスト(CSR)を生成します。
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 桁の国コード(米国の場合は
US
など)。 - 市区町村。
- 会社名。会社がない場合は、自分の名前を使用できます。
- 組織部門。ない場合は「
NA
」。 - ドメインを表す共通名(
www.example.com
など)。 - メールアドレス。
他の値は指定する必要がなく、すべてオプションです。
- 2 桁の国コード(米国の場合は
どの認証局が適しているかを判断し、証明書を購入します。たとえば、SSLMate、Thawte、Comodo などの認証局を使用できます。
サポートされている証明書の種類の詳細については、App Engine の SSL 証明書のサポートをご覧ください。
CA(認証局)から CSR ファイルの内容を求められた場合は、指示に従って、先に生成した
.csr
ファイル(server.csr
など)の内容をコピーして貼り付けます。CA からドメイン所有者の承認を求められた場合は、プロンプトに従います。
ヒント: メールの承認方法を使用するのが最も簡単です。CA の承認リクエストを受信して対応できるように、ドメイン アカウントにメールアドレス(
admin@example.com
など)を構成する必要があります。ドメイン所有者として承認した後、CA から証明書が送信されます。これは通常、
.zip
ファイル形式です。そのファイルを作業ディレクトリに解凍し、証明書を連結して App Engine にアップロードできるようにします。
秘密鍵の変換と SSL 証明書の連結
秘密鍵と SSL 証明書を App Engine にアップロードする前に、秘密鍵を RSA 秘密鍵に変換して、すべての SSL 証明書を連結する必要があります。
先に生成した秘密鍵ファイルを、暗号化されていない 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
次のコマンドを使用し、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
SSL 証明書と秘密鍵を確認します。
秘密鍵と証明書が一致することを確認するには、
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 コマンドの両方が同じ出力を返します。
証明書とその CA チェーンが有効であることを確認するには、openssl verify コマンドを使用します。次に例を示します。
openssl verify -verbose -CAfile concat.crt concat.crt
App Engine での SSL 証明書のサポート
App Engine は次の種類の証明書をサポートします。
- 単一のドメイン / ホスト名
- 自己署名
- ワイルドカード
- サブジェクト代替名(SAN)/ マルチドメイン
証明書と鍵について、次のことが必要です。
- 秘密鍵と証明書は、PEM 形式にしてアップロードしてください。
- 秘密鍵は暗号化しないでください。
- 証明書ファイルに格納できる証明書の数は最大で 5 つです。この数にはチェーン証明書と中間証明書が含まれます。
- ホスト証明書のサブジェクト名はすべて、ユーザーの確認済みのドメインと一致するか、そのサブドメインである必要があります。
- 秘密鍵では RSA 暗号化を使用する必要があります。
- 鍵の最大許容モジュラス: 2048 ビット
ホスト証明書が中間証明書またはチェーン証明書(多くの認証局が発行)を必要とする場合、公開証明書ファイルの最後に中間証明書またはチェーン証明書を追加する必要があります。
一部の App Engine 機能では特殊サブドメインを使用します。たとえば、サブドメインを使用して、アプリケーション サービスに対応したり、アプリケーションの異なるバージョンに対応したりできます。これらを SSL で使用するには、SAN またはワイルドカード証明書を設定するのが適切です。ワイルドカード証明書は、サブドメインの 1 つのレベルのみをサポートします。
カスタム SSL 証明書の削除
カスタム SSL 証明書の使用を停止するには、次の手順を行います。
コンソールで、App Engine SSL 証明書の設定ページに移動します。
ドメインから削除する証明書をクリックします。
SSL 証明書を使用しなくなったドメイン名の選択を解除し、[保存] をクリックします。
Strict-Transport-Security ヘッダーの使用
セキュリティ上の理由から、すべてのアプリケーションは、https
接続を使用するようクライアントに促すべきです。http
よりも https
を優先するようにブラウザへ指示するには、Strict-Transport-Security
ヘッダーを使用します。
有効な TLS バージョンと暗号の表示
パソコンに
nmap
Network Mapper がまだインストールされていない場合は、インストールします。インストール手順については、https://nmap.org/ をご覧ください。アプリで有効になっている TLS バージョンと暗号を確認するには、次のコマンドを入力します。
nmap -sV --script ssl-enum-ciphers -p 443 hostname
hostname
はアプリのホスト名に置き換えます。カスタム ドメインか、App Engine がアプリに作成したappspot.com
ホスト名を使用できます。例:nmap -sV --script ssl-enum-ciphers -p 443 example.uc.r.appspot.com
TLS バージョンと暗号の無効化
Cloud Load Balancing とサーバーレス NEGS を使用して App Engine アプリにトラフィックをルーティングする場合は、SSL セキュリティ ポリシーを定義することによって、TLS バージョンまたは暗号を無効にできます。SSL セキュリティ ポリシーは、HTTPS または SSL 接続に使用できる TLS のバージョンと暗号を指定します。