使用 SSL 保護自訂網域

App Engine 對應用程式提供的 SSL 支援服務,可透過遍布世界各地的 SSL 端點和內建的負載平衡技術,發揮超越基本 SSL 的成效,讓您的應用程式能夠安全、可靠又迅速地服務全世界的目標對象。

根據預設,系統會使用代管安全資料傳輸層 (SSL) 憑證,自動啟用您自訂網域上的 HTTPS 連線。只要您將自訂網域對應到您的應用程式並設定 DNS 記錄,App Engine 就會佈建代管安全資料傳輸層 (SSL) 憑證、在憑證到期前處理憑證的續購事宜,以及在您將自訂網域從應用程式移除時撤銷憑證。

事前準備

  • 確認您已在 App Engine 專案中設定自訂網域

  • 如果您選擇使用 gcloud 工具指令:

    1. 安裝並初始化 Cloud SDK:

      下載並安裝

  • 如果您選擇使用 Admin API,請查看存取 Admin API 一文中的必要條件資訊。

確認代管憑證已佈建完成

在您設定自訂網域並更新 DNS 記錄後,系統會在幾分鐘內自動提供代管安全資料傳輸層 (SSL) 憑證。代管憑證由 Let's Encrypt 簽署。

如何確認憑證已佈建:

主控台
  1. 在 Google Cloud Platform 主控台中,前往「App Engine」>「Settings」(設定) >「Custom Domains」(自訂網域)

    前往「Custom Domains」(自訂網域) 頁面

  2. 「SSL security」(SSL 安全性) 應顯示為「Google managed」(由 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) 憑證的問題

升級至代管安全資料傳輸層 (SSL) 憑證

在您升級至 Google 代管安全資料傳輸層 (SSL) 憑證之前,請注意代管憑證「不支援」萬用字元對應。

如果您使用子網域,每個基礎網域一週的代管憑證數量上限為 20 個。如果達到上限,App Engine 會繼續嘗試核發代管憑證,直到所有要求都處理完畢。

如要將自己的安全資料傳輸層 (SSL) 憑證更換為 Google 代管安全資料傳輸層 (SSL) 憑證,或是將代管安全資料傳輸層 (SSL) 憑證新增到自訂網域中的現有應用程式,請更新您的網域對應關係:

主控台
  1. 在 Google Cloud Platform 主控台中,前往「App Engine」>「Settings」(設定) >「Custom Domains」(自訂網域)

    前往「Custom Domains」(自訂網域) 頁面

  2. 選取您要保護的網域,並按一下 [Enable SSL security] (啟用 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) 憑證的方式如下:

