将证书颁发政策添加到 CA 池

本页面介绍如何将证书颁发政策添加到证书授权机构 (CA) 池。

通过证书颁发政策,您可以指定可包含在已颁发证书中的主题和主题备用名称 (SAN)。您可以在创建 CA 池时指定证书颁发政策,也可以更新现有 CA 池以添加颁发政策。

如需了解详情,请参阅模板和发布政策概览

准备工作

  • 确保您拥有 CA Service Operation Manager (roles/privateca.caManager) 或 CA Service Admin (roles/privateca.admin) IAM 角色。如需了解如何向主帐号授予 IAM,请参阅授予单个角色

  • 创建 CA 池

添加证书颁发政策文件

如需将证书颁发政策添加到现有 CA 池,请执行以下操作:

控制台

  1. 转到 Google Cloud 控制台中的 Certificate Authority Service 页面。

    转到 Certificate Authority Service

  2. CA 池管理器页面上,点击要为其添加证书颁发政策的 CA 池的名称。

  3. CA 池页面上,点击 修改

配置身份限制条件

如需针对 CA 池发出的证书中的主题和 SAN 配置限制条件,请执行以下操作:

  1. 可选:如需禁止传递证书请求中的主题,请点击切换开关。
  2. 可选:如需禁止传递证书请求中的主题备用名称,请点击切换开关。
  3. 可选:添加通用表达式语言 (CEL) 表达式以对证书主题施加限制。如需了解详情,请参阅使用 CEL
  4. 点击 Next
配置扩展程序限制条件

如需禁止将证书请求中的所有扩展包含在已颁发的证书中,请点击切换开关。

点击切换开关后,您会看到已知证书扩展字段,您可以使用该字段选择证书扩展。如需选择证书扩展,请执行以下操作:

  1. 可选:点击已知证书扩展字段,然后从菜单中清除不需要的扩展。
  2. 可选:在自定义扩展程序字段中,为要包含在 CA 池颁发的证书中的扩展程序添加对象标识符。
配置基准值

如需在从 CA 池颁发的证书中配置基准值,请执行以下操作:

  1. 点击切换开关。
  2. 点击配置基准值
定义基本密钥用法

您可以使用此设置来配置证书中包含的密钥的使用方式。密钥使用选项包括密钥加密、数据加密、证书签名、CRL 签名等。

如需了解详情,请参阅密钥用法

如需定义基本密钥用法,请执行以下操作:

  1. 可选:如果您想指定证书的基本密钥用途,请在显示的窗口中点击切换开关。
  2. 选中密钥使用方式所对应的复选框。
  3. 选择密钥的大致用途。
  4. 点击 Next
定义扩展的密钥用法

您可以使用此设置来选择更精细的场景,以便使用证书中包含的密钥。具体选项包括服务器身份验证、客户端身份验证、代码签名、电子邮件保护等。

扩展的密钥用途是使用对象标识符 (OID) 定义的。如果您未配置扩展密钥用法,则系统将允许所有密钥使用场景。

如需了解详情,请参阅扩展的密钥用法

如需定义扩展的密钥用途,请执行以下操作:

  1. 可选:如需为 CA 池颁发的证书指定扩展密钥用途,请点击切换开关。
  2. 选中扩展的密钥用例对应的复选框。
  3. 点击 Next
定义政策标识符

证书中的证书政策扩展程序表示颁发证书的 CA 池遵循的政策。此扩展程序可以包含以下方面的信息:在证书颁发之前如何验证身份、如何撤消证书,以及如何确保 CA 池的完整性。此扩展程序可帮助您验证 CA 池颁发的证书,并查看证书的使用方式。

如需了解详情,请参阅证书政策

如需指定用于定义证书使用情况的政策,请执行以下操作:

  1. 可选:在政策标识符字段中添加政策标识符。
  2. 点击 Next
添加授权信息访问 (AIA) OCSP 服务器

证书中的 AIA 扩展提供了以下信息:

  • OCSP 服务器的地址,您可以在其中查看证书的吊销状态。
  • 证书颁发者的访问方法。

如需了解详情,请参阅授权信息访问权限

如需添加显示在证书的 AIA 扩展字段中的 OCSP 服务器,请执行以下操作。以下过程是可选的。

  1. 可选:点击添加一项
  2. 服务器网址字段中,添加 OCSP 服务器的网址。
  3. 点击完成
  4. 点击 Next
