添加证书颁发政策

在 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_PATH:policy.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。您可以通过以下两种互斥的方式在签发政策中配置此设置:

方法 1:自动将数据池级日期调回

从此 CA 池颁发的所有证书都会自动回溯一段固定的时间。

使用 backdate_duration 字段。证书的 not_before_time 等于签发时间减去指定时长。系统会调整 not_after_time 以保持所请求的生命周期。backdate_duration 必须小于或等于 48 小时。

示例

将证书的日期往回调整 1 小时:

policy.yaml

backdateDuration: 3600s

方案 2:由请求者指定的自定义回溯

允许请求者为每个证书请求指定自定义 not_before_time。

使用 allow_requester_specified_not_before_time 字段。如果设置为 true,请求者可以在创建证书时提供特定的 requested_not_before_time。

此政策具有以下限制:

  • 不能是将来的日期。
  • 必须在过去 48 小时内。
  • 必须晚于或等于发证 CA 的 not_before_time(即其创建时间)。

示例

如需允许自定义回溯,请执行以下操作:

policy.yaml

allowRequesterSpecifiedNotBeforeTime: true

在 CA 池中配置此政策后,请求者必须在每个证书请求中指定开始时间(使用 requested_not_before_time 标志)(例如,在 gcloud 中使用 --requested-not-before-time 标志)。

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

如需限制所颁发证书的有效期,请使用 maximum_lifetime 字段。如果证书的请求有效期大于最长有效期,则证书的有效期会被明确截断。

示例

如需允许最长 30 天的有效期,请使用以下 policy.yaml 文件:

policy.yaml

maximumLifetime: 2592000s

限制允许的证书颁发模式

您可以通过证书签名请求 (CSR) 或内嵌的请求值说明来请求证书。某些组织可能更倾向于限制可使用的选项,因为后一种方法不需要关联私钥的所有权证明。您可以使用 [allowedIssuanceModes][1] 字段设置这些限制。

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

如需详细了解如何请求证书,请参阅创建证书请求。

  • 示例:仅允许颁发 CSR。

policy.yaml

allowedIssuanceModes:
  allowCsrBasedIssuance: True
  allowConfigBasedIssuance: False

限制证书请求的公钥算法

如需限制证书可使用的最短密钥长度和公钥算法,您可以使用证书签发政策 YAML 文件中的 [allowedKeyTypes][3] 字段。如果指定了此字段,则证书请求的公钥必须与 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 中所述。

后续步骤

[1]:/certificate-authority-service/docs/reference/rest/v1/projects.locations.caPools#IssuancePolicy.FIELDS.allowed_issuance_modes [2]:/certificate-authority-service/docs/reference/rest/v1/projects.locations.caPools#IssuanceModes [3]:/certificate-authority-service/docs/reference/rest/v1/projects.locations.caPools#IssuancePolicy.FIELDS.allowed_key_types