後端驗證的 TLS 和後端 mTLS 總覽

連線至 Google Cloud中的後端時,負載平衡器會接受您的後端提供的任何憑證。在這種情況下,負載平衡器不會執行任何憑證驗證。

透過後端驗證的 TLS 或後端驗證,負載平衡器可以驗證所連線後端的身分。此外,負載平衡器還可透過後端 mTLS 使用用戶端 TLS 憑證,向後端證明自己的身分。

下圖顯示前端和後端 mTLS 的差異,並著重於負載平衡器在每個案例中的角色。在前端 mTLS 中,負載平衡器會做為伺服器,驗證用戶端的身分。在後端 mTLS 中,負載平衡器會扮演用戶端的角色,向後端證明自己的身分。

前端和後端 mTLS。
前端和後端 mTLS (按一下即可放大)。

mTLS 會在前端和後端獨立運作。您可以在前端、後端,或前端和後端同時設定 mTLS。

本文概要說明後端驗證的 TLS 和後端 mTLS。如要進一步瞭解前端 mTLS,請參閱雙向傳輸層安全標準 (mTLS) 總覽

您可以在全域外部應用程式負載平衡器的後端服務資源上,設定後端驗證的 TLS 和後端 mTLS。

功能

mTLS 會使用公用金鑰基礎架構 (PKI) 驗證透過網路通訊的實體身分。這項基礎架構包含三個元件:用戶端、伺服器和憑證授權單位 (CA)。後端驗證的 TLS 和後端 mTLS 可為應用程式負載平衡器新增下列功能:

  • 負載平衡器可根據您自己的信任錨點,驗證後端提供的憑證。您可以上傳多個信任錨點,以便從舊版 PKI 無縫遷移至新版,且不會發生停機情形。

  • 負載平衡器可以根據公開信任根 (網路 PKI) 驗證後端的 TLS 憑證。

  • 除了信任錨點,您也可以設定中繼憑證,協助建構後端憑證驗證路徑。使用中繼憑證表示後端伺服器不必提供完整的憑證鏈。

  • 您可以為後端服務設定 TLS 伺服器名稱指示 (SNI) 主機名稱。在 TLS 握手期間,負載平衡器會在傳送至後端的 ClientHello 訊息中加入這個 SNI 主機名稱。後端隨後會以 TLS 憑證回應,負載平衡器則會驗證這個憑證的至少一個主體別名 (SAN) 欄位是否與主機名稱或為後端服務設定的任何 SAN 欄位相符。

  • 您可以將負載平衡器的後端服務設定為使用 mTLS,讓負載平衡器向後端證明自己的身分。這項驗證是透過負載平衡器向後端提供的用戶端 (負載平衡器) 憑證進行。

憑證規定

設定後端驗證的 TLS 和後端 mTLS 憑證時,請務必遵守下列規定:

  • mTLS 驗證是以現代密碼編譯工具為基礎。憑證必須使用 RSA 或 ECDSA 演算法進行金鑰交換。 雜湊演算法必須使用 SHA-256 或更強大的加密雜湊函式。系統不支援 MD4、MD5 和 SHA-1 等雜湊演算法。

  • 後端提供的葉子伺服器憑證須符合下列規定:

    • 基本限制擴充功能不得包含 CA=true
    • 「擴充金鑰使用方式」擴充功能必須包含 serverAuth
    • 「擴充金鑰使用方式」擴充功能不得包含 codeSigningtimeStampingOCSPSigning 欄位。
    • 憑證不得過期。
  • 如要用於後端 mTLS 的葉狀用戶端 (負載平衡器) 憑證,該憑證必須是憑證管理工具憑證資源。這項憑證的範圍必須為 client-auth,表示這項憑證在後端 mTLS 中做為用戶端憑證使用。

    • 基本限制擴充功能不得包含 CA=true
    • 「擴充金鑰使用方式」擴充功能必須包含 clientAuth
    • 「擴充金鑰使用方式」擴充功能不得包含 codeSigningtimeStampingOCSPSigning 欄位。
    • 憑證不得過期。
  • 搭配後端驗證 TLS 使用的根憑證和中繼憑證須符合下列規定:

    • 「基本限制」擴充功能必須包含 CA=true
    • 「金鑰使用方式」擴充功能必須設為 keyCertSign
    • 「擴充金鑰使用方式」擴充功能必須包含 serverAuth 欄位。
    • 憑證不得過期。

後端驗證 TLS 和後端 mTLS 的重要元件

透過後端驗證的 TLS,負載平衡器可以驗證所連線後端的身分。如果 HTTP(S) 負載平衡器使用 HTTPS 或 HTTP/2 做為後端服務通訊協定,您就可以設定後端已驗證的 TLS。如果未設定後端驗證的 TLS,負載平衡器會接受後端傳送的任何憑證。使用後端 mTLS 時,您還可以設定負載平衡器向後端顯示自己的用戶端憑證,後端可使用該憑證驗證負載平衡器。