配置其他扩展程序

如需配置其他自定义扩展以包含在 CA 池颁发的证书中,请执行以下操作。以下过程是可选的。

  1. 点击添加一项
  2. 对象标识符字段中,添加格式为英文句点分隔的数字的有效对象标识符。
  3. 字段中,添加标识符的 base64 编码值。
  4. 如果扩展程序至关重要,请选择扩展程序至关重要

要保存所有基准值配置,请点击完成

gcloud

如需使用 Google Cloud CLI 将证书颁发政策添加到 CA 池,您必须创建一个 YAML 文件,用于描述 CA 池可以发出的证书限制。内容对应于 IssuancePolicy

  1. 使用 Cloud Shell Editor,创建一个包含以下内容的 policy.yaml 文件:

    identityConstraints:
      allowSubjectPassthrough: true
      allowSubjectAltNamesPassthrough: true
    

    其中:

    • allowSubjectPassthrough 是必填字段。如果 allowSubjectPassthrough 字段设置为 true,则系统会将主题字段从证书请求复制到已签署的证书。否则,所请求的主题将被丢弃。
    • 如果 allowSubjectAltNamesPassthrough 字段设为 true,系统会将 SubjectAltNames 扩展程序从证书请求复制到已签署的证书。否则,请求的 SubjectAltNames 将被丢弃。
  2. 如需使用上一步中创建的文件更新 CA 池的证书颁发政策,请运行以下命令:

    gcloud privateca pools update POOL_NAME \
      --issuance-policy FILE_PATH
    

    替换以下内容:

    • POOL_NAME:CA 池的名称。
    • FILE_PATHpolicy.yaml 文件的路径。

    如需详细了解 gcloud privateca pools update 命令,请参阅 gcloud privatecapool update

如需了解详情,请参阅创建 CA 池

支持的限制

CA Service 支持以下颁发政策限制。您可以根据需要结合以下限制来构建自定义证书颁发政策。

限制或强制实施允许的 X.509 值

CA 池可以通过配置 passthrough_extensions 字段限制证书请求所允许的 X.509 值。

CA 池还可以使用 baseline_values 字段明确指定要添加到其所有已颁发证书中的 X.509 值,并覆盖任何请求的值。

CA 池的 baseline_values 值允许指定以下属性:

您还可以同时使用这些选项。

如果您更新 baseline_values 字段的任何部分,此更新将替换 baseline_values 字段中的整组值。

  • 示例:限制 CA 仅颁发双向 TLS (mTLS) 值为 X.509 的最终实体证书。

    policy.yaml

    baselineValues:
      caOptions:
        isCa: false
      keyUsage:
        baseKeyUsage:
          digitalSignature: true
          keyEncipherment: true
        extendedKeyUsage:
           clientAuth: true
           serverAuth: true
    
  • 示例:限制 CA 仅颁发具有基准 AIA OCSP 网址的最终实体代码签名证书。

    policy.yaml

    baselineValues:
      caOptions:
        isCa: false
      keyUsage:
        baseKeyUsage:
          digitalSignature: true
        extendedKeyUsage:
          codeSigning: true
      aiaOcspServers:
        - "http://foo.bar/revocation"
      additionalExtensions:
      - objectId:
          objectIdPath:
            - 1
            - 2
            - 3
        critical: false
        value: "base64 encoded extension value"
    

如需详细了解终端实体 mTLS 的证书配置文件,请参阅终端实体 mTLS

限制允许的身份字段

如需限制通过 CA 池颁发的证书的身份,您可以在颁发政策的 identity_constraints 字段中添加通用表达式语言 (CEL) 表达式。CEL 表达式允许对证书的主题域名(包括通用名称)和 SAN 进行任意限制。

