App Engine アプリでの SSL サポートは基本の SSL より高度なもので、世界中に分散した SSL エンドポイントを使用し、負荷分散機能が組み込まれているため、アプリを世界中のユーザーに安全、確実、迅速に提供できます。
デフォルトでは、カスタム ドメインの HTTPS 接続は、マネージド SSL 証明書で自動的に有効になります。カスタム ドメインがアプリケーションにマッピングされ、お客様が DNS レコードの構成を完了すると、App Engine によってマネージド SSL 証明書がプロビジョニングされます。また、有効期限が切れる前に証明書が更新され、お客様がアプリケーションからカスタム ドメインを削除すると証明書が取り消されます。
始める前に
App Engine プロジェクトですでにカスタム ドメインを設定していることを確認します。
gcloud
ツールコマンドを使用する場合:Cloud SDK をインストールし、初期化します。
Admin API を使用する場合は、Admin API へのアクセスの前提条件に関する情報をご覧ください。
マネージド証明書のプロビジョニングを確認する
カスタム ドメインを設定して DNS レコードを更新して数分後に、マネージド SSL 証明書が自動的に提供されます。マネージド証明書には、Let's Encrypt という署名が付いています。
証明書のプロビジョニングを確認するには:
-
Google Cloud Platform Console で [App Engine] > [設定] > [カスタム ドメイン] に移動します。
-
[SSL セキュリティ] に [Google が管理] が表示されます。
-
次の
gcloud app domain-mappings
コマンドを実行して、App Engine アプリに証明書がプロビジョニングされていることを確認します。gcloud app domain-mappings list
-
ドメイン、サブドメイン、対応するすべての証明書を含むリストが表示されます。次に例を示します。
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 証明書をカスタム ドメインの既存のアプリに追加する場合は、ドメイン マッピングを更新します。
-
Google Cloud Platform Console で [App Engine] > [設定] > [カスタム ドメイン] に移動します。
-
保護するドメインを選択して、[SSL セキュリティを有効にする] をクリックします。
次の gcloud app domain-mappings
コマンドを実行して、アプリケーションに対するドメインのマッピングを更新します。
gcloud app domain-mappings update DOMAIN --certificate-management='AUTOMATIC'
ドメイン マッピングをプログラムで更新してマネージド SSL 証明書に移行する方法については、Admin API の apps.domainMappings.patch
メソッドをご覧ください。
マネージド SSL 証明書を無効にする
マネージド SSL 証明書を無効にするには:
-
Google Cloud Platform Console で [App Engine] > [設定] > [カスタム ドメイン] に移動します。
-
ドメインを選択し、[SSL セキュリティを無効にする] をクリックします。
ドメイン マッピングに関連付けられているマネージド 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'
マネージド SSL 証明書をプログラムで無効にするには、Admin API の apps.domainMappings.patch
メソッドを使用して、SSL の手動管理を指定します。
独自の SSL 証明書を使用する
マネージド SSL 証明書を使用する代わりに、お客様独自の証明書を使用することもできます。証明書に透明性の証明がない場合は、証明書の透明性の証明を適用するため、Chrome に SSL の警告が表示されることがあります。証明書の透明性の証明と準拠方法の詳細については、証明書の透明性の適用をご覧ください。
Google マネージド証明書の代わりに独自の SSL 証明書を使用して管理するには:
App Engine プロジェクトですでにカスタム ドメインを設定していることを確認します。
任意の認証局(CA)からドメインの証明書を取得します。正確な手順は認証局によって異なる場合があります。一般的な手順については、証明書の取得をご覧ください。
秘密鍵と SSL 証明書ファイルを、App Engine でサポートされている形式に変換します。ファイルをアップロードする前に、秘密鍵を RSA 秘密鍵に変換し、SSL 証明書を連結して 1 つのファイルにする必要があります。詳細については、秘密鍵の変換と SSL 証明書の連結をご覧ください。
GCP Console で、適切な権限があることを確認します。また、関連するすべてのドメインもしくは親ドメインのオーナー権限を確認します(ステップ 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 証明書をアップロードし、ドメインをアプリにマッピングします。
Console -
Google Cloud Platform Console で [App Engine] > [設定] > [SSL 証明書] に移動します。
-
[新しい証明書をアップロード] をクリックします。
-
連結された SSL 証明書(
concat.crt
など)を [PEM encoded X.509 public key certificate
] でアップロードし、RSA 秘密鍵(myserver.key.pem
など)を [暗号化されていない PEM でエンコードされた RSA 秘密鍵] でアップロードします。 - [アップロード] をクリックします。アップロードした各 SSL 証明書は、他のすべての GCP プロジェクトで表示および使用できるため、同じ証明書を繰り返しアップロードする必要はありません。
- ドメインに割り当てる証明書を選択し、[保存] をクリックしてそのドメインに対して SSL を使用します。
gcloud -
次の
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
-
-
次の
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
-
API プログラムでドメインを App Engine アプリにマッピングして SSL を使用する方法については、Admin API の
app.authorizedCertificates.create
メソッドとapp.domainMappings.create
メソッドをご覧ください。-
ブラウザで
https
(https://www.example.com
など)を使用してドメインにアクセスし、変更をテストします。
提供中の証明書から新しい証明書にマッピングを転送する
証明書の有効期限が近づいたら、新しい証明書をアップロードし、古い証明書の既存のマッピングを新しい証明書に転送する必要があります。次の手順は、既存の証明書がまだ有効で、現在カスタム ドメインに提供されていることを想定しています。
現在提供中の証明書からマッピングを転送するには:
任意の認証局(CA)からドメインの新しい証明書を取得します。一般的な手順については、証明書の取得をご覧ください。
秘密鍵と SSL 証明書ファイルを、App Engine でサポートされている形式に変換します。詳細については、秘密鍵の変換と SSL 証明書の連結をご覧ください。
RSA 秘密鍵および連結された SSL 証明書をアップロードします。
Console -
[SSL 証明書] ページで SSL 証明書をアップロードします。
[SSL 証明書] ページに移動-
[新しい証明書をアップロード] をクリックします。
-
連結された SSL 証明書(
concat.crt
など)を [PEM でエンコードされた X.509 公開鍵証明書] でアップロードし、RSA 秘密鍵(myserver.key.pem
など)を [暗号化されていない PEM で暗号化された RSA 秘密キー] でアップロードします。 - [アップロード] をクリックします。
-
- 追加した新しい証明書を証明書リストから選択し、古い証明書によって提供されているドメインを選択します。
- [保存] をクリックして、古い証明書から新しい証明書へマッピングを転送します。
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
API SSL 証明書をプログラムで更新する方法については、Admin API の
app.authorizedCertificates.patch
メソッドをご覧ください。-
証明書の取得
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 つのレベルのみをサポートします。
Strict-Transport-Security ヘッダーの使用
セキュリティ上の理由から、すべてのアプリケーションは、https
接続を使用するようクライアントに促すべきです。Strict-Transport-Security
ヘッダーを使用して、http
よりも https
を優先するようにブラウザに指示できます。
HTTP Strict Transport Security を実装する場合は注意が必要です。このヘッダーを過去に受信したことがあるクライアントは、なんらかの理由で https
が機能しない、無効になるなどの状態になると、接続を拒否します。詳細については、HTTP Strict Transport Security のクイック リファレンスをご覧ください。