使用 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」>「設定」>「自訂網域」

    前往自訂網域頁面

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

  • 您可能需要更新您自訂網域的 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 憑證新增到具有自訂網域的現有應用程式,請更新您的網域對應關係:

主控台
  1. 在 Google Cloud Platform 主控台中,依序前往「App Engine」>「設定」>「自訂網域」

    前往自訂網域頁面

  2. 選取您要保護的網域,並按一下 [啟用 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」>「設定」>「自訂網域」

    前往自訂網域頁面

  2. 選取網域並按一下 [停用 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 憑證,改用自己的 SSL 憑證。如果您的憑證沒有透明化證明,您的應用程式在 Chrome 中可能會因為強制要求憑證透明化證明而顯示 SSL 警告。如要進一步瞭解憑證透明化證明及符合相關要求的方式,請參閱強制要求憑證透明化

如要使用及管理您自己的 SSL 憑證,而非 Google 代管憑證:

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

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

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

  4. 將您的私密金鑰與 SSL 憑證檔案轉換成 App Engine 支援的格式。您必須先將私密金鑰轉換成 RSA 私密金鑰,並將 SSL 憑證串連成單一檔案,接著才能進行上傳。詳情請參閱轉換私密金鑰及串連 SSL 憑證

  5. 在所有相關網域或其上層網域的 GCP 主控台已驗證的擁有權 (步驟 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」>「設定」>「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 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 憑證」頁面中,上傳 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 要求網域擁有者核准時,請按照提示操作。

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

    附註:您在提交憑證要求後可能需等待數天,CA 才會傳來您實際使用的憑證。

  5. 在您提供網域擁有者核准後,CA 會將憑證傳送給您,檔案格式通常為 .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. 執行下列指令,將 CA 傳來的所有 .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 是您的 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 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. 如要驗證憑證與該憑證的 CA 串鍊是否有效,您可以執行 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 嚴格傳輸安全性的重點指南

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

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

這個網頁
Node.js 適用的 App Engine 彈性環境文件