使用通用表达式语言
本页面介绍如何在 CA 池中使用通用表达式语言 (CEL) 以及证书颁发政策、证书模板和 Identity and Access Management (IAM) 条件。
概览
通用表达式语言 (CEL) 是一种开源的非图灵完备语言,可实现用于表达式求值的通用语义。Certificate Authority Service 支持 CEL,以针对证书颁发实施各种政策控制。
CA 服务支持两种 CEL 方言:
- 一种灵活的方言,可在 CA 池的证书颁发政策和证书模板中使用。
- 一种更受限的方言,可在 IAM 条件中使用。
用于证书颁发政策和证书模板的 CEL 方言
创建 CA 池或证书模板时,您可以指定 CEL 表达式作为证书身份限制条件的一部分。借助 CEL 表达式,您可以验证主题和主题备用名称 (SAN) 字段。
如需详细了解颁发政策,请参阅添加证书颁发政策。
如需详细了解证书模板,请参阅 政策控制概览。
用于 CA 池和证书模板的身份限制条件的 CEL 方言公开了以下变量,用于访问和验证主题和 SAN 字段:
- 主题:
subject - SAN:
subject_alt_names
主题
您可以使用类型为 Subject 且名称为 subject 的变量,验证证书请求中指定的所有证书主题域名(包括通用名称)中的字段。
Subject 是一个包含以下字段的结构:
| 类型 | 名称 |
|---|---|
String |
common_name |
String |
country_code |
String |
组织 |
String |
organizational_unit |
String |
locality |
String |
province |
String |
street_address |
String |
postal_code |
主题备用名称 (SAN)
您可以使用 subject_alt_names 变量验证证书请求中指定的所有 SAN。subject_alt_names 变量包含 SAN 结构列表,其中每个 SAN 的类型均为 SubjectAltName。
SubjectAltName 是一个包含以下字段的结构:
| 类型 | 名称 |
|---|---|
String |
值 |
[]Int32 |
oid |
Enum |
类型 |
您可以为 SubjectAltName 类型使用以下值:
DNSURIEMAILIP_ADDRESSCUSTOM
subject_alt_names 变量包含一个列表,其中包含所有请求的 SAN。
您可以对 SAN 使用以下宏:
subject_alt_names.all(san, predicate)subject_alt_names.exists(san, predicate)subject_alt_names.exists_one(san, predicate)subject_alt_names.filter(san, predicate)
如需详细了解宏,请参阅语言定义:宏。
表达式示例
确保特定的通用名称和一组国家/地区
subject.common_name == "google.com" && (subject.country_code == "US" || subject.country_code == "IR")
确保所有 DNS 名称都以自定义字符串结尾
subject_alt_names.all(san, san.type == DNS && san.value.endsWith(".test.com"))
确保所有 SAN 的类型均为 DNS 或 EMAIL
subject_alt_names.all(san, san.type == DNS || san.type == EMAIL )
确保只有一个具有特定 OID 的自定义 SAN
subject_alt_names.size() == 1 && subject_alt_names[0].oid == [1, 2, 3, 5, 17]
确保自定义 SAN 仅为一组 OID
subject_alt_names.all(san, san.oid == [1, 2, 4, 5, 55] || san.oid == [1, 2, 4, 5, 54])
用于 IAM 政策的 CEL 方言
使用 IAM 条件,使 IAM 角色绑定服从条件表达式。如果条件计算结果为 true,则 IAM 角色绑定有效,否则会被忽略。借助 CA 服务,您可以向 CA 池添加 IAM 条件绑定。
IAM 条件是一个 CEL 表达式,它引用一组关于请求的上下文特性,计算结果为布尔值。用户在 IAM 政策中设置角色绑定的条件,IAM 会存储该政策并对其进行评估,以确定是否允许即将执行的操作。
如需详细了解 IAM 条件,请参阅 IAM 条件概览。
在对 IAM 条件进行 CEL 评估期间,系统会公开以下属性:
privateca.googleapis.com/subjectprivateca.googleapis.com/subject可作为api.getAttribute('privateca.googleapis.com/subject', {})访问。
| 类型 | 说明 |
|---|---|
map{string, string} |
此字段包含传入证书请求中指定的主题标识名(包括通用名称)。 示例 { |
privateca.googleapis.com/subject_alt_namesprivateca.googleapis.com/subject_alt_names可作为api.getAttribute('privateca.googleapis.com/subject_alt_names', [])访问。
| 类型 | 说明 |
|---|---|
list{string} |
此字段包含传入证书请求中指定的所有请求的 SAN。每个请求的 SAN 都以其类型为前缀。类型未知的 SAN 以类型的序列化 OID 为前缀。 示例 { |
privateca.googleapis.com/templateprivateca.googleapis.com/template可作为api.getAttribute('privateca.googleapis.com/template', '')访问。
| 类型 | 说明 |
|---|---|
String |
使用的证书模板(如果有)。格式为 {project_id}/-/{template_id}.示例: my-project-pki/-/workload_tls |
模板语法使用 {project_id}/-/{template_id},而不是标准完整资源名称
projects/{project_id}/locations/{location}/certificateTemplates/{template_id},因为证书模板必须与 CA
池位于同一位置。
在此格式中,连字符 (-) 充当位置通配符,这使得 CEL 条件简洁、易读且与位置无关。
IAM 条件中提供的模板名称必须与证书请求中的模板名称一致。因此,如果您在 CEL 表达式的
privateca.googleapis.com/template 属性中提供项目 ID,则在请求证书时也必须提供项目
ID。如果您在 CEL 表达式中提供项目编号,则还必须在证书请求中提供项目编号。
表达式示例
确保所有主题的组织都设置为“Example”,并且国家/地区代码设置为 US 或 UK
api.getAttribute('privateca.googleapis.com/subject', {})['organization'] == 'Example' &&
api.getAttribute('privateca.googleapis.com/subject', {})['country_code'] in ['US', 'UK']
确保证书请求仅包含给定的 DNS SAN
api.getAttribute('privateca.googleapis.com/subject_alt_names', [])
.hasOnly(['dns:sample1.prod.example.com', 'dns:sample2.prod.example.com'])
确保所有证书都使用特定模板
api.getAttribute('privateca.googleapis.com/template', '') == 'my-project-pki/-/leaf-server-tls'
后续步骤
- 阅读 CEL 简介。
- 详细了解 CEL 的语言定义。
- 了解证书模板和颁发政策。
- 阅读 IAM 条件概览。
- 了解如何向 CA 池添加证书颁发政策。