联邦凭证表达式的使用

本文介绍了在 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 前导字节,以确保其作为正整数进行正确解码。

  • 示例如下:十六进制值 dd0ec2ccc305a652 的最高位为 1,因此需要补前导 0x00,最终编码为:

    00dd0ec2ccc305a652

    十六进制值 6d5a2816af467f40d38be7280f6e974f114a061e 的最高位为 0,无需补 0x00,编码保持不变:

    6d5a2816af467f40d38be7280f6e974f114a061e

  • 说明补充(可选):此规则是为了保证 DER 编码中整数(INTEGER)类型的正确性。当整数的第一个字节的最高位为 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,可通过jwt.iss访问。

sub

String

令牌的主体(Subject),表示用户的唯一标识符,可通过jwt.sub访问。

aud

List<String>

令牌目标受众(Audience),通常为资源服务器标识符或客户端ID。

说明

aud支持数组形式,如果需要校验aud,表达式需要写成:

Equals(jwt.aud[0], "example_aud"),其中jwt.aud[0]表示获取aud 里面的第一个元素进行比较。如果 aud 里面有多个值,如:

{
  "aud": [
    "https://example.com",
    "https://example2.com"
  ]
}

可以使用Or( )函数进行比较,表示只要有一个相等就校验通过。表达式如下:Or(Equals(jwt.aud[0], "https://example.com"), Equals(jwt.aud[1], "https://example2.com"))

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 包裹起来。

联邦信任源信任条件

  1. PCA

    // 获取PCA上传的证书issuerCN字段,进行比较
    // 比如证书issuer为:C=cn, ST=sichuan, L=chengdu, O=example, OU=test, CN=test
    Equals(cert.issuer.CN, "test")
    
    // 判断该证书是不是证书颁发机构(可以颁发其他证书)
    Equals(cert.ca, true)
    
  2. OIDC

    // 判断kubernetes集群的serviceaccount oidc token里面的subject是否正确
    Equals(jwt.sub, "test")
    
    // 同时判断issueraudience是否正确
    And(Equals(jwt.iss, "https://example.com"), Equals(jwt.aud, "test_aud"))
  3. PKCS#7

    选择PKCS#7联邦信任源,用户不需要填写信任条件表达式。

联邦凭证校验条件

联邦凭证校验条件的表达式编写方式与联邦信任源的信任条件类似,均通过数据模型获取对应字段进行校验。IDaaS提供快捷配置模式,可自动生成基础校验表达式,简化配置流程。

  1. 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"),":",""))
  2. 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 tokenjti字段,表达式如下:
    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"))
  3. 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。

相关文档