App Engine 對應用程式提供 SSL 支援服務,可透過遍布世界各地的 SSL 端點和內建的負載平衡技術,發揮超越基本 SSL 的成效,讓您的應用程式能夠安全、可靠又迅速地服務全世界的目標對象。
根據預設,系統會使用代管安全資料傳輸層 (SSL) 憑證,自動啟用您自訂網域上的 HTTPS 連線。只要您將自訂網域對應到您的應用程式並設定 DNS 記錄,App Engine 就會佈建代管安全資料傳輸層 (SSL) 憑證、在憑證到期前處理憑證的續購事宜,以及在您將自訂網域從應用程式移除時撤銷憑證。
事前準備
確認您已在 App Engine 專案中設定自訂網域。
如果您選擇使用
gcloud
工具指令:安裝並初始化 Cloud SDK:
如果您選擇使用 Admin API,請查看存取 Admin API 一文中的必要條件資訊。
確認代管憑證已佈建完成
在您設定自訂網域並更新 DNS 記錄後,系統會在幾分鐘內自動提供代管安全資料傳輸層 (SSL) 憑證。代管憑證由 Let's Encrypt 簽署。
如何確認憑證已佈建:
-
在 Google Cloud Platform 主控台中,依序點選 [App Engine] > [Settings] (設定) > [Custom Domains] (自訂網域):
-
「SSL security」(SSL 安全性) 應顯示為「Google managed」(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 主控台中,依序點選 [App Engine] > [Settings] (設定) > [Custom Domains] (自訂網域):
-
選取您要保護的網域,並按一下 [Enable SSL security] (啟用 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 主控台中,依序點選 [App Engine] > [Settings] (設定) > [Custom Domains] (自訂網域):
-
選取網域,然後按一下 [Disable SSL security] (停用 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 強制要求憑證透明化證明,而在 Chrome 中顯示安全資料傳輸層 (SSL) 警告。如要進一步瞭解憑證透明化證明及符合相關要求的方式,請參閱強制要求憑證透明化一文。
如要使用及管理自己的安全資料傳輸層 (SSL) 憑證,而非 Google 代管憑證:
確認您已在 App Engine 專案中設定自訂網域。
請向您選擇的憑證授權單位 (CA) 取得網域憑證。確切的程序可能因授權單位而異,但仍建議您參閱取得憑證一文來瞭解一般步驟。
將您的私密金鑰與安全資料傳輸層 (SSL) 憑證檔案轉換成 App Engine 支援的格式。您必須先將私密金鑰轉換成 RSA 私密金鑰,並將安全資料傳輸層 (SSL) 憑證串聯成單一檔案,接著才能上傳檔案。詳情請參閱轉換私密金鑰及串聯安全資料傳輸層 (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) 憑證,然後將您的網域對應至應用程式:
主控台 -
在 Google Cloud Platform 主控台中,前往「App Engine」 >「Settings」(設定) >「SSL certificates」(SSL 憑證):
-
按一下 [Upload a new certificate] (上傳新憑證)。
- 針對
PEM encoded X.509 public key certificate
(PEM 編碼 X.509 公用金鑰憑證) 上傳串聯 SSL 憑證,例如concat.crt
。接下來,針對「Unencrypted PEM encoded RSA private key」(未加密的 PEM 編碼 RSA 私密金鑰) 上傳 RSA 私密金鑰,例如myserver.key.pem
。 - 按一下 [Upload] (上傳)。每個您上傳的安全資料傳輸層 (SSL) 憑證都會顯示,並且可供所有其他的 GCP 專案使用,因此您不必重複上傳相同的憑證。
- 選取您要指派到網域的憑證,然後按一下 [Save] (儲存),將安全資料傳輸層 (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) 憑證:
主控台 -
在「SSL certificates」(SSL 憑證) 頁面上傳安全資料傳輸層 (SSL) 憑證。
前往「SSL certificates」(SSL 憑證) 頁面-
按一下 [Upload a new certificate] (上傳新憑證)。
- 針對「PEM encoded X.509 public key certificate」(PEM 編碼 X.509 公用金鑰憑證) 上傳串聯 SSL 憑證,例如
concat.crt
。接下來,針對「Unencrypted PEM encoded RSA private key」(未加密的 PEM 編碼 RSA 私密金鑰) 上傳 RSA 私密金鑰,例如myserver.key.pem
。 - 按一下 [Upload] (上傳)。
-
- 從憑證清單選取您剛剛新增的新憑證,然後選取舊憑證服務的網域。
- 按一下 [Save] (儲存),將對應關係從舊憑證轉移到新憑證。
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) 憑證一文。
當憑證授權單位要求您提供 CSR 檔案的內容時,請按照他們的操作說明,將之前產生的
.csr
檔案 (例如server.csr
) 內容複製貼上。當您的憑證授權單位要求網域擁有者核准時,請按照提示操作。
提示:您可能會發現,使用電子郵件進行核准最為簡單方便。您必須在網域帳戶中設定電子郵件地址 (例如
admin@example.com
),以接收及回覆憑證授權單位的核准要求。在您提供網域擁有者核准後,憑證授權單位就會將憑證傳送給您,檔案格式通常為
.zip
。請將該檔案解壓縮到工作目錄,以將這些憑證串聯在一起並上傳到 App Engine。
轉換私密金鑰及串聯安全資料傳輸層 (SSL) 憑證
您必須將私密金鑰轉換成 RSA 私密金鑰,並串聯所有的安全資料傳輸層 (SSL) 憑證,才能將私密金鑰和安全資料傳輸層 (SSL) 憑證上傳到 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
執行下列指令,將憑證授權單位發出的所有
.crt
檔案串聯成一個檔案: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
是您的憑證授權單位提供的其他憑證檔案。[MY_CONCAT_CERT].crt
是串聯檔案,內含憑證授權單位發出的所有.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 指令應會傳回相同的輸出內容。
如要驗證某憑證與該憑證的憑證授權單位串連是否有效,您可以執行 openssl verify 指令。例如:
openssl verify -verbose -CAfile concat.crt concat.crt
準備就緒後,即可將您的 RSA 私密金鑰和串聯的憑證上傳到 App Engine。
App Engine 支援的安全資料傳輸層 (SSL) 憑證
App Engine 支援下列憑證類型:
- 單一網域/主機名稱
- 自行簽署
- 萬用字元
- 主體別名 (SAN)/多網域
您的憑證和金鑰須符合下列要求:
- 私密金鑰與憑證須以 PEM 格式上傳。
- 私密金鑰絕不可加密。
- 憑證檔案最多可包含五個憑證,串連與中繼憑證都算在內。
- 主機憑證上的所有主體名稱都應相符,或是必須為使用者已驗證網域的子網域。
- 私密金鑰必須使用 RSA 加密。
- 允許的金鑰模數上限:2048 位元
如果主機憑證要求提供多數憑證授權單位 (CA) 都會核發的中繼或串連憑證,您必須將中繼或串連憑證附加到公開憑證檔案末端。
某些 App Engine 功能使用特殊的子網域。舉例來說,應用程式可使用子網域來處理應用程式服務,或處理應用程式的不同版本。如要將安全資料傳輸層 (SSL) 用於這些子網域,可以設定 SAN 或萬用字元憑證。萬用字元憑證僅支援單一層級的子網域。
使用 Strict-Transport-Security 標頭
基於安全性考量,所有應用程式皆應鼓勵用戶端使用 https
連線。您可以使用 Strict-Transport-Security
標頭指示瀏覽器採用 https
,而非 http
。
我們建議您謹慎實作 HTTP 嚴格傳輸安全性,如果 https
因任何緣故而無法運作或遭到停用,過去曾收到此標頭的用戶端將拒絕連線。詳情請參閱 HTTP 嚴格傳輸安全性一覽表。