添加证书颁发政策

在 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 仅针对双向 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)][4]{: .external} 表达式。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 中所述。

后续步骤