将证书颁发政策添加到 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 池颁发的证书中配置基准值,请执行以下操作:

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

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

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

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

  1. 可选:如果要指定证书的基本密钥用途,请在出现的窗口中点击切换开关。
  2. 选中密钥的使用方式对应的复选框。
  3. 选择您希望使用密钥的概要方式。
  4. 点击下一步
定义扩展密钥用法

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

扩展的密钥用途使用对象标识符 (OID) 进行定义。如果您不配置扩展密钥用法,系统将允许所有密钥使用情形。

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

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

  1. 可选:如需指定 CA 池颁发的证书的扩展密钥用法,请点击切换开关。
  2. 选中扩展密钥使用场景对应的复选框。
  3. 点击下一步
定义政策标识符

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

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

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

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

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

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

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

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

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

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

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

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

配置扩展程序限制条件

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

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

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

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

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

如需了解如何在证书颁发政策中配置其他参数,请参阅 IssuancePolicy

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 扩展将从证书请求复制到签名证书中。否则,将舍弃请求的 SubjectAltName。
  2. 如需使用上一步中创建的文件更新 CA 池的证书颁发政策,请运行以下命令:

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

    请替换以下内容:

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

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

支持的限制

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 密钥,或采用 NIST P-256 曲线的椭圆曲线数字签名算法 (ECDSA) 密钥。

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 中所述)。

后续步骤