主控台
  1. 在 Google Cloud Platform 主控台中,前往「App Engine」>「Settings」(設定) >「Custom Domains」(自訂網域)

    前往「Custom Domains」(自訂網域) 頁面

  2. 選取網域,然後按一下 [Disable SSL security] (停用 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 強制要求憑證透明化證明,而在 Chrome 中顯示安全資料傳輸層 (SSL) 警告。如要進一步瞭解憑證透明化證明及符合相關要求的方式,請參閱強制要求憑證透明化一文。

如要使用及管理自己的安全資料傳輸層 (SSL) 憑證,而非 Google 代管憑證:

  1. 確認您已在 App Engine 專案中設定自訂網域

  2. 停用預設的 Google 代管憑證

  3. 請向您選擇的憑證授權單位 (CA) 取得網域憑證。確切的程序可能因授權單位而異,但仍建議您參閱取得憑證一文來瞭解一般步驟。

  4. 將您的私密金鑰與安全資料傳輸層 (SSL) 憑證檔案轉換成 App Engine 支援的格式。您必須先將私密金鑰轉換成 RSA 私密金鑰,並將安全資料傳輸層 (SSL) 憑證串聯成單一檔案,接著才能上傳檔案。詳情請參閱轉換私密金鑰及串聯安全資料傳輸層 (SSL) 憑證一文。

  5. 確認您在 GCP Console 中擁有正確權限,且您對所有相關網域或其上層網域的擁有權已通過驗證 (步驟 3)。例如:

    • 如果是 www.example.com 的憑證,您可以驗證 www.example.comexample.com 的擁有權。
    • 如果是 www.example.comsub.example.com 的憑證,您可以驗證 www.example.comsub.example.com 的擁有權,或是 example.com 的擁有權。
    • 如果是 *.example.com 的憑證,則您必須驗證 example.com 的擁有權。
  6. 上傳您的私密金鑰和安全資料傳輸層 (SSL) 憑證,然後將您的網域對應至應用程式:

    主控台
    1. 在 Google Cloud Platform 主控台中,前往「App Engine」 >「Settings」(設定) >「SSL certificates」(SSL 憑證)

      前往「SSL certificates」(SSL 憑證) 頁面

    2. 按一下 [Upload a new certificate] (上傳新憑證)

      上傳憑證
    3. 針對 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
    4. 按一下 [Upload] (上傳)。每個您上傳的安全資料傳輸層 (SSL) 憑證都會顯示,並且可供所有其他的 GCP 專案使用,因此您不必重複上傳相同的憑證。
    5. 選取您要指派到網域的憑證,然後按一下 [Save] (儲存),將安全資料傳輸層 (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 造訪您的網域來測試變更,例如 https://www.example.com

將對應從服務憑證轉移至新憑證

憑證到期日接近時,您必須上傳新憑證,並將舊憑證現有的對應關係轉移至新憑證。下列程序假設現有憑證尚未到期,目前正在服務您的自訂網域。

如要從使用中的服務憑證轉移對應關係:

  1. 請向您選擇的憑證授權單位 (CA) 取得網域的新憑證。如需瞭解一般步驟,請參閱取得憑證一文。

  2. 將您的私密金鑰與安全資料傳輸層 (SSL) 憑證檔案轉換成 App Engine 支援的格式。詳情請參閱轉換私密金鑰及串聯安全資料傳輸層 (SSL) 憑證的說明。

  3. 上傳您的 RSA 私密金鑰和串聯的安全資料傳輸層 (SSL) 憑證:

    主控台
    1. 在「SSL certificates」(SSL 憑證) 頁面上傳安全資料傳輸層 (SSL) 憑證。

      前往「SSL certificates」(SSL 憑證) 頁面
      1. 按一下 [Upload a new certificate] (上傳新憑證)。

        上傳憑證
      2. 針對「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
      3. 按一下 [Upload] (上傳)。
    2. 從憑證清單選取您剛剛新增的新憑證,然後選取舊憑證服務的網域。
    3. 按一下 [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

取得憑證

取得安全資料傳輸層 (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. 當憑證授權單位要求您提供 CSR 檔案的內容時,請按照他們的操作說明,將之前產生的 .csr 檔案 (例如 server.csr) 內容複製貼上。

  4. 當您的憑證授權單位要求網域擁有者核准時,請按照提示操作。

    提示:您可能會發現,使用電子郵件進行核准最為簡單方便。您必須在網域帳戶中設定電子郵件地址 (例如 admin@example.com),以接收及回覆憑證授權單位的核准要求。

  5. 在您提供網域擁有者核准後,憑證授權單位就會將憑證傳送給您,檔案格式通常為 .zip。請將該檔案解壓縮到工作目錄,以將這些憑證串聯在一起並上傳到 App Engine。

轉換私密金鑰及串聯安全資料傳輸層 (SSL) 憑證

您必須將私密金鑰轉換成 RSA 私密金鑰,並串聯所有的安全資料傳輸層 (SSL) 憑證,才能將私密金鑰和安全資料傳輸層 (SSL) 憑證上傳到 App Engine。

  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. 執行下列指令,將憑證授權單位發出的所有 .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
      
  3. 驗證您的安全資料傳輸層 (SSL) 憑證和私密金鑰:

    1. 如要驗證私密金鑰與憑證是否相符,您可以執行 openssl x509openssl rsa 指令。例如:

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

      openssl x509openssl rsa 指令應會傳回相同的輸出內容。

    2. 如要驗證某憑證與該憑證的憑證授權單位串連是否有效,您可以執行 openssl verify 指令。例如:

      openssl verify -verbose -CAfile concat.crt concat.crt
      
  4. 準備就緒後,即可將您的 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 嚴格傳輸安全性一覽表

本頁內容對您是否有任何幫助?請提供意見:

傳送您對下列選項的寶貴意見...

這個網頁
Python 2 適用的 App Engine 標準環境