3. 设备认证证书(DAC)工程解析

设备认证证书(Device Attestation Certificate,DAC)是 Matter 设备身份体系的“身份证”。它由设备厂商在产线签发,绑定设备的唯一标识与公钥,并由厂商中间证书(ICAC)或直接由厂商根证书(RCAC)签名。设备入网时, commissioner 通过 DAC 验证设备确实由可信厂商制造,并确认其公钥归属。理解 DAC 不能停留在“它是一张证书”,而要落到 ASN.1 结构、扩展字段、算法标识以及固件中的存储与读取方式上。

DAC 的 ASN.1 结构

DAC 遵循 X.509 v3 证书格式,采用 DER 编码。其顶层结构为 Certificate,包含三个必选字段:tbsCertificate、signatureAlgorithm 和 signatureValue。其中 tbsCertificate 是待签名部分,承载了版本、序列号、签名算法、颁发者、有效期、主体、主体公钥信息以及扩展字段。

在 Matter 规范中,DAC 的字段有明确约束。版本固定为 v3(整数值 2);序列号由厂商分配,通常为 8 字节随机数或递增编号;颁发者名称指向签发它的 ICAC 或 RCAC;有效期通常设置为固定值,例如从 2020-01-01 到 9999-12-31,以适配长期在役设备;主体名称包含厂商分配的 vendor-id 和 product-id,以 id-rdn 属性形式编码。

主体公钥信息是 DAC 的核心。它包含算法标识和公钥比特串。Matter 当前主要支持 ECC 公钥,曲线为 prime256v1(即 NIST P-256),公钥为未压缩点格式,以 0x04 开头,后接 32 字节 X 坐标和 32 字节 Y 坐标。算法标识使用 id-ecPublicKey 与 prime256v1 的 OID 组合。

关键扩展字段

DAC 必须包含若干关键扩展,用于表达设备身份与授权信息。最典型的是 Basic Constraints,其中 cA 必须为 FALSE,表示 DAC 是终端实体证书,不能用于签发其他证书。其次是 Key Usage,通常设置为 digitalSignature,表明该公钥用于验证签名而非密钥加密。

Matter 还定义了专用扩展 id-matter-dac,其 OID 为 1.3.6.1.4.1.37244.1.1。该扩展携带设备认证信息,包括 vendor-id、product-id 以及可选的 device-type-id。这些字段与主体名称中的 RDN 相互印证,确保设备身份在证书内部一致。此外,Authority Key Identifier 扩展用于指向签发者公钥,便于构建证书链。

DAC 的 ASN.1 结构与固件存储读取路径 X.509 v3 / DER 编码 · 设备认证证书 Certificate ::= SEQUENCE tbsCertificate version = v3 (2) │ serialNumber │ signatureAlgorithm issuer = ICAC / RCAC │ validity = 2020-01-01 ~ 9999-12-31 subject = id-rdn: vendor-id + product-id subjectPublicKeyInfo algorithm: id-ecPublicKey + prime256v1 publicKey: 0x04 ‖ X(32B) ‖ Y(32B) extensions [3] BasicConstraints(cA=FALSE) · KeyUsage(digitalSignature) · id-matter-dac · AKI signatureAlgorithm = ecdsa-with-SHA256 signatureValue = DER 编码的 ECDSA 签名 (r, s) 固件中的存储与读取 ① 出厂烧录区 DAC + ICAC + 私钥(安全存储) ② 只读分区 / OTP DER 字节流,按 TLV 顺序存放 ③ 运行时读取接口 GetDAC() → 返回 DER 缓冲区 ④ 解析与校验 ASN.1 解码 → 提取公钥/扩展 ⑤ 证书链验证 DAC → ICAC → RCAC 逐级验签 ⑥ 会话建立 用 DAC 私钥完成 attestation 挑战 DER

公钥算法与签名算法

DAC 的公钥算法固定为 ECDSA over P-256。选择该曲线的原因在于:密钥长度短、签名速度快、在资源受限的 MCU 上运算开销可控,同时满足 Matter 对安全强度的要求。公钥以未压缩点格式存储,便于解析器直接读取 X、Y 坐标。

签名算法使用 ecdsa-with-SHA256,其 OID 为 1.2.840.10045.4.3.2。签名值采用 DER 编码的 SEQUENCE { r INTEGER, s INTEGER } 结构。验证时,先对 tbsCertificate 的 DER 字节流计算 SHA-256 摘要,再用签发者公钥验证签名。需要注意,ECDSA 签名中的 r 和 s 为可变长度整数,解析时必须按 DER 规则处理前导零和符号位,不能假设固定 32 字节。

固件中的存储与读取方式

DAC 在固件中通常以 DER 字节流形式存储。常见做法有三种:一是存放在独立的只读分区,与固件镜像分离,便于产线单独烧录;二是写入 OTP(一次性可编程)区域,防止被篡改;三是存放在安全元件或安全闪存中,由安全子系统提供读取接口。无论哪种方式,DAC 本身是公开信息,不需要保密,但必须保证完整性,防止被替换。

读取时,应用层通常调用类似 GetDAC() 的接口,返回指向 DER 缓冲区的指针和长度。随后使用 ASN.1 解析器(如 mbedTLS 的 mbedtls_x509_crt_parse_der 或 tinycbor 配合自定义解析)提取公钥和扩展字段。解析过程需要处理变长编码,不能直接按固定偏移读取。

// 示例:读取 DAC 并解析公钥(伪代码,参数为教学示例)
uint8_t dac_der[DAC_MAX_LEN];
size_t  dac_len = 0;
GetDAC(dac_der, sizeof(dac_der), &dac_len);

mbedtls_x509_crt dac;
mbedtls_x509_crt_init(&dac);
int ret = mbedtls_x509_crt_parse_der(&dac, dac_der, dac_len);
if (ret != 0) {
    // 解析失败,检查 DER 完整性
}

// 提取公钥:dac.pk 为 mbedtls_pk_context
// 提取扩展:遍历 dac.ext_types / dac.v3_ext

证书链验证时,设备需要同时持有 ICAC 和 RCAC。验证顺序为:用 ICAC 公钥验证 DAC 签名,再用 RCAC 公钥验证 ICAC 签名。若厂商采用直接由 RCAC 签发 DAC 的扁平结构,则跳过 ICAC 环节。验证通过后,设备才能使用 DAC 私钥参与 attestation 挑战,向 commissioner 证明自身身份。

DAC 的私钥必须存放在安全存储中,且不可导出。DAC 证书本身可以明文存储,但建议与私钥绑定在同一安全域,防止证书与私钥被分离替换。
解析 DAC 时不要假设签名值长度固定。ECDSA 的 r 和 s 可能因前导零而缩短,DER 解析器必须按 TLV 长度字段读取,否则会导致验签失败或越界访问。

工程检查要点

检查项预期值 / 判断依据
版本v3(整数值 2)
Basic ConstraintscA = FALSE
Key UsagedigitalSignature
公钥曲线prime256v1 (OID 1.2.840.10045.3.1.7)
签名算法ecdsa-with-SHA256 (OID 1.2.840.10045.4.3.2)
id-matter-dac 扩展存在且 vendor-id / product-id 与主体一致
证书链DAC → ICAC → RCAC 逐级验签通过

实际产线中,DAC 的签发通常由厂商 CA 系统完成,设备端只负责存储和读取。工程上最容易出问题的环节是 DER 编码的边界处理和证书链的完整性校验。建议在固件中内置一个最小化的 ASN.1 解析器,并在产线测试阶段增加“读取 DAC → 解析公钥 → 验证证书链”的自检流程,确保每台设备出厂前证书可用。