如需详细了解如何使用 CEL 表达式限制主题和 SAN,请参阅使用 CEL

  • 示例:允许 CA 仅颁发与指定主题匹配的证书。

    policy.yaml

    identityConstraints:
      allowSubjectPassthrough: true
      allowSubjectAltNamesPassthrough: false
      celExpression:
        expression: 'subject.organization == "Example LLC" && subject.country_code in ["US", "UK"]'
    

    celExpression 字段为可选字段。在证书签名之前,使用通用表达式语言 (CEL) 表达式验证已解析的 X.509 主题和 SAN。如需详细了解如何使用 CEL 表达式,请参阅使用 CEL

  • 示例:仅允许 DNS 名称为 us.google.org 或以 .google.com 结尾的 SAN。

    policy.yaml

    identityConstraints:
      allowSubjectPassthrough: false
      allowSubjectAltNamesPassthrough: true
      celExpression:
        expression: 'subject_alt_names.all(san, san.type == DNS && (san.value == "us.google.org" || san.value.endsWith(".google.com")) )'
    
  • 示例:仅允许 URI 为 https://google.com/webhp 或以 spiffe://example-trust-domain-1/ns/namespace1/sa/ 开头的 SAN。

    policy.yaml

    identityConstraints:
      allowSubjectPassthrough: false
      allowSubjectAltNamesPassthrough: true
      celExpression:
        expression: 'subject_alt_names.all(san, san.type == URI && (san.value == "https://google.com/webhp" || san.value.startsWith("spiffe://example-trust-domain-1/ns/namespace1/sa/")) )'
    
  • 示例:仅允许电子邮件地址为 example@google.com 或以 @google.org 结尾的 SAN。

    policy.yaml

    identityConstraints:
      allowSubjectPassthrough: false
      allowSubjectAltNamesPassthrough: true
      celExpression:
        expression: 'subject_alt_names.all(san, san.type == EMAIL && (san.value == "example@google.com" || san.value.endsWith("@google.org")) )'
    
  • 示例:仅允许具有特定 OID 和自定义值的自定义 SAN。

    policy.yaml

    identityConstraints:
      allowSubjectPassthrough: false
      allowSubjectAltNamesPassthrough: true
      celExpression:
        expression: 'subject_alt_names.all(san, san.type == CUSTOM && san.oid == [1, 2, 3, 4] && san.value == "custom-data" )'
    

限制已颁发证书的最长有效期

如需限制已颁发证书的生命周期,请使用 maximum_lifetime 字段。如果证书请求的生命周期超过最长生命周期,则证书的生命周期会被明确截断。

示例

如需允许最长生命周期为 30 天,请使用以下 policy.yaml 文件:

policy.yaml

maximumLifetime: 2592000s

限制允许的证书颁发模式

您可以通过证书签名请求 (CSR) 或所请求值的内嵌说明来请求证书。某些组织可能希望针对可以使用的选项增加限制,因为后一种方法不需要证明拥有关联私钥。您可以使用 allowedIssuanceModes 字段设置这些限制。

如需详细了解如何指定从 CA 池请求证书的方式,请参阅 IssuanceModes

如需详细了解如何请求证书,请参阅请求证书并查看已颁发的证书

  • 示例:仅允许签发 CSR。

policy.yaml

allowedIssuanceModes:
  allowCsrBasedIssuance: True
  allowConfigBasedIssuance: False

限制证书请求的公钥算法

如需限制证书可以使用的最小密钥长度和公钥算法,您可以使用证书颁发政策 YAML 文件中的 allowedKeyTypes 字段。如果指定此字段,则证书请求的公钥必须与 YAML 文件中列出的任一密钥类型匹配。如果未指定此字段,则您可以使用任何密钥,但模数大小小于 2048 位的 RSA 密钥除外。如果您要使用模数大小小于 2048 位的 RSA 密钥,则必须使用证书颁发政策明确允许它。

示例:允许模数大小介于 3072 位和 4096 位(含)之间的 RSA 密钥或椭圆曲线数字签名算法 (ECDSA) 密钥通过 NIST P-256 曲线。

policy.yaml

allowedKeyTypes:
- rsa:
    minModulusSize: 3072
    maxModulusSize: 4096
- ellipticCurve:
    signatureAlgorithm: ECDSA_P256

您可以选择以下椭圆曲线签名算法之一:

  • EC_SIGNATURE_ALGORITHM_UNSPECIFIED - 可以使用任何签名算法。
  • ECDSA_P256 - NIST P-256 曲线上的椭圆曲线数字签名。
  • ECDSA_P384 - NIST P-384 曲线上的椭圆曲线数字签名。
  • EDDSA_25519 - 曲线 25519 的爱德华曲线数字签名算法,如 RFC 8410 中所述。

后续步骤