本页面介绍了如何通过将自行管理的证书用于全球外部应用负载均衡器来设置后端 mTLS。
配置后端 mTLS 的步骤与配置后端验证的 TLS 类似,只是您还需要为负载均衡器创建证书。此证书(也称为客户端证书)附加到后端身份验证配置资源。负载均衡器使用此客户端证书向后端验证自己的身份。
如需配置后端 mTLS,您需要执行以下操作:
- 创建包含根证书和中间证书的信任配置资源。
- 创建客户端证书并将其上传到 Certificate Manager。
- 创建一个同时引用信任配置和客户端证书的后端身份验证配置资源。
- 将后端身份验证配置资源附加到负载均衡器的后端服务。
准备工作
- 查看后端验证的 TLS 和后端 mTLS 概览。
- 查看管理信任配置。
如果您想使用 Google Cloud CLI 来按照本指南中的说明操作,则需要安装该工具。您可以在 API 和 gcloud CLI 参考文档中找到与负载均衡相关的命令。
如果您之前未运行过 gcloud CLI,请先运行
gcloud init
命令进行身份验证。启用以下 API:Compute Engine API、Certificate Manager API、Network Security 和 Network Services API。如需了解详情,请参阅启用 API。
使用以下任一受支持的后端配置全球外部应用负载均衡器:
- 虚拟机实例组后端
- 混合连接 NEG
- 区域 NEG
权限
本部分列出了配置后端 mTLS 所需的权限。操作 | 权限 |
---|---|
创建信任配置 | 目标 Google Cloud 项目上的 certificatemanager.trustconfigs.create |
创建客户端证书 | 目标 Google Cloud 项目上的 certificatemanager.certs.create |
创建后端身份验证配置资源 |
certificatemanager.certs.use 权限certificatemanager.trustconfigs.use 权限networksecurity.backendauthenticationconfigs.create |
将后端身份验证配置资源附加到负载均衡器的后端服务 |
compute.backendservice.update 权限networksecurity.backendauthenticationconfigs.use 权限 |
设置概览
后续部分介绍了如何根据下图所示的架构配置后端 mTLS:
创建根证书和中间证书
本部分使用 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=serverAuth 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
为中间证书创建证书签名请求 (CSR)
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
设置证书格式
如需在受信任证书存储区中添加新证书或现有证书,请将证书格式设置为单行并将它们存储在环境变量中,以便信任配置 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')
创建信任配置资源
信任配置是一项资源,用于表示您在 Certificate Manager 中的公钥基础架构 (PKI) 配置。
如需创建信任配置资源,请完成以下步骤:
控制台
在 Google Cloud 控制台中,前往 Certificate Manager 页面。
在信任配置标签页上,点击添加信任配置。
输入配置的名称。
在位置部分,选择全球。位置表示信任配置资源的存储位置。对于全球外部应用负载均衡器,您需要创建一个全球信任配置资源。
在受信任证书存储区部分中,点击添加信任锚,然后上传 PEM 编码的证书文件,或复制证书的内容。
点击添加。
在受信任证书存储区部分中,点击添加中间 CA,然后上传 PEM 编码的证书文件,或复制证书的内容。通过此步骤,您可以在根证书和服务器证书之间再添加一层信任。
点击添加以添加中间 CA。
如需添加您已添加到许可名单的证书,请点击添加。
点击创建。
验证新的信任配置资源是否显示在配置列表中。
gcloud
创建一个信任配置 YAML 文件 (
trust_config.yaml
),用于指定信任配置参数。此示例信任配置资源包含一个受信任证书存储区,该存储区具有一个信任锚和一个中间证书。此示例信任配置资源会从上一步设置证书格式中创建的环境变量中读取证书内容。cat << EOF > trust_config.yaml trustStores: - trustAnchors: - pemCertificate: "${ROOT_CERT}" intermediateCas: - pemCertificate: "${INTERMEDIATE_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
:信任配置资源的名称
创建客户端证书
在后端 mTLS 中,负载均衡器充当客户端,而后端充当服务器。
如需启用后端 mTLS,负载均衡器需要向后端证明其身份。执行此身份验证使用的是负载均衡器向后端提供的客户端证书。后端服务器需要使用自己的信任链验证客户端证书。
连接到后端服务器时,负载均衡器会将服务器名称指示 (SNI) 设置为 TLS 配置中指定的主机名。后端服务器会根据此 SNI 值选择适当的 SSL/TLS 证书。负载均衡器希望 SNI 值与后端服务器证书中列出的主题备用名称 (SAN) 匹配。
客户端证书可以是私有 CA 中通过 Certificate Authority Service 管理的证书,也可以是自行管理的私有 PKI 证书。在此示例中,客户端证书是使用自行管理的证书颁发的。本部分使用 OpenSSL 库创建根 CA 证书和客户端证书。
如需创建客户端证书,请完成以下步骤:
创建 OpenSSL 配置文件。
在以下示例中,配置文件 (
example.cnf
) 包含[ca_exts]
部分,该部分指定了将证书标记为适合证书授权机构 (CA) 的 X.509 扩展。extendedKeyUsage
属性设置为clientAuth
。如需详细了解根证书和中间证书的要求,请参阅证书要求。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 根 CA 证书 (
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
创建配置文件以生成客户端证书的 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
创建客户端证书的 CSR (
client.csr
)。openssl req -new \ -config client.config \ -keyout client.key -out client.csr
使用 CSR 创建客户端证书 (
client.cert
)。CSR 由根 CA 证书签名,以颁发 X.509 客户端证书。openssl x509 -req \ -CAkey root.key -CA root.cert \ -days 365 \ -extfile client.config \ -extensions extension_requirements \ -in client.csr -out client.cert
将客户端证书上传到 Certificate Manager
如需将客户端证书上传到 Certificate Manager,请完成以下步骤:
控制台
在 Google Cloud 控制台中,前往 Certificate Manager 页面。
在证书标签页上,点击添加证书。
输入证书名称。
该名称在项目中必须是唯一的。
可选:输入证书的说明。该说明有助于您日后识别特定证书。
在位置部分,选择全球。
在范围部分,选择客户端身份验证。
在证书类型部分,选择创建自行管理的证书。
对于证书字段,请上传 PEM 编码的证书文件,或复制并粘贴 PEM 编码的证书内容。
对于私钥证书字段,请上传未使用口令保护的 PEM 编码私钥,或复制并粘贴 PEM 编码私钥的内容。
指定要与证书关联的标签。您可以根据需要添加多个标签。如需添加标签,请点击
添加标签按钮,并为标签指定key
和value
。点击创建。验证新证书是否显示在证书列表中。
gcloud
如需将客户端证书上传到 Certificate Manager,请使用
gcloud certificate-manager certificates create
命令。此证书的范围是client-auth
,这表示此证书在后端 mTLS 中用作客户端证书。gcloud certificate-manager certificates create CLIENT_ CERTIFICATE_NAME \ --certificate-file=client.cert \ --private-key-file=client.key \ --scope=client-auth \ --global
替换以下内容:
CLIENT_CERTIFICATE_NAME
:客户端证书资源的名称。后端身份验证配置资源会使用此范围为client-auth
的客户端证书。
创建后端身份验证配置资源
如需创建后端身份验证配置 (BackendAuthenticationConfig
) 资源,请完成以下步骤。
控制台
- 在 Google Cloud 控制台中,前往身份验证配置页面。
- 在后端身份验证标签页中,点击创建。
- 为后端身份验证配置资源输入名称。
- 选择您之前创建的客户端证书资源。
- 可选:选择公共信任根。
- 选择您之前创建的信任配置资源。
- 点击创建。
验证是否显示了后端身份验证配置资源。
gcloud
创建一个 YAML 文件,该文件以声明方式指定后端身份验证配置资源的不同属性。
将客户端证书附加到后端身份验证配置资源,以启用后端 mTLS。
cat << EOF > BACKEND_AUTHENTICATION_CONFIG_RESOURCE_FILENAME.yaml name: projects/PROJECT_ID/locations/global/backendAuthenticationConfigs/BACKEND_AUTH_CONFIG_NAME trustConfig: projects/PROJECT_ID/locations/global/trustConfigs/TRUST_CONFIG_NAME clientCertificate: projects/PROJECT_ID/locations/global/certificates/CLIENT_ CERTIFICATE_NAME wellKnownRoots: PUBLIC_ROOTS EOF
替换以下内容:
BACKEND_AUTHENTICATION_CONFIG_RESOURCE_FILENAME
:在其中定义后端身份验证配置资源的 YAML 文件的名称。PROJECT_ID
:您的 Google Cloud 项目的 IDBACKEND_AUTH_CONFIG_NAME
:后端身份验证配置资源的名称TRUST_CONFIG_NAME
:您之前创建的信任配置资源的名称。CLIENT_CERTIFICATE_NAME
:您之前创建的客户端证书资源的名称。
如需导入后端身份验证配置资源,请使用
gcloud beta network-security backend-authentication-configs import
命令:gcloud beta network-security backend-authentication-configs import BACKEND_AUTH_CONFIG_NAME \ --source=BACKEND_AUTHENTICATION_CONFIG_RESOURCE_FILENAME.yaml \ --location=global
替换以下内容:
BACKEND_AUTH_CONFIG_NAME
:后端身份验证配置资源的名称BACKEND_AUTHENTICATION_CONFIG_RESOURCE_FILENAME
:在其中定义后端身份验证配置资源的 YAML 文件的名称。
将后端身份验证配置资源附加到负载均衡器的后端服务
如需将后端身份验证配置 (BackendAuthenticationConfig
) 资源附加到负载均衡器的后端服务,请完成以下步骤。
控制台
gcloud
如需列出项目中的所有后端服务资源,请使用
gcloud compute backend-services list
命令。gcloud compute backend-services list
记下要将
BackendAuthenticationConfig
资源附加到的后端服务的名称。此名称在后面的步骤中称为BACKEND_SERVICE_NAME
。如需将后端服务配置导出到文件,请使用
gcloud beta compute backend-services export
命令。gcloud beta compute backend-services export BACKEND_SERVICE_NAME \ --destination=BACKEND_SERVICE_FILENAME.yaml \ --global
替换以下内容:
BACKEND_SERVICE_NAME
:后端服务的名称BACKEND_SERVICE_FILENAME
:导出后端服务配置的 YAML 文件的名称和路径
更新后端服务的
tlsSettings
属性,将其指向后端身份验证配置资源。此外,您还可以在后端服务上配置 SNI 主机名和接受的 SAN,以验证后端证书。cat << EOF >> BACKEND_SERVICE_FILENAME.yaml tlsSettings: authenticationConfig: //networksecurity.googleapis.com/projects/PROJECT_ID/locations/global/backendAuthenticationConfigs/BACKEND_AUTH_CONFIG_NAME sni: examplepetstore.com subjectAltNames: - dnsName: examplepetstore.com - dnsName: api.examplepetstore.com EOF
上文 YAML 声明中的 SNI 和 SAN 值仅作为示例提供参考。您可以将其替换为与您的设置相关的实际值。
替换以下内容:
BACKEND_SERVICE_FILENAME
:导出后端服务配置的 YAML 文件的名称PROJECT_ID
:您的 Google Cloud 项目的 IDBACKEND_AUTH_CONFIG_NAME
:后端身份验证配置资源的名称
如需从某个文件导入更新后的后端服务配置,请使用
gcloud beta compute backend-services import
命令。gcloud beta compute backend-services import BACKEND_SERVICE_NAME \ --source=BACKEND_SERVICE_FILENAME.yaml \ --global
替换以下内容:
BACKEND_SERVICE_NAME
:后端服务的名称BACKEND_SERVICE_FILENAME
:后端服务配置 YAML 文件的名称
创建后端服务器证书
本部分提供了其他配置选项以用于创建由中间证书签名的服务器(叶)证书,这是信任配置的一部分。这确保了可以建立从服务器证书回溯到信任锚的一条信任链。
如果您已创建包含中间证书的信任配置资源,请执行以下操作:
创建配置文件以生成服务器证书的 CSR。
以下配置文件 (
server.config
) 包含[extension_requirements]
部分,该部分指定要包含在 CSR 中的 X.509 扩展。如需详细了解服务器证书的要求,请参阅证书要求。cat > server.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 = serverAuth subjectAltName = @alt_names [alt_names] DNS.1 = examplepetstore.com DNS.2 = api.examplepetstore.com [dn_requirements] countryName = US stateOrProvinceName = California localityName = San Francisco 0.organizationName = example organizationalUnitName = test commonName = examplepetstore.com emailAddress = test@examplepetstore.com EOF
创建服务器证书的 CSR (
server.csr
)。openssl req -new \ -sha256 -newkey rsa:2048 -nodes \ -config server.config \ -keyout server.key -out server.csr
对 CSR 进行签名以颁发 X.509 服务器证书 (
server.cert
)。CSR 由中间证书进行签名。openssl x509 -req \ -CAkey int.key -CA int.cert \ -days 365 \ -extfile server.config \ -extensions extension_requirements \ -in server.csr -out server.cert
当负载均衡器连接到后端服务器时,后端服务器会提供其证书 (
server.cert
) 以向负载均衡器验证自己的身份,从而完成后端身份验证流程。
Apache Web 服务器上的其他 SSL 配置选项
本可选部分将引导您根据之前创建的客户端证书和服务器证书更新 Apache 服务器上的 SSL 配置选项。-
将服务器私钥 (
server.key
) 和服务器证书 (server.cert
) 复制到 Apache Web 服务器。cat > server.key << EOF -----BEGIN PRIVATE KEY----- [...] -----END PRIVATE KEY----- EOF sudo cp ./server.key /etc/ssl/private/server.key
将
[...]
替换为您之前创建的 PEM 编码服务器私钥。cat > server.cert << EOF -----BEGIN CERTIFICATE----- [...] -----END CERTIFICATE----- EOF sudo cp ./server.cert /etc/ssl/certs/server.cert
将
[...]
替换为您之前创建的 PEM 编码服务器证书。 -
将客户端证书上传到服务器的信任配置,以验证客户端证书。
cat > client.cert << EOF -----BEGIN CERTIFICATE----- [...] -----END CERTIFICATE----- EOF sudo cp ./client.cert /etc/ssl/certs/client.cert
将 [...] 替换为您之前创建的 PEM 编码客户端证书。
-
更新 Apache Web 服务器的 SSL 配置。
更新 Apache 的 SSL 配置,以使用指定的 SSL 证书和私钥启用 HTTPS 流量。
sudo vi /etc/apache2/sites-available/default-ssl.conf ---- SSLCertificateFile /etc/ssl/certs/server.cert SSLCertificateKeyFile /etc/ssl/private/server.key ----
更新 Apache 的 SSL 配置,以要求进行客户端证书身份验证,并指定 CA 证书进行验证。
sudo vi /etc/apache2/sites-available/default-ssl.conf ---- SSLVerifyClient require SSLVerifyDepth 5 SSLCACertificateFile /etc/ssl/certs/client.cert ----
-
重新哈希处理 CA 证书。
sudo c_rehash /etc/ssl/certs/
-
重启 Apache Web 服务器以应用更改。
sudo systemctl restart apache2.service