如要設定後端驗證的 TLS,請完成下列步驟:

  • 建立信任設定資源。
  • 建立後端驗證設定資源。
  • 更新後端服務的 TLS 設定屬性,將其指向後端驗證設定資源。

如要設定後端 mTLS,您必須建立用戶端憑證,並將該憑證附加至後端驗證設定資源。建立後端驗證設定資源後,您就無法附加用戶端憑證。

下圖顯示附加至應用程式負載平衡器後端服務的不同元件,這些元件可啟用後端驗證 TLS 和後端 mTLS。

後端驗證的 TLS 和後端 mTLS 元件。
後端驗證的 TLS 和後端 mTLS 元件 (按一下即可放大)。

以下資訊概略說明用於設定後端驗證 TLS 和後端 mTLS 的不同元件。

信任設定

如要驗證後端提供給負載平衡器的伺服器憑證,請使用 X.509 憑證設定負載平衡器,建立後端憑證核發者的信任鏈結。您可以使用TrustConfig資源設定信任設定,該資源會表示整個信任設定,並包含單一信任儲存區。

信任儲存庫包含信任錨點 (根憑證),以及一或多個中繼憑證 (屬於選用性質)。信任錨點是代表信任根的憑證。有效的伺服器憑證必須顯示信任鏈結,可追溯至信任存放區中的某個信任錨點。

中繼憑證是信任鏈的一部分,可追溯至信任儲存庫中的信任錨點。在驗證程序中,系統會使用這個憑證和葉子憑證隨附的任何其他中繼 CA,建構信任鏈結。您可以選擇是否要建立中繼憑證。

如需使用自行簽署、已過期、未連結至指定信任根憑證或驗證失敗的憑證,您可以將這類憑證新增至信任設定中的允許清單。您也可以選擇是否要建立可加入許可清單的自簽憑證。

信任儲存區不含任何私密金鑰,因為驗證信任鏈結時只需要憑證。

後端驗證設定資源

附加至負載平衡器後端服務的後端驗證設定 (BackendAuthenticationConfig) 資源可啟用下列功能:

  • 後端驗證的 TLS (使用信任設定和信任的公開根目錄)
  • 後端 mTLS (使用用戶端憑證)

如要啟用後端驗證的 TLS 和後端 mTLS,後端驗證設定資源會指向下列資源:

  • 信任設定 (trustConfig): 用於驗證後端提供的伺服器憑證的附加信任設定。

  • 信任的公開根目錄 (wellKnownRoots): 指出負載平衡器是否信任由公開 CA 核發的後端伺服器憑證,以及信任設定信任的憑證。詳情請參閱「使用公開信任根」。

  • 用戶端憑證 (clientCertificate):如果與後端的連線使用 mTLS,負載平衡器會使用此憑證向後端表明身分。如果是後端驗證的 TLS (後端驗證),這個欄位可以空白,這樣負載平衡器只會向後端驗證後端,但不會驗證自身。

後端服務

在後端服務中,tlsSettings 屬性會指向下列資源,以驗證後端憑證。

  • 後端驗證設定 (authenticationConfig)
  • SNI 主機名稱 (sni)
  • 接受的 SAN (subjectAltNames)

tlsSettings 屬性中的 SNI (sni) 和 SAN (subjectAltNames) 欄位,會根據憑證的 SAN 值控管負載平衡器驗證後端憑證的方式。無論是否設定後端驗證的 TLS,這些欄位都會影響驗證程序。

設定 SNI 欄位 (tlsSettings.sni) 後,負載平衡器會執行下列操作:

  • 在 TLS 握手期間,將 SNI 主機名稱傳送至後端伺服器。
  • 驗證後端的 TLS 憑證是否包含與 SNI 主機名稱相符的 SAN。

根據預設,負載平衡器會檢查後端的 TLS 憑證是否包含與 SNI 主機名稱相符的 SAN。不過,如果後端服務 (tlsSettings.subjectAltNames) 上已設定 SAN,負載平衡器會執行下列操作:

  • 忽略 SAN 驗證的 SNI 主機名稱。
  • 確認後端的 TLS 憑證包含的 SAN 符合後端服務上設定的其中一個可接受 SAN (subjectAltNames)。

用戶端憑證

除了後端驗證 TLS (後端驗證) 之外,您也可以將負載平衡器的後端服務設定為使用 mTLS,讓負載平衡器向後端證明自己的身分。這項驗證會使用負載平衡器向後端出示的用戶端 (負載平衡器) 憑證。

如要設定後端 mTLS,請完成下列步驟:

  • 建立用戶端憑證資源,內含用戶端 (負載平衡器) 憑證和私密金鑰。
  • 將用戶端憑證附加至後端驗證設定資源。

