有效的客户端证书必须展示可回溯到受信任证书存储区中的信任锚(根证书)的信任链。本页面介绍了如何使用 OpenSSL 库配置自己的根证书和中间证书,从而创建自己的信任链。
在创建信任根后,本文档将简要介绍将信任根上传到 Certificate Manager TrustConfig 资源的受信任证书存储区的过程。接下来,将信任配置关联到客户端身份验证 (ServerTLSPolicy) 资源,然后将客户端身份验证资源附加到负载均衡器的目标 HTTPS 代理资源。
准备工作
- 查看双向 TLS 概览。
- 查看管理信任配置指南。
- 安装 Google Cloud CLI。如需全面了解此工具,请参阅 gcloud CLI 概览。您可以在 API 和 gcloud CLI 参考文档中找到与负载均衡相关的命令。 - 如果您之前未运行过 gcloud CLI,请先运行 - gcloud init命令进行身份验证。
- 启用以下 API:Compute Engine API、Certificate Manager API、Network Security 和 Network Services API。如需了解详情,请参阅启用 API。 
- 如果您使用的是全球外部应用负载均衡器或传统版应用负载均衡器,请确保您已使用以下任一受支持的后端设置负载均衡器: - 虚拟机实例组后端
- Cloud Storage 存储桶(只有在以下情况下才受支持:除后端存储桶外,至少还有一个后端服务也连接到负载均衡器)
- Cloud Run、App Engine 或 Cloud Run functions
- 混合连接
- Private Service Connect 后端
 
- 如果您使用的是区域级外部应用负载均衡器、跨区域内部应用负载均衡器或区域级内部应用负载均衡器,请确保您已设置负载均衡器,并使用以下任一受支持的后端: - 虚拟机实例组后端
- Cloud Run
- 混合连接
- Private Service Connect 后端
 
- 设置项目。 - gcloud- gcloud config set project PROJECT_ID 
权限
如需获得完成本指南所需的权限,请让管理员向您授予项目的以下 IAM 角色:
- 
             Compute Load Balancer Admin (roles/compute.loadBalancerAdmin)(如需创建负载均衡器资源,例如TargetHTTPSProxy)
- 
             Certificate Manager Owner (roles/certificatemanager.owner)(如需使用证书管理器资源)
- 
             Compute Network Admin (roles/compute.networkAdmin) 和 Compute Security Admin (roles/compute.securityAdmin)(如需创建安全和网络组件)
- 
             Project Creator (roles/resourcemanager.projectCreator)(如需创建项目)(可选)
如需详细了解如何授予角色,请参阅管理对项目、文件夹和组织的访问权限。
创建根证书和中间证书
本部分使用 OpenSSL 库创建根证书(信任锚)和中间证书。
根证书位于证书链的顶部。中间证书是可回溯到根证书的信任链的一部分。中间证书由根证书进行加密签名。当负载均衡器收到客户端证书时,它会通过建立一条从客户端证书回溯到配置的信任锚点的信任链来验证该证书。
使用以下命令创建根证书和中间证书。创建中间证书是可选操作。不过,在此设置中,我们使用中间证书对客户端证书进行签名。
- 创建 OpenSSL 配置文件。 - 在以下示例中,配置文件 ( - example.cnf) 包含- [ca_exts]部分,该部分指定了将证书标记为适合证书授权机构 (CA) 的 X.509 扩展。如需详细了解根证书和中间证书的要求,请参阅证书要求。- cat > example.cnf << EOF [req] distinguished_name = empty_distinguished_name [empty_distinguished_name] # Kept empty to allow setting via -subj command-line argument. [ca_exts] basicConstraints=critical,CA:TRUE keyUsage=keyCertSign extendedKeyUsage=clientAuth EOF
- 创建自签名 X.509 根证书 ( - root.cert)。该根证书使用自己的私钥 (- root.key) 进行自签名。- openssl req -x509 \ -new -sha256 -newkey rsa:2048 -nodes \ -days 3650 -subj '/CN=root' \ -config example.cnf \ -extensions ca_exts \ -keyout root.key -out root.cert
- 为中间证书创建证书签名请求 ( - int.req)。- openssl req -new \ -sha256 -newkey rsa:2048 -nodes \ -subj '/CN=int' \ -config example.cnf \ -extensions ca_exts \ -keyout int.key -out int.req
- 对 CSR 签名以创建 X.509 中间证书 ( - int.cert)。CSR 使用根证书进行签名。- openssl x509 -req \ -CAkey root.key -CA root.cert \ -set_serial 1 \ -days 3650 \ -extfile example.cnf \ -extensions ca_exts \ -in int.req -out int.cert
创建可添加到许可名单的自签名证书
您可以创建自签名证书,并将其添加到信任配置中的许可名单中。
使用以下 OpenSSL 命令创建自签名 X.509 证书。
   openssl req -x509 \
       -new -sha256 -newkey rsa:2048 -nodes \
       -days 3650 -subj '/CN=localhost' \
       -keyout allowlisted.key -out allowlisted.cert
