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 的公钥算法固定为 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 证明自身身份。
工程检查要点
| 检查项 | 预期值 / 判断依据 |
|---|---|
| 版本 | v3(整数值 2) |
| Basic Constraints | cA = FALSE |
| Key Usage | digitalSignature |
| 公钥曲线 | 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 → 解析公钥 → 验证证书链”的自检流程,确保每台设备出厂前证书可用。