设置后端 mTLS

本页介绍了如何为全球外部应用负载平衡器使用自有证书设置后端 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
  • 目标 Google Cloud 项目上的 networksecurity.backendauthenticationconfigs.create
  • 将“后端身份验证配置”资源附加到负载平衡器的后端服务
  • 目标后端服务上的 compute.backendservice.update
  • 针对目标后端身份验证配置资源的 networksecurity.backendauthenticationconfigs.use
  • 设置概览

    以下部分介绍了如何根据下图所示的架构配置后端 mTLS:

    后端 mTLS 的组成部分。
    后端 mTLS 组件(点击可放大)。

    创建根证书和中间证书

    本部分使用 OpenSSL 库创建根证书(信任锚)和中间证书。

    根证书位于证书链的顶部。中间证书是返回根证书的信任链的一部分。中间证书由根证书进行加密签名。当负载平衡器收到服务器证书时,会通过从服务器证书建立信任链(一直延伸到配置的信任锚)来验证该证书。

    使用以下命令创建根证书和中间证书。

    1. 创建一个 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
      
    2. 创建自签名 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
      
    3. 为中间证书创建证书签名请求 (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
      
    4. 对 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')
    

    创建信任配置资源

    信任配置是一项资源,表示证书管理器中您可用于双向 TLS 身份验证场景的公钥基础架构 (PKI) 配置。

    如需创建信任配置资源,请完成以下步骤:

    控制台

    1. 在 Google Cloud 控制台中,前往证书管理器页面。

      前往 Certificate Manager

    2. Trust Configs 标签页上,点击 Add Trust Config

    3. 输入配置名称。

    4. 位置部分,选择全球。该位置表示信任配置资源的存储位置。对于全球外部应用负载平衡器,您需要创建一个全局信任配置资源。

    5. 信任库部分中,点击添加信任锚,然后上传 PEM 编码的证书文件,或复制证书的内容。

    6. 点击添加

    7. 信任库部分中,点击添加中间 CA,然后上传 PEM 编码的证书文件,或复制证书的内容。通过此步骤,您可以在根证书和服务器证书之间添加另一层信任。

    8. 点击添加以添加中间 CA。

    9. 如需将您添加到许可名单的证书添加到此处,请点击添加

    10. 点击创建

    验证新的信任配置资源是否显示在配置列表中。

    gcloud

    1. 创建一个用于指定信任配置参数的信任配置 YAML 文件 (trust_config.yaml)。此示例信任配置资源包含一个包含信任锚和中间证书的受信任证书存储区。此信任配置资源示例会从上一步设置证书格式中创建的环境变量读取证书内容。

      cat << EOF > trust_config.yaml
      trustStores:
      - trustAnchors:
        - pemCertificate: "${ROOT_CERT}"
        intermediateCas:
        - pemCertificate: "${INTERMEDIATE_CERT}"
      EOF
      

      如需创建包含其他信任锚或中间证书的信任库,请在相应的部分中添加 pemCertificate 行。

    2. 如需导入信任配置 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) 相匹配。

    客户端证书可以是通过 Certificate Authority Service 从私有 CA 管理的证书,也可以是自行管理的私有 PKI 证书。在此示例中,客户端证书是使用自行管理的证书颁发的。本部分使用 OpenSSL 库创建根 CA 证书和客户端证书。

    如需创建客户端证书,请完成以下步骤:

    1. 创建一个 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
      
    2. 创建自签名 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
      
    3. 创建一个配置文件,以便为客户端证书生成 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
      
    4. 为客户端证书创建 CSR (client.csr)。

        openssl req -new \
            -config client.config \
            -keyout client.key -out client.csr
      
    5. 根据 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

    如需将客户端证书上传到证书管理器,请完成以下步骤:

    控制台

    1. 在 Google Cloud 控制台中,前往证书管理器页面。

      前往 Certificate Manager

    2. 证书标签页上,点击添加证书

    3. 输入证书名称。

      该名称在项目中必须是唯一的。

    4. 可选:为证书输入说明。说明有助于您日后识别特定证书。

    5. 位置部分,选择全球

    6. 范围中,选择客户端身份验证

    7. 证书类型部分,选择创建自行管理的证书

    8. 对于证书字段,请上传 PEM 编码的证书文件,或复制并粘贴 PEM 编码的证书的内容。

    9. 对于私钥证书字段,请上传未使用口令保护的 PEM 编码私钥,或复制并粘贴 PEM 编码私钥的内容。

    10. 指定要与证书关联的标签。如果需要,您可以添加多个标签。如需添加标签,请点击 添加标签按钮,并为标签指定 keyvalue

    11. 点击创建。确认新证书是否显示在证书列表中。

    gcloud

    1. 如需将客户端证书上传到 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) 资源,请完成以下步骤。

    控制台

    1. 在 Google Cloud 控制台中,前往身份验证配置页面。

      前往“身份验证配置”页面

    2. 后端身份验证标签页中,点击创建
    3. 输入后端身份验证配置资源的名称。
    4. 选择您之前创建的客户端证书资源。
    5. 可选:选择公共信任根。
    6. 选择您之前创建的信任配置资源。
    7. 点击创建

    验证是否显示了“后端身份验证配置”资源。

    gcloud

    1. 创建一个 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 项目的 ID
      • BACKEND_AUTH_CONFIG_NAME:后端身份验证配置资源的名称
      • TRUST_CONFIG_NAME:您之前创建的信任配置资源的名称。
      • CLIENT_CERTIFICATE_NAME:您之前创建的客户端证书资源的名称。
    2. 如需导入后端身份验证配置资源,请使用 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) 资源附加到负载平衡器的后端服务,请完成以下步骤。

    控制台

    1. 在 Google Cloud 控制台中,转到负载均衡页面。

      转到“负载均衡”

    2. 后端标签页中,选择您需要为其启用后端身份验证 TLS 和后端 mTLS 的后端服务。

    3. 点击修改

    4. 展开高级配置部分。

    5. 后端身份验证部分中,选中启用复选框。

    6. 可选:指定 SNI 主机名和接受的 SAN 以验证后端证书

    7. 如需将“后端身份验证配置”资源附加到后端服务,请在后端身份验证配置列表中选择“后端身份验证配置”资源。

    8. 点击继续

    9. 如需更新后端服务设置,请点击更新

    gcloud

    1. 如需列出项目中的所有后端服务资源,请使用 gcloud compute backend-services list 命令

      gcloud compute backend-services list
      

      记下要将 BackendAuthenticationConfig 资源附加到的后端服务的名称。此名称在后面的步骤中称为 BACKEND_SERVICE_NAME

    2. 如需将后端服务配置导出到文件,请使用 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 文件的名称和路径
    3. 更新后端服务的 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 项目的 ID

      • BACKEND_AUTH_CONFIG_NAME:后端身份验证配置资源的名称

    4. 如需从文件导入更新后的后端服务配置,请使用 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 文件的名称

    创建后端服务器证书

    本部分提供了一个额外的配置选项,用于创建由中间证书(属于信任配置的一部分)签名的服务器(叶)证书。这可确保能够从服务器证书建立信任链,一直延伸到信任锚点。

    如果您已创建包含中间证书的信任配置资源,请执行以下操作:

    1. 创建一个配置文件,以便为服务器证书生成 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
      
    2. 为服务器证书创建 CSR (server.csr)。

      openssl req -new \
          -sha256 -newkey rsa:2048 -nodes \
          -config server.config \
          -keyout server.key -out server.csr
      
    3. 对 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 配置选项。

    1. 将服务器私钥 (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 编码服务器证书。

    2. 将客户端证书上传到服务器的信任配置,以验证客户端证书。

            cat > client.cert << EOF
            -----BEGIN CERTIFICATE-----
            [...]
            -----END CERTIFICATE-----
            EOF
      
            sudo cp ./client.cert /etc/ssl/certs/client.cert
            

      [...] 替换为您之前创建的 PEM 编码客户端证书。

    3. 更新 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
          ----
          
    4. 重新哈希 CA 证书。

          sudo c_rehash /etc/ssl/certs/
          
    5. 重启 Apache Web 服务器以应用更改。

          sudo systemctl restart apache2.service
          

    后续步骤