全部產品
Search
文件中心

Identity as a Service:聯邦憑證運算式的使用

更新時間:Jul 31, 2025

本文介紹了在 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上傳的認證issuer的CN欄位,進行比較
    // 比如認證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")
    
    // 同時判斷issuer和audience是否正確
    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 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"))
  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。

相關文檔