添加证书颁发政策

在 CA Service 中添加证书签发政策涉及定义规则和限制,以控制证书授权机构 (CA) 签发的证书类型。如需详细了解证书颁发政策,请参阅证书颁发政策简介

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

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

准备工作

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

  • 创建 CA 池

您可以在创建 CA 池时或更新现有 CA 池时向 CA 池添加证书颁发政策。

请采用以下方法之一:

控制台

  1. 前往Google Cloud 控制台中的 Certificate Authority Service 页面。 前往 Certificate Authority Service

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

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

定义基本密钥用途

此设置是指数字证书中的 Key Usage 字段。它指定了证书的私钥可用于哪些用途,例如密钥加密、数据加密、证书签名和 CRL 签名。如需了解详情,请参阅密钥使用情况

  1. 如需选择基本密钥用途,请点击指定由此 CA 池颁发的证书的基本密钥用途切换开关,然后从列出的选项中进行选择。
  2. 点击下一步
定义扩展的密钥用途

此设置是指数字证书中的 Extended Key Usage (EKU) 字段。它对密钥的使用方式提供了更具体、更精细的限制,例如用于服务器身份验证、客户端身份验证、代码签名和电子邮件保护。如需了解详情,请参阅扩展密钥使用情况

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

  1. 如需选择扩展密钥用途,请点击将扩展密钥用途写入由此 CA 池颁发的证书切换开关,然后从列出的选项中进行选择。
  2. 点击下一步
定义政策标识符

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

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

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

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

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

  • 可用于检查证书的吊销状态的 OCSP 服务器的地址。
  • 证书颁发者的访问方法。

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

如需添加证书的 AIA 扩展字段中显示的 OCSP 服务器,请执行以下操作:

  1. 点击添加项目
  2. Server 网址(服务器网址)字段中,添加 OCSP 服务器的网址。
  3. 点击完成
  4. 点击下一步
CA 选项

证书模板中的 CA 选项字段用于定义如何在证书授权机构 (CA) 层次结构中使用生成的证书。CA 选项用于确定证书是否可用于签署其他证书,如果可以,则确定其颁发的证书的限制。

根据需要选择下列其中一项:

  1. 添加配置以描述 CA X.509 扩展:指定证书模板中用于控制 X.509 扩展的设置。

  2. 将已颁发的证书限制为仅用于 CA:只有在您选中上一步中提到的复选框后,此选项才会显示。此布尔值用于指示证书是否为 CA 证书。如果设置为 true,则该证书可用于为其他证书签名。如果值为 false,则表示相应证书是最终实体证书,无法为其他证书签名。 如果您点击此切换开关,系统会进一步提示您为 CA 证书中的扩展定义名称限制条件。

  3. 添加配置以描述路径长度限制 X.509 扩展:指定用于控制证书链长度的设置,该长度从特定证书开始计算。如果将颁发者路径长度上限设置为 0,则 CA 只能颁发最终实体证书。如果设置为 1,则此 CA 证书下的链只能包含一个从属 CA。如果未声明值,则此 CA 下方链中的下级 CA 数量不受限制。

  4. 点击下一步
配置其他扩展程序

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

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

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

gcloud

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

  1. 使用 Cloud Shell 编辑器创建一个包含以下内容的文件 policy.yaml

    identityConstraints:
      allowSubjectPassthrough: true
      allowSubjectAltNamesPassthrough: true
    

    其中:

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

    gcloud privateca pools update POOL_NAME --location LOCATION --issuance-policy FILE_PATH
    

    替换以下内容:

    • POOL_NAME:CA 池的名称。
    • LOCATION:CA 池的位置。如需查看位置的完整列表,请参阅位置
    • FILE_PATHpolicy.yaml 文件的路径。

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

支持的限制

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

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

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

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

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

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

如果您更新 baseline_values 字段的任何部分,相应更新会替换 baseline_values 字段中的整个值集。

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

    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)][4]{: .external} 表达式。CEL 表达式允许对证书的主题域名(包括通用名称)和 SAN 进行任意限制。

如需详细了解如何使用 CEL 表达式来限制 Subject 和 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" )'
    

限制所签发证书的回溯日期时长

如需为签发的证书设置过去的 not_before_time,请使用 backdate_duration 字段。配置后,此 CA 池中的证书的 not_before_time 等于签发时间减去指定的时长。系统会调整 not_after_time,以保持所请求的证书生命周期。backdate_duration 必须小于或等于 48 小时。

示例

如需将证书的日期提前 1 小时,请使用以下 policy.yaml 文件:

policy.yaml

backdateDuration: 3600s

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

如需限制所颁发证书的有效期,请使用 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 中所述。

后续步骤