当负载平衡器连接到 Google Cloud中的后端时,负载平衡器会接受您的后端提供的任何证书。在这种情况下,负载平衡器不会执行任何证书验证。
借助后端身份验证 TLS 或后端身份验证,负载平衡器可以验证其连接到的后端的身份。此外,借助后端 mTLS,负载平衡器还可以使用客户端 TLS 证书向后端证明其身份。
下图展示了前端和后端 mTLS 之间的区别,重点介绍了负载平衡器在每种情况下的作用。在前端 mTLS 中,负载平衡器充当服务器,验证客户端的身份。在后端 mTLS 中,负载平衡器充当客户端,向后端证明其身份。
mTLS 在前端和后端独立运行。您可以在前端、后端或前端和后端同时配置 mTLS。
本文档简要介绍了后端身份验证 TLS 以及后端 mTLS。如需详细了解前端 mTLS,请参阅双向 TLS 概览。
您可以在全球外部应用负载平衡器的后端服务资源上配置后端身份验证 TLS 和后端 mTLS。
特性
mTLS 使用公钥基础架构 (PKI) 来验证通过网络通信的实体的身份。该基础架构包括三个组件:客户端、服务器和证书授权机构 (CA)。后端身份验证 TLS 和后端 mTLS 可为应用负载平衡器添加以下功能:
负载平衡器可以根据您自己的信任锚点验证后端提供的证书。您可以上传多个信任锚,以便从旧的 PKI 无缝迁移到新的 PKI,而不会出现停机时间。
负载平衡器可以根据公共信任根 (Web PKI) 验证后端的 TLS 证书。
除了信任锚点之外,您还可以配置中间证书,以帮助构建后端证书验证路径。使用中间证书意味着您的后端服务器无需提供完整的证书链。
您可以为后端服务配置 TLS 服务器名称指示 (SNI) 主机名。在 TLS 握手期间,负载平衡器会在发送到后端的
ClientHello
消息中包含此 SNI 主机名。然后,后端会响应其 TLS 证书,负载平衡器会验证此证书的至少一个主题备用名称 (SAN) 字段是否与主机名或为后端服务配置的任何 SAN 字段匹配。您可以将负载平衡器的后端服务配置为使用 mTLS,以便负载平衡器可以向后端证明其身份。此身份验证是使用负载平衡器向后端提供的客户端(负载平衡器)证书执行的。
证书要求
为后端身份验证 TLS 和后端 mTLS 配置证书时,请确保证书符合以下要求:
现代加密工具是 mTLS 身份验证的基础。证书必须使用 RSA 或 ECDSA 算法进行密钥交换。哈希算法必须使用 SHA-256 或更强的加密哈希函数。不支持 MD4、MD5 和 SHA-1 等哈希算法。
后端提供的叶服务器证书必须满足以下要求:
对于后端 mTLS 中使用的叶客户端(负载平衡器)证书,证书必须是 Certificate Manager 证书资源。此证书的范围必须为
client-auth
,这表示此证书在后端 mTLS 中用作客户端证书。与后端身份验证 TLS 搭配使用的根证书和中间证书须满足以下要求:
后端身份验证 TLS 和后端 mTLS 的关键组成部分
借助后端身份验证 TLS,负载平衡器可以验证其连接到的后端的身份。您可以在使用 HTTPS 或 HTTP/2 作为后端服务协议的 HTTP(S) 负载平衡器上配置后端身份验证 TLS。如果您未配置后端身份验证 TLS,负载平衡器会接受来自后端的任何证书。使用后端 mTLS,您还可以将负载平衡器配置为向后端提供自己的客户端证书,后端可以使用该证书对负载平衡器进行身份验证。
如需配置后端身份验证 TLS,您需要执行以下操作:
- 创建信任配置资源。
- 创建一个 Backend Authentication Config 资源。
- 更新后端服务的 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,负载平衡器会执行以下操作:
- 忽略 SNI 主机名以进行 SAN 验证。
- 验证后端的 TLS 证书是否包含与后端服务上配置的接受的 SAN (
subjectAltNames
) 之一匹配的 SAN。
客户端证书
除了后端身份验证 TLS(后端身份验证)之外,您还可以将负载平衡器的后端服务配置为使用 mTLS,以便负载平衡器向后端证明其身份。此身份验证使用负载平衡器向后端提供的客户端(负载平衡器)证书。
如需配置后端 mTLS,您需要执行以下操作:
- 创建一个包含客户端(负载平衡器)证书及其私钥的客户端证书资源。
- 将客户端证书附加到“后端身份验证配置”资源。
如果您通过证书管理器配置托管证书,后端 mTLS 还与 Compute Engine 托管式工作负载身份兼容。不支持公共 PKI 托管证书,并且所有客户端证书都必须具有 client-auth
范围并符合证书要求。
如果后端请求客户端证书,则必须将其配置为接受客户端证书。如果后端拒绝负载平衡器的连接,负载平衡器会针对其代理的请求返回 HTTP 502
状态代码,并将通用状态记录到 Cloud Logging。
在负载平衡器上配置后端身份验证 TLS 和后端 mTLS
您可以使用私有 PKI 或公共信任根在负载平衡器上配置后端身份验证 TLS 和后端 mTLS。
使用私有 PKI
下面简要介绍了使用私有 PKI 颁发的证书在负载平衡器上配置后端身份验证 TLS 和后端 mTLS 时需要遵循的主要步骤。私有 PKI 的优势在于完全由您控制,并且与公共互联网的 PKI 系统隔离。
创建一个信任配置资源,其中包含信任锚(根证书)和用作信任根的中间证书。
如需配置后端 mTLS,请创建一个包含客户端(负载平衡器)证书及其私钥的客户端证书。
创建一个引用信任配置的后端身份验证配置资源。如果您想配置后端 mTLS,则“后端身份验证配置”资源会同时引用信任配置和客户端证书。
将“后端身份验证配置”资源附加到负载平衡器的后端服务。
如需详细了解此设置,请参阅以下指南:
使用公共信任根
除了使用通过私有 PKI 签发的证书来启用后端身份验证 TLS 之外,您还可以使用公共信任根来验证后端证书。
如需使用公共信任根,您无需创建信任配置并将其附加到“后端身份验证配置”资源。而是,您需要在后端身份验证配置资源的 wellKnownRoots
字段中将 PUBLIC_ROOTS
设置为值。不过,除了信任配置所信任的证书之外,您还可以创建一个信任配置,其中明确包含您公开颁发的证书的根。
PUBLIC_ROOTS
设置使用一组根 CA(类似于浏览器信任的一组根 CA),这些根 CA 由 Google 管理,可能会随时间而变化。这会导致在这些根证书发生变化时,您的后端证书无效的风险。如果您需要验证公开颁发的证书,不妨考虑选择一家久经考验且值得信赖的 CA,并选择使用中间交叉签名来颁发后端证书,以降低根证书过期或被撤消的风险。
服务器证书验证步骤
在后端身份验证 TLS 或后端身份验证期间验证服务器证书时,负载平衡器会执行以下操作:
验证服务器是否拥有证书的私钥。
服务器使用其私钥对部分信息进行签名,并将其作为
CertificateVerify
消息的一部分发送给负载平衡器,以证明其拥有与向负载平衡器呈现的证书关联的私钥。然后,负载平衡器使用服务器证书中的公钥验证此签名。如果签名验证失败,则表示后端服务器不具备与证书对应的私钥。在这种情况下,负载平衡器会终止 TLS 握手,而不会记录任何错误。验证信任链。
如果信任配置包含至少一个信任锚或将
wellKnownRoots
属性设置为PUBLIC_ROOTS
,则负载平衡器会尝试验证服务器证书和配置的信任锚之间的信任链。验证检查包括:- 后端的服务器证书、中间证书(如果有)和配置的根证书符合证书要求。
- 对于信任链中的所有证书,父证书中的正文字段与子证书中的颁发者字段匹配。此验证有助于确保父证书的身份(正文)与子证书中列为签发者的身份相同。
- 对于信任链中的所有证书,父证书的正文密钥标识符 (SKID) 与子证书中的授权机构密钥标识符 (AKID) 匹配。此匹配确认子证书是由正确的根授权机构颁发的,并且可以信任,因为 AKID 中会引用根证书的公钥来验证证书的有效性。
与后端建立连接。
如果证书验证成功,负载平衡器会继续与后端建立连接。
不过,如果证书验证失败,负载平衡器会终止与后端的连接,向客户端发送 HTTP
502
状态代码,并将终止原因记录到 Cloud Logging。如果发生证书验证错误,后续传入的请求会触发负载平衡器重新发起后端连接。如果后端服务器拒绝连接,后端连接也可能会失败。使用后端 mTLS 时,可能会发生这种情况,因为它会发现客户端证书无效。与后端的连接失败时,负载平衡器会使用 HTTP
502
状态代码响应代理请求,并将通用错误原因记录到 Cloud Logging。
限制
后端身份验证 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 个。最多只能有 3 个中间证书共享相同的正文和正文公钥信息。
证书链的深度上限为 10 个证书,包括根证书和叶证书。在尝试构建信任链时,评估中间证书的最大次数为 100。
后端身份验证 TLS 会将从后端收到的证书链限制为不超过 16 KB 和 10 个证书。
用于验证的根证书不得超过 10 个名称限制条件。
tlsSettings.subjectAltNames[]
字段中允许的主题备用名称的数量上限为 5。