使用安全資料傳輸層 (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) 憑證的問題

升級至代管安全資料傳輸層 (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 工具產生私密金鑰與憑證簽署要求:

    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 嚴格傳輸安全性的重點手冊

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

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

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