透過 Certificate Manager 設定代管憑證時,後端 mTLS 也與 Compute Engine 代管工作負載身分識別相容。不支援公開 PKI 代管憑證,且所有用戶端憑證都必須具有 client-auth 範圍,並符合憑證規定

如果後端要求用戶端憑證,則必須設定為接受該憑證。如果後端拒絕負載平衡器的連線,負載平衡器會為其代理的要求傳回 HTTP 502 狀態碼,並將一般狀態記錄到 Cloud Logging。

在負載平衡器上設定後端驗證的 TLS 和後端 mTLS

您可以使用私有 PKI 或公開信任根,在負載平衡器上設定後端驗證的 TLS 和後端 mTLS。

使用私有 PKI

以下概略說明您需要執行的主要步驟,才能使用私有 PKI 簽發的憑證,在負載平衡器上設定後端驗證 TLS 和後端 mTLS。私有 PKI 的優點是完全由您控管,且與公開網際網路的 PKI 系統隔離。

  1. 建立信任設定資源,內含信任錨點 (根憑證) 和做為信任根的中繼憑證。

  2. 如要設定後端 mTLS,請建立包含用戶端 (負載平衡器) 憑證及其私密金鑰的用戶端憑證。

  3. 建立參照信任設定的後端驗證設定資源。如要設定後端 mTLS,Backend Authentication Config 資源會同時參照信任設定和用戶端憑證。

  4. 將後端驗證設定資源附加至負載平衡器的後端服務。

如要進一步瞭解這項設定,請參閱下列指南:

使用公開信任根

除了使用私有 PKI 發放的憑證啟用後端驗證 TLS 之外,您也可以使用公開信任根憑證驗證後端憑證。

如要使用公開信任根,您不需要建立信任設定,並將其附加至後端驗證設定資源。您必須在 Backend Authentication Config 資源的 wellKnownRoots 欄位中,將 PUBLIC_ROOTS 設為值。不過,除了信任設定信任的憑證外,您也可以建立信任設定,明確納入公開發布憑證的根憑證。

PUBLIC_ROOTS 設定使用的根憑證授權單位集,與瀏覽器信任的根憑證授權單位集類似,由 Google 管理,且可能會隨時間變更。如果這些根目錄變更,後端憑證可能會失效,因此存在風險。如需驗證公開核發的憑證,建議選擇信譽良好且值得信賴的 CA,並使用中繼交叉簽署來核發後端憑證,以降低根憑證過期或遭撤銷的風險。

伺服器憑證驗證步驟

在後端驗證的 TLS 或後端驗證期間驗證伺服器憑證時,負載平衡器會執行下列操作:

  1. 確認伺服器擁有憑證的私密金鑰

    伺服器會使用私密金鑰簽署一小段資訊,並將該資訊做為 CertificateVerify 訊息的一部分傳送至負載平衡器,藉此證明自己擁有與憑證相關聯的私密金鑰。然後,負載平衡器會使用伺服器憑證中的公開金鑰驗證這個簽章。如果簽章驗證失敗,表示後端伺服器沒有與憑證對應的私密金鑰。在這種情況下,負載平衡器會終止 TLS 交握,且不會記錄任何錯誤。

  2. 驗證信任鏈

    如果信任設定包含至少一個信任錨點,或 wellKnownRoots 屬性設為 PUBLIC_ROOTS,負載平衡器會嘗試驗證伺服器憑證與設定的信任錨點之間的信任鏈結。驗證檢查包括下列項目:

    • 後端的伺服器憑證、中繼憑證 (如有提供) 和設定的根憑證符合憑證規定
    • 在信任鏈中的所有憑證中,父項憑證的主體欄位與子項憑證的簽發者欄位相符。這項驗證可確保父項憑證的身分 (主體) 與子項憑證中列為簽發者的身分相同。
    • 在信任鏈結中,所有憑證的父項憑證主體金鑰 ID (SKID) 都與子項憑證的授權單位金鑰 ID (AKID) 相符。這項比對作業可確認子憑證是由正確的根授權單位核發,且由於根憑證的公開金鑰會參照 AKID,以驗證憑證的有效性,因此子憑證可信。
  3. 與後端建立連線

    如果憑證驗證成功,負載平衡器會繼續連線至後端。

    不過,如果憑證驗證失敗,負載平衡器會終止與後端的連線,並將 HTTP 502 狀態碼傳送給用戶端,然後將終止原因記錄到 Cloud Logging。如果發生憑證驗證錯誤,後續傳入的要求會觸發負載平衡器重新啟動後端連線。

    如果後端伺服器拒絕連線,後端連線也可能失敗。使用後端 mTLS 時,如果系統發現用戶端憑證無效,就可能發生這種情況。如果連線至後端失敗,負載平衡器會以 HTTP 502 狀態碼回應 Proxy 要求,並將一般錯誤原因記錄到 Cloud Logging。

