操作凭据 Cluster(OperationalCredentials)
Cluster ID: 0x003E |
所在 Endpoint: 固定在 Endpoint 0(Root Endpoint)
OperationalCredentials 是 Matter 设备安全通信的基石 —— 负责管理设备的节点操作证书(NOC)和 Fabric 凭据。 每台 Matter 设备要加入一个 Fabric(家庭网络),都需要通过这个 Cluster 完成证书签发和安装。 它也是多管理员(Multi-Admin)场景的核心 —— 一台设备可以同时加入多个 Fabric,每个 Fabric 独立管理各自的 NOC。
Fabric:一个逻辑上的「家庭网络」,由同一个 Root CA 签发的证书体系定义。同一 Fabric 内的设备可以互相通信。
NOC(Node Operational Certificate):设备在某个 Fabric 中的「身份证」,包含设备的 NodeID 和 FabricID,由 Commissioner(手机 App)的 Root CA 签发。
ICAC:中间 CA 证书,可选。在 Root CA 和 NOC 之间增加一层信任链。
DAC(Device Attestation Certificate):设备出厂时预置的证书,证明「这是一个合法的 Matter 设备」。用于配网时的设备认证。
CSR:证书签名请求。设备生成密钥对后,将公钥包装为 CSR 发给 Commissioner,Commissioner 用自己的 CA 签发 NOC。
命令(Commands)
OperationalCredentials Cluster 共有 8 个命令,覆盖了设备认证、CSR 生成、NOC 安装、Fabric 管理的完整流程。 大多数命令在配网(Commissioning)过程中由 Commissioner 自动调用,App 开发者通常不需要手动发送。 但理解这些命令对调试配网失败和实现多管理员至关重要。 点击下方表格中的命令 ID 可跳转到对应的详细说明。
| ID | 名称 | 方向 | 说明 |
|---|---|---|---|
0x00 |
AttestationRequest | C → S | 请求设备认证(DAC 签名) |
0x01 |
AttestationResponse | S → C | 返回设备认证数据 |
0x02 |
CertificateChainRequest | C → S | 请求 DAC 或 PAI 证书 |
0x03 |
CertificateChainResponse | S → C | 返回请求的证书 |
0x04 |
CSRRequest | C → S | 请求生成 CSR(证书签名请求) |
0x05 |
CSRResponse | S → C | 返回 CSR 数据 |
0x06 |
AddNOC | C → S | 安装 NOC,加入新 Fabric |
0x07 |
UpdateNOC | C → S | 更新当前 Fabric 的 NOC |
0x09 |
UpdateFabricLabel | C → S | 修改 Fabric 标签 |
0x0A |
RemoveFabric | C → S | 移除 Fabric(含 NOC 和信任根) |
0x0B |
AddTrustedRootCertificate | C → S | 添加受信 Root CA 证书 |
C → S:Commissioner(手机 App)发给设备的请求命令。
S → C:设备回复给 Commissioner 的响应命令。
响应命令(AttestationResponse、CertificateChainResponse、CSRResponse)不需要手动发送,它们是设备收到请求后自动回复的。
AddNOC / UpdateNOC / UpdateFabricLabel / RemoveFabric 的回复统一是 NOCResponse(内含 StatusCode 和 FabricIndex)。
AttestationRequest —— 设备认证请求(0x00)
配网的第一步:验证设备是否为合法的 Matter 设备。Commissioner 发送一个随机数(Nonce), 设备用 DAC(设备认证证书)的私钥对该 Nonce 和设备信息进行签名,证明自己持有合法的 DAC。
| 参数 | 类型 | 说明 |
|---|---|---|
| AttestationNonce | octstr (32 bytes) | 32 字节随机数,防止重放攻击 |
使用场景
配网过程中自动执行。Commissioner 通过 BLE 或 IP 建立 PASE 连接后,首先发送 AttestationRequest。 如果设备的 DAC 签名验证失败,配网流程会立即终止并报告设备认证失败。
AttestationResponse —— 设备认证响应(0x01)
设备收到 AttestationRequest 后的自动回复。包含设备认证信息和 DAC 签名。 Commissioner 收到后会验证签名、检查 DAC 证书链(DAC → PAI → PAA),确认设备合法性。
| 参数 | 类型 | 说明 |
|---|---|---|
| AttestationElements | octstr | TLV 编码的认证信息(含 Certification Declaration、Nonce、Timestamp 等) |
| AttestationSignature | octstr (64 bytes) | DAC 私钥对 AttestationElements 的 ECDSA-P256 签名 |
CertificateChainRequest —— 证书链请求(0x02)
请求设备返回 DAC(设备认证证书)或 PAI(产品认证中间证书)。 Commissioner 需要完整的证书链来验证设备认证签名 —— DAC 由 PAI 签发,PAI 由 PAA 签发。
| 参数 | 类型 | 说明 |
|---|---|---|
| CertificateType | CertificateChainTypeEnum | 1 = DAC 证书,2 = PAI 证书(见枚举定义) |
使用场景
配网时 Commissioner 通常会先请求 DAC(type=1),再请求 PAI(type=2), 然后结合本地或云端存储的 PAA(Product Attestation Authority)根证书完成整条信任链验证。
CertificateChainResponse —— 证书链响应(0x03)
设备返回请求的证书。证书格式为 DER 编码的 X.509 v3 证书。
| 参数 | 类型 | 说明 |
|---|---|---|
| Certificate | octstr | DER 编码的 X.509 证书(DAC 或 PAI) |
CSRRequest —— CSR 生成请求(0x04)
让设备生成一对新的操作密钥(Operational Key Pair),并返回包含公钥的 CSR(Certificate Signing Request)。 Commissioner 拿到 CSR 后,用自己的 Root CA 签发 NOC 证书,然后通过 AddNOC 写入设备。
| 参数 | 类型 | 说明 |
|---|---|---|
| CSRNonce | octstr (32 bytes) | 32 字节随机数,绑定到 CSR 中防止重放 |
| IsForUpdateNOC | bool | 可选。为 true 时表示此 CSR 用于更新现有 NOC(而非首次安装) |
使用场景
配网流程中在设备认证通过后执行。CSR 中包含设备新生成的公钥,Commissioner 用自己的 CA 对此公钥签发 NOC。 设备保留对应的私钥,后续 CASE 会话建立时用它来证明身份。
CSRResponse —— CSR 响应(0x05)
设备返回 CSR 数据和 DAC 签名。Commissioner 验证签名后提取 CSR 用于签发 NOC。
| 参数 | 类型 | 说明 |
|---|---|---|
| NOCSRElements | octstr | TLV 编码的 NOCSR 结构(含 PKCS#10 CSR 和 CSRNonce) |
| AttestationSignature | octstr (64 bytes) | DAC 私钥对 NOCSRElements 的 ECDSA-P256 签名 |
AddNOC —— 安装 NOC(0x06)
配网流程的关键一步:将 Commissioner 签发的 NOC 证书写入设备,让设备正式加入一个新的 Fabric。 这是整个证书安装流程中参数最多的命令。执行成功后设备会获得一个新的 FabricIndex。
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| NOCValue | octstr | 是 | 签发的 NOC 证书(Matter Operational Certificate,DER 编码) |
| ICACValue | octstr | 可选 | 中间 CA 证书。如果 NOC 直接由 Root CA 签发则不需要 |
| IPKValue | octstr (16 bytes) | 是 | Identity Protection Key,用于 Fabric 内的群组通信加密 |
| CaseAdminSubject | uint64 | 是 | CASE 管理员的 Subject(通常是 Commissioner 的 NodeID)。该节点在此 Fabric 上拥有管理权限 |
| AdminVendorId | uint16 | 是 | 管理员的 Vendor ID(标识是哪个厂商的 App 发起的配网) |
AddNOC 执行后设备返回 NOCResponse,包含:
StatusCode(见 NodeOperationalCertStatusEnum)和
FabricIndex(新分配的索引号,仅在成功时有值)。
使用场景
这是配网的最后一步。流程为:AddTrustedRootCertificate → CSRRequest → 用 CA 签发 NOC → AddNOC。 执行成功后设备会建立一个新的 CASE 会话,后续通信从 PASE 切换到 CASE(基于证书的安全通道)。
UpdateNOC —— 更新 NOC(0x07)
更新当前 Fabric 的 NOC 证书。通常在证书即将过期或需要轮换密钥时使用。 只能更新发起此命令的 Fabric 自身的 NOC,不能跨 Fabric 操作。
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| NOCValue | octstr | 是 | 新的 NOC 证书(DER 编码) |
| ICACValue | octstr | 可选 | 新的中间 CA 证书 |
使用场景
证书轮换场景:Commissioner 先调用 CSRRequest(IsForUpdateNOC=true)获取新 CSR, 用 CA 签发新 NOC 后调用 UpdateNOC 写入。旧 NOC 被替换,FabricIndex 不变。
UpdateFabricLabel —— 更新 Fabric 标签(0x09)
修改当前 Fabric 的用户自定义标签(如「Home」「Office」)。纯展示用途,不影响安全或通信。 只能修改发起命令的 Fabric 自身的标签。
| 参数 | 类型 | 说明 |
|---|---|---|
| Label | string (max 32) | 新标签。空字符串表示清除标签。不允许与同设备上其他 Fabric 重名 |
使用场景
用户在 App 中给某个 Fabric 起名,比如标记为「家里」或「公司」,方便在多管理员场景下区分。 如果传入的 Label 与设备上已有的其他 Fabric 标签相同,设备返回 LabelConflict 错误。
RemoveFabric —— 移除 Fabric(0x0A)
从设备上移除指定的 Fabric。会删除该 Fabric 对应的 NOC、ICAC、信任根证书、ACL 条目以及所有关联数据。 可以移除任意 Fabric(包括其他管理员的),这是一个高权限操作。
| 参数 | 类型 | 说明 |
|---|---|---|
| FabricIndex | uint8 | 要移除的 Fabric 索引(从 Fabrics 属性列表获取) |
如果设备只加入了一个 Fabric,执行 RemoveFabric 后设备会回到未配网状态(等同恢复出厂设置)。 如果移除的是自己所在的 Fabric,当前 CASE 会话会立即断开。
使用场景
「取消配对」操作:用户在 App 中删除设备时,App 调用 RemoveFabric 移除自己的 Fabric。 如果设备在其他平台(如 Google Home / Apple Home)也配了网,那些 Fabric 不受影响。 极端场景:如果 App 失去了与设备的连接,可通过物理按键恢复出厂设置来清除所有 Fabric。
AddTrustedRootCertificate —— 添加信任根证书(0x0B)
向设备写入一个 Root CA 证书。这是 AddNOC 的前置步骤 —— 设备需要先知道信任哪个 Root CA, 才能接受由该 CA 签发的 NOC。每个 Fabric 对应一个信任根。
| 参数 | 类型 | 说明 |
|---|---|---|
| RootCACertificate | octstr | Root CA 证书(Matter Operational Certificate 格式,DER 编码) |
此命令只能在 PASE 会话中执行(即设备尚未完成配网、使用 Passcode 建立的临时安全通道), 或者在已建立 CASE 会话的 Fabric 内执行。不能在没有安全通道的情况下写入信任根。 此命令没有响应(成功返回 Status = Success 的通用状态码,不是 NOCResponse)。
属性详解
OperationalCredentials Cluster 共有 6 个属性,分为 Fabric 信息和容量管理两组。点击下方汇总表中的属性 ID 可跳转到对应的详细说明。
| ID | 名称 | 类型 | 分组 | 说明 |
|---|---|---|---|---|
0x0000 |
NOCs | list<NOCStruct> | Fabric 信息 | 各 Fabric 的 NOC 和 ICAC 证书 |
0x0001 |
Fabrics | list<FabricDescriptorStruct> | Fabric 信息 | 已加入的 Fabric 描述列表 |
0x0002 |
SupportedFabrics | uint8 | 容量管理 | 设备最多支持加入的 Fabric 数量 |
0x0003 |
CommissionedFabrics | uint8 | 容量管理 | 当前已加入的 Fabric 数量 |
0x0004 |
TrustedRootCertificates | list<octstr> | Fabric 信息 | 已安装的信任根证书列表 |
0x0005 |
CurrentFabricIndex | uint8 | 容量管理 | 当前操作上下文所属的 Fabric 索引 |
Fabric 信息(0x0000, 0x0001, 0x0004)
描述设备已加入的各个 Fabric 的证书、身份和信任根信息。
| ID | 名称 | 类型 | 说明 |
|---|---|---|---|
0x0000 |
NOCs NOC 列表 |
list<NOCStruct> | 每个 Fabric 对应一个 NOCStruct,包含该 Fabric 的 NOC 和 ICAC 证书。Fabric-scoped:每个 Fabric 只能读到自己的条目,读不到其他 Fabric 的 NOC |
0x0001 |
Fabrics Fabric 列表 |
list<FabricDescriptorStruct> | 所有已加入 Fabric 的描述信息。与 NOCs 不同,所有 Fabric 都能读到完整列表(但不含证书内容,仅有公钥摘要等公开信息) |
0x0004 |
TrustedRootCertificates 信任根证书列表 |
list<octstr> | 已安装的 Root CA 公钥证书列表(DER 编码)。每个 Fabric 对应一个信任根。通过 AddTrustedRootCertificate 添加 |
NOCs 属性是 Fabric-scoped 的 —— Fabric A 读 NOCs 只能看到自己的 NOC,看不到 Fabric B 的。
这是安全设计:NOC 中包含了该 Fabric 的操作密钥公钥,不应暴露给其他 Fabric。
Fabrics 属性是全局可见的 —— 任何 Fabric 都能看到设备加入了哪些 Fabric,以及它们的公开信息(Root 公钥、VendorID、FabricID、NodeID、Label)。
容量管理(0x0002, 0x0003, 0x0005)
描述设备的 Fabric 容量和当前操作上下文。
| ID | 名称 | 类型 | 说明 |
|---|---|---|---|
0x0002 |
SupportedFabrics 最大 Fabric 数 |
uint8 | 设备最多可同时加入的 Fabric 数量。Matter 规范要求至少支持 5 个。该值出厂固定,不可修改 |
0x0003 |
CommissionedFabrics 已加入 Fabric 数 |
uint8 | 当前实际已加入的 Fabric 数量。当 CommissionedFabrics ≥ SupportedFabrics 时,设备无法再加入新的 Fabric(AddNOC 会返回 TableFull) |
0x0005 |
CurrentFabricIndex 当前 Fabric 索引 |
uint8 | 当前通信会话所属的 Fabric 索引。读取此属性可知道「我是哪个 Fabric」。值为 0 表示当前没有关联的 Fabric(如 PASE 会话中) |
在发起多管理员配网(Multi-Admin)前,应先读取 SupportedFabrics 和 CommissionedFabrics,
确认还有剩余槽位。如果已满,需要先通过 RemoveFabric 移除一个不再使用的 Fabric。
枚举定义
NodeOperationalCertStatusEnum
AddNOC、UpdateNOC、UpdateFabricLabel、RemoveFabric 命令的统一返回状态码(NOCResponse 中的 StatusCode 字段)。
CertificateChainTypeEnum
CertificateChainRequest 命令中指定要获取的证书类型。
数据结构
NOCStruct
NOCs 属性列表中的每个元素,包含一个 Fabric 的 NOC 和可选的 ICAC 证书。
| 字段 | 类型 | 说明 |
|---|---|---|
| NOC | octstr | 节点操作证书(DER 编码)。包含设备在该 Fabric 中的 NodeID、FabricID 和操作公钥 |
| ICAC | octstr / null | 中间 CA 证书。如果 NOC 直接由 Root CA 签发,则为 null |
| FabricIndex | uint8 | 此条目所属的 Fabric 索引 |
FabricDescriptorStruct
Fabrics 属性列表中的每个元素,描述一个 Fabric 的公开信息。
| 字段 | 类型 | 说明 |
|---|---|---|
| RootPublicKey | octstr (65 bytes) | 该 Fabric 的 Root CA 公钥(未压缩 EC P-256 点,65 字节) |
| VendorID | uint16 | 签发此 Fabric 凭据的厂商 ID(如 Apple = 0x1349、Google = 0x6006) |
| FabricID | uint64 | Fabric 标识符。同一个 Root CA 下不同 Fabric 用此值区分 |
| NodeID | uint64 | 设备在该 Fabric 中的节点 ID。同一设备在不同 Fabric 中 NodeID 不同 |
| Label | string (max 32) | 用户自定义标签(通过 UpdateFabricLabel 修改),如「Home」「Office」 |
| FabricIndex | uint8 | 此 Fabric 的索引号(设备内唯一,RemoveFabric 时用此值指定) |
同一台设备被 Apple Home 和 Google Home 同时配网时,会有两条 FabricDescriptor —— VendorID 分别是 Apple 和 Google 的, FabricID 和 NodeID 也各不相同。设备通过 FabricIndex 区分不同 Fabric 的上下文,包括 ACL 权限和订阅。
示例数据
以下是一台已加入一个 Fabric 的 Matter 设备的 OperationalCredentials 属性读取结果(NOCs 除外,因为 Fabric-scoped 限制只能读自己的):
{
// --- Fabric 信息 ---
"0x0001": [{ // Fabrics — 已加入的 Fabric 列表
"rootPublicKey": "BNkX2...", // Root CA 公钥(Base64)
"vendorID": 65521, // VendorID = 0xFFF1(测试厂商)
"fabricID": 1, // FabricID = 1
"nodeID": 1234, // 本设备在该 Fabric 中的 NodeID
"label": "Home", // 用户自定义标签
"fabricIndex": 1 // Fabric 索引
}],
// --- 容量与计数 ---
"0x0002": 5, // SupportedFabrics = 5(最多加入 5 个 Fabric)
"0x0003": 1, // CommissionedFabrics = 1(当前已加入 1 个)
// --- 信任根证书 ---
"0x0004": [ // TrustedRootCertificates — 受信 Root CA 列表
"MIIBnT..." // 每个 Fabric 对应一个 Root CA 证书(Base64 DER)
],
// --- 当前上下文 ---
"0x0005": 1 // CurrentFabricIndex = 1(当前操作所属 Fabric)
}
CSR 流程交互示例
配网过程中,Commissioner 请求设备生成 CSR 的交互:
// 1. Commissioner → Device:请求生成 CSR
{
"invokeRequests": [{
"commandPath": {
"endpointId": 0,
"clusterId": "0x003E",
"commandId": "0x04" // CSRRequest
},
"commandFields": {
"CSRNonce": "dGhpcyBpcyBhIDMyLWJ5dGUgbm9uY2U=" // 32 字节随机数(Base64)
}
}]
}
// Device → Commissioner:返回 CSR
{
"NOCSRElements": "MIHd...", // NOCSR 结构(含 CSR + CSRNonce)
"attestationSignature": "MEU..." // 设备用 DAC 私钥签名
}
AddNOC 交互示例
Commissioner 将签发好的 NOC 写入设备:
// 2. Commissioner → Device:写入签好的 NOC
{
"invokeRequests": [{
"commandPath": {
"endpointId": 0,
"clusterId": "0x003E",
"commandId": "0x06" // AddNOC
},
"commandFields": {
"NOCValue": "MIIB...", // 签发的 NOC 证书(DER Base64)
"ICACValue": "MIIB...", // 可选的中间 CA 证书
"IPKValue": "wMs7...", // 16 字节 Identity Protection Key
"caseAdminSubject": 112233, // CASE 管理员的 Subject(NodeID)
"adminVendorId": 65521 // 管理员的 VendorID
}
}]
}
// Device → Commissioner:返回结果
{
"statusCode": 0, // OK
"fabricIndex": 1 // 新分配的 FabricIndex
}
实际开发中,这些命令通常由平台的 Commissioning SDK 自动编排(如 Android CHIPTool、iOS Matter.framework)。 但在调试配网失败时,理解每一步的参数含义非常关键 —— 尤其是 CSRNonce 不匹配、NOC 签名验证失败、Fabric 表已满等问题。
常见场景
场景 1:首次配网 —— NOC 安装完整流程
一台新出厂的 Matter 设备首次被手机 App 配网,完整的证书安装流程如下:
- App 通过 BLE 或 SoftAP 与设备建立 PASE 会话(使用设备上的 Passcode)
- App 发送
AttestationRequest (0x00),收到AttestationResponse后验证 DAC 签名 - App 发送
CertificateChainRequest (0x02, type=1)获取 DAC 证书 - App 发送
CertificateChainRequest (0x02, type=2)获取 PAI 证书 - App 验证完整信任链:DAC → PAI → PAA(PAA 从 DCL 或本地获取)
- App 发送
AddTrustedRootCertificate (0x0B)将自己的 Root CA 证书写入设备 - App 发送
CSRRequest (0x04),设备生成密钥对并返回 CSR - App 的 CA 基于 CSR 签发 NOC 证书
- App 发送
AddNOC (0x06)将 NOC、ICAC(可选)、IPK 写入设备 - 设备返回 NOCResponse(StatusCode=OK,FabricIndex=1)
- PASE 会话结束,App 和设备建立 CASE 会话(基于 NOC 证书)
场景 2:多管理员(Multi-Admin)—— 同一设备加入多个平台
用户先用 Apple Home 配网,再用 Google Home 配网同一台设备:
- Apple Home 已完成配网,设备有 Fabric 1(Apple 的 Root CA、VendorID、NodeID)
- 用户在 Apple Home 中开启「多管理员配对窗口」(通过 Administrator Commissioning Cluster 的 OpenCommissioningWindow)
- Google Home 扫描到设备,通过新的 PASE 会话连接
- Google Home 重复场景 1 的步骤 2-10,使用 Google 自己的 Root CA 签发 NOC
- 设备现在有 Fabric 1(Apple)和 Fabric 2(Google),各自独立运作
- 读取
Fabrics属性可以看到两条 FabricDescriptorStruct - 读取
CommissionedFabrics返回 2,SupportedFabrics仍然是出厂值(如 5)
场景 3:移除 Fabric —— 取消配对或恢复出厂
用户要从某个平台上移除设备:
- App 读取
Fabrics (0x0001)获取所有 Fabric 列表 - App 读取
CurrentFabricIndex (0x0005)确认自己的 FabricIndex - App 发送
RemoveFabric (0x0A)并传入自己的 FabricIndex - 设备删除该 Fabric 的 NOC、Root 证书、ACL 等所有关联数据
- 如果设备上还有其他 Fabric,设备继续正常运行;如果这是最后一个 Fabric,设备回到未配网状态
注意:RemoveFabric 可以指定任意 FabricIndex(不限于自己的 Fabric), 但通常只有管理员权限(Administrator ACL)才被允许执行。
场景 4:证书轮换 —— 更新已有的 NOC
当 NOC 接近过期或因安全策略需要更换密钥时:
- App 发送
CSRRequest (0x04)并设置IsForUpdateNOC = true - 设备生成新密钥对,返回新 CSR
- App 的 CA 基于新 CSR 签发新 NOC(保持相同的 NodeID 和 FabricID)
- App 发送
UpdateNOC (0x07)写入新 NOC - 旧 NOC 被替换,FabricIndex 不变,CASE 会话需要重新建立