本文介绍了在 IDaaS 内置表达式引擎中使用 M2M 联邦凭证高级表达式的方法,并提供了对模型字段说明、函数说明以及相关参考示例。
基础说明
IDaaS 内置的表达式引擎支持在 M2M (Machine-to-Machine) 场景中使用高级表达式,用于编写联邦凭证提供方的信任条件和应用联邦凭证的校验条件。当目标应用需要处理额外参数,且这些参数需要进行转化、拼接或逻辑判断时,可通过表达式实现灵活配置。其中表达式由两大核心组件构成:
组件 | 名称 | 描述 |
模型 | Client。 | 客户端相关属性数据。 |
PKCS#7 联邦凭证模型。 | PKCS#7 格式凭证处理。 | |
PCA 联邦凭证模型。 | PCA 格式凭证处理。 | |
OIDC 联邦凭证模型。 | OIDC 协议相关凭证处理。 | |
函数 | / | 代表执行逻辑关系。 |
模型说明
一、Client(客户端模型)
在 IDaaS 表达式中,可以通过client.字段名
的形式访问 Client 模型的属性。下表列出了 Client 模型支持的字段及其说明:
字段名 | 数据类型 | 说明 |
clientId | String | 应用的 clientId。 |
applicationFederatedCredentialId | String | 应用联邦凭证 ID。 |
activeSubjectUrn | String | 保留的属性,由 applicationFederatedCredential 的字段映射生成,不支持调用。 |
二、PKCS#7 Federated Crendential(PKCS#7联邦凭证模型)
在 IDaaS 的 PKCS#7 联邦凭证模型中,您可以通过 pkcs7.字段名
的方式访问以下字段。该模型适用于 PKCS#7 联邦信任源的信任条件表达式和 PKCS#7 联邦凭证的校验条件表达式。
字段名 | 数据类型 | 说明 |
payload | object | / |
data | String | 从 PKCS#7 提取的 Content 原文。 |
jsonData | JSON对象 |
|
signingTime | Long | 签名时间戳,单位秒。当联邦信任源来源选择亚马逊云时才有值。 |
certificates | List<CertificateObject> | PKCS#7签名里包含的证书链,CertificateObject模型字段请参考文末标注。 |
三、PCA Fedrated Credential(PCA联邦凭证模型)
在 IDaaS 的 PCA 联邦凭证模型中,您可以通过 cert 对象访问以下字段。例如,获取证书颁发者的 CN(Common Name)字段,可使用表达式:cert.issuer.subject.CN。该模型适用于 PCA 联邦信任源的信任条件表达式和 PCA 联邦凭证的校验条件表达式场景。
属性 | 数据类型 | 描述 |
serialNumber | String | 证书序列号, 16进制(如果最高位是1则进行补0),全小写,不带冒号。 例如:6d5a2816af467************f6e974f114a061e 00d******dc305a652 根据 ASN.1 DER 编码规则,证书序列号的编码需满足以下要求: 若序列号的最高位(即最左侧字节的最高位)为 1,则必须在前面添加一个 0x00 前导字节,以确保其作为正整数进行正确解码。
|
issuer | CertificateSubjectObject | 证书颁发者对象:issuer.CN、issuer.C。 |
subject | CertificateSubjectObject | 证书对象:subject.C、subject.O、subject.OU。 |
fingerprint | String | 证书指纹,SHA256格式,全小写,不带冒号。 |
certificateCaIssuerUrl | String | 颁发者。 |
subjectKeyIdHex | String | 主体ID。 |
signatureOid | String | 1.2.840.113549.1.1.11 (SHA256withRSA) |
notBefore | Long | 证书开始时间,Unix时间戳,单位秒。 |
notAfter | Long | 证书结束时间,Unix时间戳,单位秒。 |
ca | Boolean | 用于标识该证书是否为证书颁发机构(CA)证书。此字段属于 X.509 v3 证书的扩展字段(extensions),而非主证书字段。 |
四、OIDC Federated Credential(OIDC联邦凭证模型)
在 IDaaS 的 OIDC 联邦凭证模型中,支持通过 jwt.字段名
的方式访问以下字段。该模型适用于OIDC联邦信任源的信任条件表达式和OIDC联邦凭证的校验条件表达式中。下表列出了OIDC联邦凭证模型的主要字段及其说明:
属性 | 数据类型 | 描述 |
iss | String | 令牌的颁发者(Issuer),表示授权服务器的URL,可通过 |
sub | String | 令牌的主体(Subject),表示用户的唯一标识符,可通过 |
aud | List<String> | 令牌目标受众(Audience),通常为资源服务器标识符或客户端ID。 说明 aud支持数组形式,如果需要校验aud,表达式需要写成:
可以使用 |
jti | String | 令牌的唯一标识符,用于防止重复使用。 |
exp | Long | 过期时间(Unix时间戳,单位:秒)。 |
nbf | Long | 生效时间(Unix时间戳,单位:秒)。 |
iat | Long | 签发时间(Unix时间戳,单位:秒)。 |
claims | Map | 所有的属性。 |
五、CertificateObject 模型
CertificateObject 模型用于处理证书相关的验证场景,提供对证书各个字段的访问能力。支持通过 cert.字段名
的方式访问以下字段,该模型适用于证书链验证、证书属性校验和证书有效期检查等场景。
属性 | 数据类型 | 描述 |
serialNumber | String | 证书序列号,16进制,全小写,不带冒号。 |
issuer | CertificateSubjectObject | 证书颁发者:issuer.CN、issuer.C 等。 |
subject | CertificateSubjectObject | 证书对象:subject.C、subject.O、subject.OU 等。 |
fingerprint | String | 证书指纹,SHA256格式,全小写,不带冒号。 |
certificateCaIssuerUrl | String | 颁发者。 |
subjectKeyIdHex | String | 主题ID。 |
signatureOid | String | 1.2.840.113549.1.1.11 (SHA256withRSA)。 |
notBefore | Long | 证书开始时间(Unix时间戳,单位秒)。 |
notAfter | Long | 证书结束时间(Unix时间戳,单位秒)。 |
ca | Boolean | 此字段为X.509 v3扩展字段(extensions),用于标识证书是否属于CA(证书颁发机构),取值为布尔值(true/false)。 |
CertificateSubjectObject模型字段如下:
属性 | 数据类型 | 描述 |
country(C) | String | 表示国家或者地区名称,通常使用两个字母的 ISO 代码,例如“US”代表美国,“CN”代表中国。支持多个C,以斜杠区分。 |
organization(O) | String | 表示组织名称,例如公司或机构的全称。支持多个O,以斜杠区分。 |
organizationalUnit(OU) | String | 表示组织内的部门或单位,例如“IT Department”或“Security Team”。支持多个OU,以斜杠区分:IT/fiance/HR。 |
commonName(CN) | String | 表示证书颁发者的通用名称,通常用于标识具体的服务器或个人。 |
distinguishedNameQualifier | String | 用于区分具有相同名称的实体。 |
state(ST) | String | 州或省,支持多个,以斜杠区分。 |
serialNumber | String | 组织内部的唯一标识符。 |
locality(L) | String | 表示城市或地区名称。支持多个,以斜杠区分。 |
title(T) | String | 表示职位或头衔,例如“Manager”。 |
surname | String | 表示姓氏或姓名,例如“John”或“Doe”。 |
givenName | String | 显示给用户的名字,例如“J. Doe”或“John Doe”。 |
initials | String | 显示给用户的名字的初始字母,例如“J”或“J.D.”。 |
pseudonym | String | 表示别名。 |
generationQualifier | String | 表示世代名称,例如“Jr.”(Junior)或“III”(第三)。 |
domainComponent(DC) | String | 域名组件,如 "example.com",支持多个,以斜杠区分 |
oidMap | Map<String,Object> | OID map对象。 |
函数说明
常用请参考:函数说明。
表达式示例
上述所有的模型,想要在表达式里面使用,都需要符合 JSON 语义进行取值。如果 JSON 的 key 出现的特殊字符,如“.”,“-”,“_”等字符,请使用单引号把该 key 包裹起来。
联邦信任源信任条件
PCA
// 获取PCA上传的证书issuer的CN字段,进行比较 // 比如证书issuer为:C=cn, ST=sichuan, L=chengdu, O=example, OU=test, CN=test Equals(cert.issuer.CN, "test") // 判断该证书是不是证书颁发机构(可以颁发其他证书) Equals(cert.ca, true)
OIDC
// 判断kubernetes集群的serviceaccount oidc token里面的subject是否正确 Equals(jwt.sub, "test") // 同时判断issuer和audience是否正确 And(Equals(jwt.iss, "https://example.com"), Equals(jwt.aud, "test_aud"))
PKCS#7
选择PKCS#7联邦信任源,用户不需要填写信任条件表达式。
联邦凭证校验条件
联邦凭证校验条件的表达式编写方式与联邦信任源的信任条件类似,均通过数据模型获取对应字段进行校验。IDaaS提供快捷配置模式,可自动生成基础校验表达式,简化配置流程。
PCA
// 当使用校验条件模式为证书模式时,填写的公用名(CN):example, 生成的表达式如下: Equals(cert.subject.CN, "example") // 如果需要自定义表达式,校验其他条件,请选择客户端证书字段表达式校验模式 // 比如想校验客户端证书issuer里面的country,location,province // 比如证书issuer为:C=cn, ST=sichuan, L=chengdu, O=example, OU=test, CN=test And(Equals(cert.issuer.C, "cn"), Equals(cert.issuer.L, "chengdu"), Equals(cert.issuer.ST, "sichuan")) // 判断证书的序列号,注意:序列号是16进制,全小写,不带冒号,可以使用函数进行转换 // 比如从证书看见的序列号为:6d:5a:28:16:af:46:7f:40:d3:8b:e7:28:0f:6e:97:4f:11:4a:06:1e,使用StringReplace()函数把冒号移除,表达式如下: // StringReplace("原始字符串","需要被替换的字符","替换后的字符") Equals(cert.serialNumber, StringReplace("6d:5a:28:16:af:46:7f:40:d3:8b:e7:28:0f:6e:97:4f:11:4a:06:1e",":","")) // 如果序列号为全大写,如:6D:5A:28:16:AF:46:7F:40:D3:8B:E7:28:0F:6E:97:4F:11:4A:06:1E // 使用ToLower()函数,把字符串转换成小写,再使用StringReplace()函数把冒号去掉 Equals(cert.serialNumber, StringReplace(ToLower("6D:5A:28:16:AF:46:7F:40:D3:8B:E7:28:0F:6E:97:4F:11:4A:06:1E"),":",""))
OIDC
// 当使用Kubernetes模式时,填入的命名空间:test,服务账号:test // 自动生成的表达式如下: And(Equals(jwt.claims.'kubernetes.io'.namespace, "test"), Equals(jwt.claims.'kubernetes.io'.serviceaccount.name, "test"), Equals(jwt.sub, "system:serviceaccount:test:test")) // 当使用的是主体标识模式,填入的主体标识:https://sub.example.com // 自动生成的表达式如下: Equals(jwt.sub, "https://sub.example.com") // 如果需要自定义表达式,校验其他条件,请选择Claims字段表达式校验模式 // 如需要校验当前OIDC token的jti字段,表达式如下: Equals(jwt.jti, "test_XXX") // 如果用户在OIDC Token的 Claims里面,自定义了一个字段为customValue,想要校验该字段,表达式如下: Equals(jwt.claims.customValue, "XXX") // 如果需要比较aud是否正确,aud是数组形式,需要通过数组下标来获取对应的aud值进行比较。 // 建议通过OIDC 联邦信任源的aud字段进行校验,不在联邦凭证的校验条件里面进行校验。 // 当aud只有一个值时,表达式如下: Equals(jwt.aud[0], "example_aud") // 当aud有多个值时,可以使用Or()函数进行比较,表示只要有一个aud符合,就通过校验。表达式如下: Or(Equals(jwt.aud[0], "https://example.com"), Equals(jwt.aud[1], "https://example2.com"))
PKCS#7
// 如果当前联邦信任源为阿里云的PKCS#7,当选择的校验条件模式是指定云服务器实例模式,填写的云服务器实例ID为:i-123,i-456,生成的表达式如下: Or(Equals(pkcs7.payload.jsonData.'instance-id', "i-123"),Equals(pkcs7.payload.jsonData.'instance-id', "i-456")) // 如果是亚马逊云的PKCS#7,当选择的校验条件模式是指定云服务器实例模式,填写的云服务器实例ID为:i-123,i-456,生成的表达式如下: Or(Equals(pkcs7.payload.jsonData.instanceId, "i-123"),Equals(pkcs7.payload.jsonData.instanceId, "i-456")) // 如果需要自定义表达式,校验其他条件,请选择签名值表达式校验模式 // 比如校验阿里云PKCS#7签名值里面的regoin-id字段,表达式如下: Equals(pkcs7.payload.jsonData.'region-id', "cn-hangzhou")
附录
阿里云 pkcs7 可用字段
属性 | 类型 | 描述 |
instance-id | String | ECS实例ID。 |
region-id | String | 区域ID。 |
owner-account-id | String | 阿里云账号ID。 |
audience | object | / |
aud | String | 用户获取阿里云 PKCS#7 签名时,自定义入参。当前值只支持 IDaaS 实例 ID,如 idaas_XXX。 |
signingTime | Long | 签名时间(Unix时间戳,单位秒),该字段用于校验当前pkcs7的签名时间。 |
亚马逊云 pkcs7 可用字段
属性 | 类型 | 描述 |
instanceId | String | EC2实例ID。 |
region | String | 区域ID。 |
accountId | String | 亚马逊云账号ID。 |