本文介紹了在 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。 |