本页面介绍如何为跨区域内部应用负载均衡器或区域级内部应用负载均衡器配置双向 TLS (mTLS)。
准备工作
- 阅读内部应用负载均衡器概览。
- 阅读双向 TLS 身份验证。
- 使用用户提供的证书设置双向 TLS。
内部应用负载均衡器支持不同的后端服务和存储桶。确保您已使用以下任一受支持的后端设置内部应用负载均衡器:
区域级内部应用负载均衡器
跨区域内部应用负载均衡器
为负载均衡器设置 mTLS
要使双向 TLS 身份验证正常运行,在设置负载均衡器后,您需要使用 ServerTLSPolicy
资源更新目标 HTTPS 代理。
确保您已创建
ServerTLSPolicy
资源。如需了解相关说明,请参阅创建网络安全资源。如需列出项目中的所有目标 HTTPS 代理,请使用
gcloud compute target-https-proxies list
命令:gcloud compute target-https-proxies list
记下目标 HTTPS 代理的名称,用于附加
ServerTLSPolicy
资源。此名称在后面的步骤中称为TARGET_HTTPS_PROXY_NAME
。如需将目标 HTTPS 代理的配置导出到文件,请使用
gcloud beta compute target-https-proxies export
命令:全局
gcloud beta compute target-https-proxies export TARGET_HTTPS_PROXY_NAME \ --destination=TARGET_PROXY_FILENAME \ --global
替换以下内容:
TARGET_HTTPS_PROXY_NAME
:目标代理的名称。TARGET_PROXY_FILENAME
:yaml 文件的名称。例如mtls_target_proxy.yaml
。
区域级
gcloud beta compute target-https-proxies export TARGET_HTTPS_PROXY_NAME \ --destination=TARGET_PROXY_FILENAME \ --region=REGION
替换以下内容:
TARGET_HTTPS_PROXY_NAME
:目标代理的名称。TARGET_PROXY_FILENAME
:yaml 文件的名称。例如mtls_target_proxy.yaml
REGION
:您在其中配置了负载均衡器的区域。
列出当前项目指定位置中的所有
ServerTlsPolicies
资源。控制台
在 Google Cloud 控制台中,进入客户端身份验证页面。
系统会显示所有
ServerTlsPolicies
资源。
gcloud
如需列出所有客户端身份验证 (
ServerTlsPolicies
) 资源,请使用gcloud network-security server-tls-policies list
命令:gcloud network-security server-tls-policies list \ --location=REGION
替换以下内容:
REGION
:您在其中配置了负载均衡器的区域。对于跨区域内部应用负载均衡器,请使用global
。记下
ServerTlsPolicies
资源的名称,用于配置 mTLS。此名称在下一步中称为SERVER_TLS_POLICY_NAME
。如需附加
ServerTlsPolicy
资源文件TARGET_PROXY_FILENAME
,请使用以下命令。将PROJECT_ID
替换为您的 Google Cloud 项目的 ID。echo "serverTlsPolicy: //networksecurity.googleapis.com/projects/PROJECT_ID/locations/REGION/serverTlsPolicies/SERVER_TLS_POLICY_NAME" >> TARGET_PROXY_FILENAME
如需从文件导入目标 HTTPS 代理的配置,请使用
gcloud beta compute target-https-proxies import
命令。全局
gcloud beta compute target-https-proxies import TARGET_HTTPS_PROXY_NAME \ --source=TARGET_PROXY_FILENAME \ --global
替换以下内容:
TARGET_HTTPS_PROXY_NAME
:目标代理的名称。TARGET_PROXY_FILENAME
:yaml 文件的名称。例如mtls_target_proxy.yaml
。
区域级
gcloud beta compute target-https-proxies import TARGET_HTTPS_PROXY_NAME \ --source=TARGET_PROXY_FILENAME \ --region=REGION
替换以下内容:
TARGET_HTTPS_PROXY_NAME
:目标代理的名称。TARGET_PROXY_FILENAME
:yaml 文件的名称。例如mtls_target_proxy.yaml
REGION
:您在其中配置了负载均衡器的区域。
添加 mTLS 自定义标头
启用 mTLS 后,您可以使用自定义标头将有关 mTLS 连接的信息传递给网址映射。您还可以启用日志记录,以便在日志中捕获 mTLS 连接失败。如需列出项目中的所有网址映射,请使用 gcloud beta compute url-maps list
命令:
gcloud beta compute url-maps list
记下网址映射的名称,以便启用自定义标头和日志记录。此名称在后面的步骤中称为 URL_MAP_NAME
。
全局
gcloud compute url-maps edit URL_MAP_NAME --global
以下示例 YAML 文件展示了如何在自定义请求标头 (requestHeadersToAdd
) 中使用变量。您可以使用相同的变量发送自定义响应标头 (responseHeadersToAdd
)。
headerAction: requestHeadersToAdd: - headerName: "X-Client-Cert-Present" headerValue: "{client_cert_present}" - headerName: "X-Client-Cert-Chain-Verified" headerValue: "{client_cert_chain_verified}" - headerName: "X-Client-Cert-Error" headerValue: "{client_cert_error}" - headerName: "X-Client-Cert-Hash" headerValue: "{client_cert_sha256_fingerprint}" - headerName: "X-Client-Cert-Serial-Number" headerValue: "{client_cert_serial_number}" - headerName: "X-Client-Cert-SPIFFE" headerValue: "{client_cert_spiffe_id}" - headerName: "X-Client-Cert-URI-SANs" headerValue: "{client_cert_uri_sans}" - headerName: "X-Client-Cert-DNSName-SANs" headerValue: "{client_cert_dnsname_sans}" - headerName: "X-Client-Cert-Valid-Not-Before" headerValue: "{client_cert_valid_not_before}" - headerName: "X-Client-Cert-Valid-Not-After" headerValue: "{client_cert_valid_not_after}" - headerName: "X-Client-Cert-Issuer-Dn" headerValue: "{client_cert_issuer_dn}" - headerName: "X-Client-Cert-Subject-Dn" headerValue: "{client_cert_subject_dn}" - headerName: "X-Client-Cert-Leaf" headerValue: "{client_cert_leaf}" - headerName: "X-Client-Cert-Chain" headerValue: "{client_cert_chain}"
区域级
gcloud compute url-maps edit URL_MAP_NAME --region=REGION
以下示例 YAML 文件展示了如何在自定义请求标头 (requestHeadersToAdd
) 中使用变量。您可以使用相同的变量发送自定义响应标头 (responseHeadersToAdd
)。
defaultService: regions/REGION/backendServices/BACKEND_SERVICE_1 name: regional-lb-map region: region/REGION headerAction: requestHeadersToAdd: - headerName: "X-Client-Cert-Present" headerValue: "{client_cert_present}" - headerName: "X-Client-Cert-Chain-Verified" headerValue: "{client_cert_chain_verified}" - headerName: "X-Client-Cert-Error" headerValue: "{client_cert_error}" - headerName: "X-Client-Cert-Hash" headerValue: "{client_cert_sha256_fingerprint}" - headerName: "X-Client-Cert-Serial-Number" headerValue: "{client_cert_serial_number}" - headerName: "X-Client-Cert-SPIFFE" headerValue: "{client_cert_spiffe_id}" - headerName: "X-Client-Cert-URI-SANs" headerValue: "{client_cert_uri_sans}" - headerName: "X-Client-Cert-DNSName-SANs" headerValue: "{client_cert_dnsname_sans}" - headerName: "X-Client-Cert-Valid-Not-Before" headerValue: "{client_cert_valid_not_before}" - headerName: "X-Client-Cert-Valid-Not-After" headerValue: "{client_cert_valid_not_after}" - headerName: "X-Client-Cert-Issuer-Dn" headerValue: "{client_cert_issuer_dn}" - headerName: "X-Client-Cert-Subject-Dn" headerValue: "{client_cert_subject_dn}" - headerName: "X-Client-Cert-Leaf" headerValue: "{client_cert_leaf}" - headerName: "X-Client-Cert-Chain" headerValue: "{client_cert_chain}"