錯誤處理和記錄

應用程式負載平衡器提供詳細的記錄功能,方便您監控伺服器憑證驗證、找出潛在問題,以及排解連線問題。本節將說明 mTLS 驗證期間可能發生的各種錯誤,以及記錄這些錯誤的方式。

如果伺服器憑證驗證失敗,連線就會終止,且錯誤會記錄到 Cloud Logging。下表說明這些錯誤。

伺服器憑證狀態 記錄的錯誤
伺服器憑證鏈結過長 (伺服器憑證包含超過 10 個中繼憑證)。 server_cert_chain_exceeded_limit

伺服器或中繼憑證的 RSA 金鑰大小無效。

不會執行驗證。

RSA 金鑰的位元數可介於 2048 到 4096 之間。

server_cert_invalid_rsa_key_size

伺服器或中繼憑證使用的橢圓曲線不受支援。

不會執行驗證。

有效曲線為 P-256 和 P-384。

server_cert_unsupported_elliptic_curve_key

伺服器或中繼憑證使用非 RSA 或非 ECDSA 的演算法。

不會執行驗證。

server_cert_unsupported_key_algorithm

用於驗證的 PKI 有超過十個中繼憑證,這些憑證共用相同的主體和主體公開金鑰資訊。

不會執行驗證。

server_cert_pki_too_large

用於驗證的中繼憑證包含超過 10 個名稱限制。

server_cert_chain_max_name_constraints_exceeded

伺服器憑證具有 Extended Key Usage (EKU) 擴充欄位,但該欄位不包含 serverAuth

server_cert_chain_invalid_eku

嘗試驗證憑證鏈結時超過時間限制。 server_cert_validation_timed_out

嘗試驗證憑證鏈時,達到深度或疊代限制。

憑證鏈的深度上限為十層,包括根憑證和伺服器憑證。疊代次數上限為 100 次 (檢查憑證以驗證伺服器憑證鏈結)。

server_cert_validation_search_limit_exceeded

您已設定 mTLS,但未設定 TrustConfig 資源。

server_cert_validation_not_performed

在交握期間,伺服器未提供要求的憑證。

server_cert_not_provided

伺服器憑證無法通過 TrustConfig 資源的驗證。

ssl_certificate_verification_failed

服務無法執行憑證鏈結驗證。

server_cert_validation_unavailable
驗證憑證鏈時發生內部錯誤。 server_cert_validation_internal_error

找不到相符的 TrustConfig

server_cert_trust_config_not_found
伺服器憑證酬載 (包括任何中繼憑證) 過大 (超過 16 KB)。 server_cert_exceeded_size_limit

限制

  • 後端驗證的 TLS 和後端 mTLS 只能為全域外部應用程式負載平衡器設定。傳統版應用程式負載平衡器不支援後端驗證的 TLS 和後端 mTLS。

  • 下列後端類型不支援後端驗證的 TLS 和後端 mTLS:

    • 全域網際網路 NEG 後端

    • App Engine 後端

  • 如要啟用後端 mTLS,您也必須設定後端驗證的 TLS。

  • 如要啟用後端 mTLS,您必須先建立用戶端憑證,再設定後端驗證設定資源。

  • 後端使用的健康狀態檢查不會實作 TLS 驗證或 mTLS 功能。您必須為後端設定健康狀態檢查端點,以便回應 HTTP 或 HTTPS 要求。

  • 負載平衡器在連線至後端時,不會從前端 TLS 連線傳遞用戶端的 SNI 主機名稱。不過,後端可以使用自訂要求標頭存取用戶端的 SNI 主機名稱。

  • 如為後端 mTLS,用戶端憑證金鑰僅限以下項目:

    • RSA 金鑰的位元數可介於 2048 到 4096 之間。
    • ECDSA 金鑰可使用 P-256 或 P-384 曲線。
  • 後端驗證的 TLS 不支援憑證撤銷檢查。

配額與限制

  • 單一信任儲存庫最多可包含 200 個信任錨點和中繼憑證,其中中繼憑證最多 100 個。最多只能有三個中繼憑證共用相同的主體和主體公開金鑰資訊。

  • 憑證鏈結的深度上限為 10 個憑證,包括根憑證和分葉憑證。嘗試建構信任鏈結時,可評估的中繼憑證數量上限為 100 個。

  • 後端驗證的 TLS 會將後端收到的憑證鏈限制為不超過 16 KB 和 10 個憑證。

  • 用於驗證的根憑證不得包含超過 10 個名稱限制。

  • tlsSettings.subjectAltNames[]」欄位最多可輸入 5 個主體別名。

後續步驟