然后,此证书会添加到信任配置中的 allowlistedCertificates 字段。
设置证书格式
如需在 TrustStore 中添加新证书或现有证书,请将证书格式设置为单行并将它们存储在环境变量中,以便信任配置 YAML 文件可以引用这些证书。
export ROOT_CERT=$(cat root.cert | sed 's/^[ ]*//g' | tr '\n' $ | sed 's/\$/\\n/g')
export INTERMEDIATE_CERT=$(cat int.cert | sed 's/^[ ]*//g' | tr '\n' $ | sed 's/\$/\\n/g')
如需在信任配置中添加已列入许可名单的新证书或现有证书,请将证书格式设置为单行并将它们存储在环境变量中,以便证书可以读入 YAML 文件中。对于已列入许可名单的证书,请使用以下命令将证书格式化为单行,并将它们存储在 ALLOWLISTED_CERT 环境变量中。
export ALLOWLISTED_CERT=$(cat allowlisted.cert | sed 's/^[ ]*//g' | tr '\n' $ | sed 's/\$/\\n/g')
创建信任配置资源
信任配置是一项资源,用于表示您在 Certificate Manager 中的公钥基础架构 (PKI) 配置。
如需创建信任配置资源,请完成以下步骤:
控制台
- 在 Google Cloud 控制台中,前往 Certificate Manager 页面。 
- 在信任配置标签页上,点击添加信任配置。 
- 输入配置的名称。 
- 对于位置,选择全球或区域级。 - 位置表示信任配置资源的存储位置。对于全球外部应用负载均衡器、传统应用负载均衡器和跨区域内部应用负载均衡器,请创建全球信任配置资源。对于区域级外部应用负载均衡器和区域级内部应用负载均衡器,请创建区域级信任配置资源。 - 如果您选择了区域级,请选择相应区域。 
- 在受信任证书存储区部分中,点击添加信任锚,然后上传 PEM 编码的证书文件,或复制证书的内容。 
- 点击添加。 
- 在受信任证书存储区部分中,点击添加中间 CA,然后上传 PEM 编码的证书文件,或复制证书的内容。 - 通过此步骤,您可以在根证书和服务器证书之间再添加一层信任。 
- 点击添加以添加中间 CA。 
- 可选:在已列入许可名单的证书部分中,点击添加证书,然后上传 PEM 编码的证书文件,或复制证书的内容。 
- 点击添加以添加列入许可名单的证书。 
- 点击创建。 
验证新的信任配置资源是否显示在配置列表中。
gcloud
- 创建一个信任配置 YAML 文件 ( - trust_config.yaml),用于指定信任配置参数。此示例信任配置资源包含一个受信任证书存储区,该存储区具有一个信任锚和一个中间证书。它会从上一步设置证书格式中创建的环境变量读取证书内容。- cat << EOF > trust_config.yaml trustStores: - trustAnchors: - pemCertificate: "${ROOT_CERT?}" intermediateCas: - pemCertificate: "${INTERMEDIATE_CERT?}" EOF- 如需创建包含其他信任锚或中间证书的受信任证书存储区,请在相应的部分添加 - pemCertificate行。
- 可选:在 - allowlistedCertificates字段中指定添加到信任配置 YAML 文件的证书。您无需受信任证书存储区即可将证书添加到许可名单中。- cat << EOF >> trust_config.yaml allowlistedCertificates: - pemCertificate: "${ALLOWLISTED_CERT?}" EOF- 已列入许可名单的证书表示可在信任配置中封装的任何证书,以便始终被视为有效。您可以使用 - pemCertificate字段的多个实例,来在许可名单中指定多个证书。
- 如需导入信任配置 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 前端的前端配置部分中,展开显示高级功能部分。 
- 从客户端身份验证列表中,选择客户端身份验证资源。 
- 点击完成。 
- 点击更新。 
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}"
   使用中间证书对客户端证书进行签名
本部分提供了用于生成客户端(叶)证书的其他配置选项。如果您已创建包含中间证书的 TrustConfig 资源,请执行以下操作:
- 创建配置文件以生成客户端证书的 CSR。 - 以下配置文件 ( - client.config) 包含- [extension_requirements]部分,该部分指定要包含在 CSR 中的 X.509 扩展。如需详细了解客户端证书的要求,请参阅证书要求。- cat > client.config << EOF [req] default_bits = 2048 req_extensions = extension_requirements distinguished_name = dn_requirements prompt = no [extension_requirements] basicConstraints = critical, CA:FALSE keyUsage = critical, nonRepudiation, digitalSignature, keyEncipherment extendedKeyUsage = clientAuth [dn_requirements] countryName = US stateOrProvinceName = California localityName = San Francisco 0.organizationName = example organizationalUnitName = test commonName = test.example.com emailAddress = test@example.com EOF- 如果您想将 SPIFFE 身份附加到配置文件,请执行以下操作: - 向 - [extension_requirements]部分添加- subjectAltName字段,如下所示:- subjectAltName = @sans_list 
- 在 - client.config文件底部添加一个新部分 (- [sans_list]),如下所示:- [sans_list] URI.1 = spiffe://example.com/test-identity 
 
- 创建客户端证书的 CSR ( - client.csr)。- openssl req -new \ -config client.config \ -keyout client.key -out client.csr
- 对 CSR 进行签名以颁发 X.509 客户端证书 ( - client.cert)。CSR 由中间证书进行签名。- openssl x509 -req \ -CAkey int.key -CA int.cert \ -days 365 \ -extfile client.config \ -extensions extension_requirements \ -in client.csr -out client.cert
- 使用客户端 SSL 证书向负载均衡器的 IP 地址发送安全的 HTTPS 请求。客户端会提供其证书 ( - client.cert) 以向负载均衡器对自己进行身份验证。- curl -v --key client.key --cert client.cert https://IP_ADDRESS - 将 IP_ADDRESS 替换为负载均衡器的 IP 地址。