操作凭据 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 发起的配网)
返回值:NOCResponse

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 添加
Fabric-scoped vs 全局可见

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 字段)。

0
OK 操作成功
1
InvalidPublicKey NOC 中的公钥无效(格式错误或与 CSR 中的不匹配)
2
InvalidNodeOpId NOC 中的 Node Operational ID(NodeID)无效
3
InvalidNOC NOC 证书本身无效(签名验证失败、格式错误、过期等)
4
MissingCsr 没有先调用 CSRRequest 就直接 AddNOC/UpdateNOC
5
TableFull Fabric 表已满(CommissionedFabrics = SupportedFabrics)
6
InvalidAdminSubject CaseAdminSubject 值无效(不是合法的 NodeID)
9
FabricConflict Fabric 冲突 —— 设备上已存在使用相同 Root CA 的 Fabric
10
LabelConflict 标签冲突 —— UpdateFabricLabel 时新标签与已有 Fabric 标签重复
11
InvalidFabricIndex 指定的 FabricIndex 不存在(RemoveFabric 时传了无效索引)

CertificateChainTypeEnum

CertificateChainRequest 命令中指定要获取的证书类型。

1
DACCertificate 设备认证证书(Device Attestation Certificate)—— 出厂预置,证明设备合法性
2
PAICertificate 产品认证中间证书(Product Attestation Intermediate Certificate)—— DAC 的签发者

数据结构

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 时用此值指定)
VendorID 与 FabricID

同一台设备被 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 配网,完整的证书安装流程如下:

  1. App 通过 BLE 或 SoftAP 与设备建立 PASE 会话(使用设备上的 Passcode)
  2. App 发送 AttestationRequest (0x00),收到 AttestationResponse 后验证 DAC 签名
  3. App 发送 CertificateChainRequest (0x02, type=1) 获取 DAC 证书
  4. App 发送 CertificateChainRequest (0x02, type=2) 获取 PAI 证书
  5. App 验证完整信任链:DAC → PAI → PAA(PAA 从 DCL 或本地获取)
  6. App 发送 AddTrustedRootCertificate (0x0B) 将自己的 Root CA 证书写入设备
  7. App 发送 CSRRequest (0x04),设备生成密钥对并返回 CSR
  8. App 的 CA 基于 CSR 签发 NOC 证书
  9. App 发送 AddNOC (0x06) 将 NOC、ICAC(可选)、IPK 写入设备
  10. 设备返回 NOCResponse(StatusCode=OK,FabricIndex=1)
  11. PASE 会话结束,App 和设备建立 CASE 会话(基于 NOC 证书)
场景 2:多管理员(Multi-Admin)—— 同一设备加入多个平台

用户先用 Apple Home 配网,再用 Google Home 配网同一台设备:

  1. Apple Home 已完成配网,设备有 Fabric 1(Apple 的 Root CA、VendorID、NodeID)
  2. 用户在 Apple Home 中开启「多管理员配对窗口」(通过 Administrator Commissioning Cluster 的 OpenCommissioningWindow)
  3. Google Home 扫描到设备,通过新的 PASE 会话连接
  4. Google Home 重复场景 1 的步骤 2-10,使用 Google 自己的 Root CA 签发 NOC
  5. 设备现在有 Fabric 1(Apple)和 Fabric 2(Google),各自独立运作
  6. 读取 Fabrics 属性可以看到两条 FabricDescriptorStruct
  7. 读取 CommissionedFabrics 返回 2,SupportedFabrics 仍然是出厂值(如 5)
场景 3:移除 Fabric —— 取消配对或恢复出厂

用户要从某个平台上移除设备:

  1. App 读取 Fabrics (0x0001) 获取所有 Fabric 列表
  2. App 读取 CurrentFabricIndex (0x0005) 确认自己的 FabricIndex
  3. App 发送 RemoveFabric (0x0A) 并传入自己的 FabricIndex
  4. 设备删除该 Fabric 的 NOC、Root 证书、ACL 等所有关联数据
  5. 如果设备上还有其他 Fabric,设备继续正常运行;如果这是最后一个 Fabric,设备回到未配网状态

注意:RemoveFabric 可以指定任意 FabricIndex(不限于自己的 Fabric), 但通常只有管理员权限(Administrator ACL)才被允许执行。

场景 4:证书轮换 —— 更新已有的 NOC

当 NOC 接近过期或因安全策略需要更换密钥时:

  1. App 发送 CSRRequest (0x04) 并设置 IsForUpdateNOC = true
  2. 设备生成新密钥对,返回新 CSR
  3. App 的 CA 基于新 CSR 签发新 NOC(保持相同的 NodeID 和 FabricID)
  4. App 发送 UpdateNOC (0x07) 写入新 NOC
  5. 旧 NOC 被替换,FabricIndex 不变,CASE 会话需要重新建立