本页面介绍了如何使用 Certificate Authority Service 创建私有证书授权机构 (CA) 并将证书上传到 Certificate Manager TrustConfig
资源。
您还将创建为应用负载均衡器配置双向 TLS 所需的网络安全资源。
准备工作
- 查看双向 TLS 概览。
安装 Google Cloud CLI。如需全面了解此工具,请参阅 gcloud CLI 概览。您可以在 API 和 gcloud CLI 参考文档中找到与负载均衡相关的命令。
如果您之前未运行过 gcloud CLI,请先运行
gcloud init
进行身份验证。确保您知道如何创建 CA 池。
如果您使用的是全球外部应用负载均衡器或传统版应用负载均衡器,请确保您已使用以下任一受支持的后端设置负载均衡器:
- 虚拟机实例组后端
- Cloud Storage 存储桶(只有在以下情况下才受支持:除后端存储桶外,至少还有一个后端服务也连接到负载均衡器)
- Cloud Run、App Engine 或 Cloud Run functions
- 混合连接
如果您使用的是区域级外部应用负载均衡器、跨区域内部应用负载均衡器或区域级内部应用负载均衡器,请确保您已设置负载均衡器,并使用以下任一受支持的后端:
- 虚拟机实例组后端
- Cloud Run
- 混合连接
权限
如需获得完成本指南所需的权限,请让您的管理员为您授予项目的以下 IAM 角色:
-
Compute Load Balancer Admin (
roles/compute.loadBalancerAdmin
)(如需创建负载均衡器资源,例如TargetHTTPProxy
) -
Certificate Manager Owner (
roles/certificatemanager.owner
)(如需使用 Certificate Manager 资源) -
Compute Network Admin (
roles/compute.networkAdmin
) 和 Compute Security Admin (roles/compute.securityAdmin
)(如需创建安全和网络组件) -
Project Creator (
roles/resourcemanager.projectCreator
)(如需创建项目 [可选])
如需详细了解如何授予角色,请参阅管理对项目、文件夹和组织的访问权限。
在 CA 池中创建根 CA
如需在私有 CA 池中创建根 CA,请完成以下步骤:
如需创建 CA 池,请使用
gcloud privateca pools create
命令:gcloud privateca pools create CA_POOL \ --location=us-central1
将
CA_POOL
替换为父级 CA 池的 ID 或名称。如需在 CA 池中创建根 CA,请使用
gcloud privateca roots create
命令:gcloud privateca roots create CA_ROOT \ --pool=CA_POOL \ --subject="CN=my-ca, O=Test LLC" \ --location=us-central1
替换以下内容:
CA_ROOT
:根 CA 的 ID 或名称。CA_POOL
:父级 CA 池的 ID 或名称。
如需描述新的 CA 并创建
root.cert
文件,请使用gcloud privateca roots describe
命令:gcloud privateca roots describe CA_ROOT \ --pool=CA_POOL \ --location=us-central1 \ --format='value(pemCaCertificates)' > root.cert
替换以下内容:
CA_ROOT
:私钥 CA 的 ID 或名称。CA_POOL
:父级 CA 池的 ID 或名称。
将证书格式设置为单行并将其存储在环境变量中,以便信任配置 YAML 文件可以引用它。
export ROOT=$(cat root.cert | sed 's/^[ ]*//g' | tr '\n' $ | sed 's/\$/\\n/g')
详情请参阅以下内容:
创建信任配置资源
信任配置是一项资源,表示证书管理器中您可用于双向 TLS 身份验证场景的公钥基础架构 (PKI) 配置。
如需创建信任配置资源,请完成以下步骤:
控制台
在 Google Cloud 控制台中,前往证书管理器页面。
在 Trust Configs 标签页上,点击 Add Trust Config。
输入配置名称。
对于位置,选择全球或区域级。
该位置表示信任配置资源的存储位置。对于全球外部应用负载平衡器、传统应用负载平衡器和跨区域内部应用负载平衡器,请创建全局信任配置资源。对于区域级外部应用负载平衡器和区域级内部应用负载平衡器,请创建区域信任配置资源。
如果您选择了区域级,请选择相应区域。
在信任库部分中,点击添加信任锚,然后上传 PEM 编码的证书文件,或复制证书的内容。
点击添加。
点击创建。
验证新的信任配置资源是否显示在配置列表中。
gcloud
创建一个用于指定信任配置参数的信任配置 YAML 文件 (
trust_config.yaml
)。在此示例中,信任配置资源是一个受信任证书存储区,它具有一个表示根证书的信任锚。此根证书是使用私有 CA 生成的。cat << EOF > trust_config.yaml name: TRUST_CONFIG_NAME trustStores: - trustAnchors: - pemCertificate: "${ROOT?}" EOF
如需导入信任配置 YAML 文件,请使用
gcloud certificate-manager trust-configs import
命令:全局
对于全球外部应用负载平衡器、传统应用负载平衡器和跨区域内部应用负载平衡器,请将
global
指定为存储信任配置资源的位置。gcloud certificate-manager trust-configs import TRUST_CONFIG_NAME \ --source=trust_config.yaml \ --location=global
替换以下内容:
TRUST_CONFIG_NAME
:信任配置资源的名称。
区域级
对于区域级外部应用负载平衡器和区域级内部应用负载平衡器,请指定存储信任配置资源的区域。
gcloud certificate-manager trust-configs import TRUST_CONFIG_NAME \ --source=trust_config.yaml \ --location=LOCATION
替换以下内容:
TRUST_CONFIG_NAME
:信任配置资源的名称。LOCATION
:存储信任配置资源的区域。默认位置是global
。
创建客户端身份验证资源
借助客户端身份验证(也称为 ServerTLSPolicy
)资源,您可以指定在验证客户端证书时使用的服务器端 TLS 模式和信任配置资源。当客户端向负载均衡器提供无效证书或没有证书时,clientValidationMode
指定客户端连接的处理方式。如需了解详情,请参阅 mTLS 客户端验证模式。
- 当
clientValidationMode
设置为ALLOW_INVALID_OR_MISSING_CLIENT_CERT
时,即使验证失败或缺少客户端证书,所有请求都会传递给后端。 - 当
clientValidationMode
设置为REJECT_INVALID
时,只有提供能够针对TrustConfig
资源进行验证的客户端证书的请求才会传递给后端。
如需创建客户端身份验证 (ServerTlsPolicy
) 资源,请完成以下步骤:
控制台
在 Google Cloud 控制台中,进入客户端身份验证页面。
点击创建客户端身份验证。
为客户端身份验证资源输入名称。
对于位置,选择全球或区域级。
对于全球外部应用负载平衡器、传统应用负载平衡器和跨区域内部应用负载平衡器,请将位置设置为全球。对于区域级外部应用负载均衡器和区域级内部应用负载均衡器,请将位置设置为配置负载均衡器的区域。
对于客户端身份验证模式,请选择负载均衡。
选择客户端验证模式。
选择您之前创建的信任配置资源。
点击创建。
验证是否已显示“客户端身份验证”(ServerTlsPolicy
)。
gcloud
根据您希望处理连接的方式,选择以下选项之一,以 YAML 格式定义客户端身份验证 (
ServerTlsPolicy
) 资源。方法 1:
clientValidationMode
设置为ALLOW_INVALID_OR_MISSING_CLIENT_CERT
。全局
对于全球外部应用负载平衡器、传统版应用负载平衡器和跨区域内部应用负载平衡器,请创建一个 YAML 文件,以声明方式指定客户端验证模式和全局信任配置资源:
cat << EOF > server_tls_policy.yaml name: SERVER_TLS_POLICY_NAME mtlsPolicy: clientValidationMode: ALLOW_INVALID_OR_MISSING_CLIENT_CERT clientValidationTrustConfig: projects/PROJECT_ID/locations/global/trustConfigs/TRUST_CONFIG_NAME EOF
区域级
对于区域级外部应用负载平衡器和区域级内部应用负载平衡器,请创建一个 YAML 文件,以声明方式指定客户端验证模式和区域信任配置资源:
cat << EOF > server_tls_policy.yaml name: SERVER_TLS_POLICY_NAME mtlsPolicy: clientValidationMode: ALLOW_INVALID_OR_MISSING_CLIENT_CERT clientValidationTrustConfig: projects/PROJECT_ID/locations/REGION/trustConfigs/TRUST_CONFIG_NAME EOF
方法 2:将
clientValidationMode
设置为REJECT_INVALID
。全局
对于全球外部应用负载平衡器、传统版应用负载平衡器和跨区域内部应用负载平衡器,请创建一个 YAML 文件,以声明方式指定客户端验证模式和全局信任配置资源:
cat << EOF > server_tls_policy.yaml name: SERVER_TLS_POLICY_NAME mtlsPolicy: clientValidationMode: REJECT_INVALID clientValidationTrustConfig: projects/PROJECT_ID/locations/global/trustConfigs/TRUST_CONFIG_NAME EOF
区域级
对于区域级外部应用负载平衡器和区域级内部应用负载平衡器,请创建一个 YAML 文件,以声明方式指定客户端验证模式和区域信任配置资源:
cat << EOF > server_tls_policy.yaml name: SERVER_TLS_POLICY_NAME mtlsPolicy: clientValidationMode: REJECT_INVALID clientValidationTrustConfig: projects/PROJECT_ID/locations/REGION/trustConfigs/TRUST_CONFIG_NAME EOF
替换以下内容:
SERVER_TLS_POLICY_NAME
:客户端身份验证 (ServerTlsPolicy
) 资源的名称。PROJECT_ID
:您的 Google Cloud 项目的 ID。LOCATION
:对于全球外部应用负载平衡器、传统应用负载平衡器和跨区域内部应用负载平衡器,请使用global
。对于区域级外部应用负载均衡器或区域级内部应用负载均衡器,请使用您在其中配置了负载均衡器的区域。TRUST_CONFIG_NAME
:您之前创建的信任配置资源的名称。
如需导入客户端身份验证
ServerTlsPolicy
资源,请使用gcloud network-security server-tls-policies import
命令:全局
对于全球外部应用负载平衡器、传统应用负载平衡器和跨区域内部应用负载平衡器,请将
--location
标志设置为global
。gcloud network-security server-tls-policies import SERVER_TLS_POLICY_NAME \ --source=server_tls_policy.yaml \ --location=global
替换以下内容:
SERVER_TLS_POLICY_NAME
:客户端身份验证 (ServerTlsPolicy
) 资源的名称。区域级
对于区域级外部应用负载均衡器和区域级内部应用负载均衡器,请将
--location
标志设置为负载均衡器的配置区域。gcloud network-security server-tls-policies import SERVER_TLS_POLICY_NAME \ --source=server_tls_policy.yaml \ --location=LOCATION
替换以下内容:
SERVER_TLS_POLICY_NAME
:客户端身份验证 (ServerTlsPolicy
) 资源的名称。可选:如需列出所有客户端身份验证 (
ServerTlsPolicies
) 资源,请使用gcloud network-security server-tls-policies list
命令:gcloud network-security server-tls-policies list \ --location=LOCATION
替换以下内容:
LOCATION
:对于全球外部应用负载平衡器、传统应用负载平衡器和跨区域内部应用负载平衡器,请使用global
。对于区域级外部应用负载平衡器或区域级内部应用负载平衡器,请使用您在其中配置了负载平衡器的区域。
将客户端身份验证资源附加到负载均衡器
要使双向 TLS 身份验证正常运行,在设置负载均衡器后,您需要将客户端身份验证 (ServerTLSPolicy
) 资源附加到负载均衡器的目标 HTTPS 代理资源。
控制台
在 Google Cloud 控制台中,转到负载均衡页面。
从负载均衡器列表中,选择您需要将客户端身份验证 (
ServerTLSPolicy
) 资源附加到的负载均衡器。点击
修改。在 HTTPS 前端的前端配置部分中,展开显示高级功能部分。
从 Client Authentication(客户端身份验证)列表中,选择 Client Authentication 资源。
点击完成。
点击更新。
gcloud
如需列出项目中的所有目标 HTTPS 代理资源,请使用
gcloud compute target-https-proxies list
命令:gcloud compute target-https-proxies list
记下目标 HTTPS 代理的名称,用于附加
ServerTLSPolicy
资源。此名称在后面的步骤中称为TARGET_HTTPS_PROXY_NAME
。如需将目标 HTTPS 代理的配置导出到文件,请使用
gcloud compute target-https-proxies export
命令:全局
gcloud 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 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
:您在其中配置了负载均衡器的区域。
如需列出所有客户端身份验证 (
ServerTlsPolicy
) 资源,请使用gcloud network-security server-tls-policies list
命令:gcloud network-security server-tls-policies list \ --location=LOCATION
替换以下内容:
LOCATION
:对于跨区域内部应用负载平衡器、全球外部应用负载平衡器或传统应用负载平衡器,请使用global
。对于区域级外部应用负载均衡器或区域级内部应用负载均衡器,请使用您在其中配置了负载均衡器的区域。记下客户端身份验证 (
ServerTLSPolicy
) 资源的名称,用于配置 mTLS。此名称在下一步中称为SERVER_TLS_POLICY_NAME
。将客户端身份验证 (
ServerTlsPolicy
) 附加到目标 HTTPS 代理。echo "serverTlsPolicy: //networksecurity.googleapis.com/projects/PROJECT_ID/locations/LOCATION/serverTlsPolicies/SERVER_TLS_POLICY_NAME" >> TARGET_PROXY_FILENAME
替换以下内容:
PROJECT_ID
:您的 Google Cloud 项目的 ID。LOCATION
:对于全球外部应用负载平衡器或传统应用负载平衡器以及跨区域内部应用负载平衡器,请使用global
。对于区域级外部应用负载均衡器或区域级内部应用负载均衡器,请使用您在其中配置了负载均衡器的区域。SERVER_TLS_POLICY_NAME
:客户端身份验证 (ServerTLSPolicy
) 资源的名称。TARGET_PROXY_FILENAME
:目标代理的配置文件的名称(采用 YAML 格式)。
如需从文件导入目标 HTTPS 代理的配置,请使用
gcloud compute target-https-proxies import
命令。全局
gcloud 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 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 连接失败。
向后端服务添加 mTLS 自定义标头
对于全球外部应用负载均衡器或传统版应用负载均衡器,您可以使用 自定义标头将 mTLS 连接的相关信息传递给后端服务。
如需列出项目中的所有后端服务,请使用
gcloud compute backend-services list
命令:gcloud compute backend-services list
记下后端服务的名称,用于启用自定义标头和日志记录。此名称在后面的步骤中称为
BACKEND_SERVICE
。如需更新后端服务,请使用
gcloud compute backend-services update
命令:gcloud compute backend-services update BACKEND_SERVICE \ --global \ --enable-logging \ --logging-sample-rate=1 \ --custom-request-header='X-Client-Cert-Present:{client_cert_present}' \ --custom-request-header='X-Client-Cert-Chain-Verified:{client_cert_chain_verified}' \ --custom-request-header='X-Client-Cert-Error:{client_cert_error}' \ --custom-request-header='X-Client-Cert-Hash:{client_cert_sha256_fingerprint}' \ --custom-request-header='X-Client-Cert-Serial-Number:{client_cert_serial_number}' \ --custom-request-header='X-Client-Cert-SPIFFE:{client_cert_spiffe_id}' \ --custom-request-header='X-Client-Cert-URI-SANs:{client_cert_uri_sans}' \ --custom-request-header='X-Client-Cert-DNSName-SANs:{client_cert_dnsname_sans}' \ --custom-request-header='X-Client-Cert-Valid-Not-Before:{client_cert_valid_not_before}' \ --custom-request-header='X-Client-Cert-Valid-Not-After:{client_cert_valid_not_after}'
将 mTLS 自定义标头添加到网址映射
对于跨区域内部应用负载均衡器、区域级外部应用负载均衡器或区域级内部应用负载均衡器,您可以使用 自定义标头将有关 mTLS 连接的信息传递给网址映射。
如需列出项目中的所有网址映射,请使用 gcloud compute url-maps list
命令:
gcloud compute url-maps list
记下网址映射的名称,以便启用自定义标头和日志记录。此名称在后面的步骤中称为 URL_MAP_NAME
。
全局
如需修改跨区域内部应用负载均衡器的网址映射,请使用 gcloud compute
url-maps edit
命令:
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
命令:
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}"