当负载均衡器连接到 Google Cloud中的后端时,负载均衡器会接受您的后端提供的任何证书。在此类情况下,负载均衡器不会执行任何证书验证。
借助后端经过身份验证的 TLS 或后端身份验证,负载均衡器可以验证其连接到的后端的身份。借助后端 mTLS,负载均衡器还可以使用客户端 TLS 证书向后端证明其身份。
下图显示了前端 mTLS 与后端 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,您需要执行以下操作:
- 创建信任配置资源。
- 创建后端身份验证配置资源。
- 更新后端服务上的 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 (
subjectAltNames
) 匹配的 SAN。
客户端证书
除了后端经过身份验证的 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 系统隔离。
创建信任配置资源,其中包含信任锚(根证书)和用作信任根的中间证书。
如需配置后端 mTLS,请创建一个包含客户端(负载均衡器)证书及其私钥的客户端证书。
创建引用信任配置的后端身份验证配置资源。如果您要配置后端 mTLS,则后端身份验证配置资源会同时引用信任配置和客户端证书。
将后端身份验证配置资源附加到负载均衡器的后端服务。
如需详细了解此设置,请参阅以下指南:
使用公共信任根
除了使用通过您的专用 PKI 颁发的证书来启用后端经过身份验证的 TLS 外,您还可以使用公共信任根来验证后端证书。
如需使用公共信任根,您无需创建信任配置并将其附加到后端身份验证配置资源。相反,您需要在 Backend Authentication Config 资源的 wellKnownRoots
字段中将 PUBLIC_ROOTS
设置为值。不过,除了信任配置信任的证书之外,您还可以创建一个信任配置,其中明确包含您公开颁发的证书的根。
PUBLIC_ROOTS
设置使用一组根 CA(类似于浏览器信任的一组根 CA),由 Google 管理且可能会随时间而变化。这会导致在这些根证书发生变化时,您的后端证书可能会失效。如果您需要验证公开颁发的证书,请考虑选择一个成熟且值得信赖的 CA,以及一个使用中间交叉签名来颁发后端证书的 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。