3. 安全会话建立:CASE与PASE协议详解
安全会话建立,说白了就是两个设备互相确认身份、协商密钥的过程。在Matter协议里,这事儿分两种场景:一种是设备刚买回来,啥配置都没有,需要跟手机或调试工具配对——这叫PASE;另一种是设备已经入网了,日常跟其他设备通信——这叫CASE。
我刚开始接触Matter时,总觉得这两套流程差不多,直到在项目里踩了坑才明白:搞混它们,调试起来能让你怀疑人生。咱们今天就把它们掰开揉碎了讲清楚。
3.1 PASE与CASE:两个场景,一套逻辑
先看个对比,心里有个底:
| 特性 | PASE(Passcode-Authenticated Session Establishment) | CASE(Certificate-Authenticated Session Establishment) |
|---|---|---|
| 使用场景 | 设备首次配网、工厂重置后 | 设备已入网,日常通信 |
| 认证依据 | 配对码(Passcode,通常是6位数字) | 设备证书(DAC/PAI/ICA) |
| 密钥派生基础 | Passcode + 随机数 | 证书公钥 + 随机数 |
| 安全强度 | 依赖Passcode熵值(通常较低) | 依赖证书链和PKI体系 |
| 常见失败原因 | Passcode错误、PIN码超时 | 证书过期、证书链不完整 |
嗯,这里要注意:PASE虽然看起来弱一些,但它是整个信任链的起点。我见过不少团队在PASE阶段省事儿,结果后面CASE怎么都跑不通——其实根子就在配网那一步。
3.2 Sigma协议:握手背后的数学
不管是PASE还是CASE,底层用的都是Sigma协议族。Sigma全称是"Sign-and-MAc",说白了就是:双方各发一个签名,再带一个MAC,互相证明自己知道某个秘密。
Matter里用的是Sigma-r(r代表reduced round),总共就3轮交互。我画了个流程图,你一看就明白:
你看,三轮交互,每轮都带随机数。为什么要随机数?防止重放攻击。我见过一个案例,有人把随机数生成器写死了,结果每次握手都一样——那安全性基本等于零。
3.3 会话密钥派生:从共享秘密到加密密钥
握手完成后,双方有了共享秘密K。但K不能直接用,得派生出会话密钥。Matter用的是HKDF(HMAC-based Key Derivation Function),流程如下:
- 提取阶段:用HKDF-Extract,输入共享秘密K和盐值(salt),输出伪随机密钥PRK。
- 扩展阶段:用HKDF-Expand,输入PRK和上下文信息(比如"SessionKey"字符串),输出指定长度的密钥材料。
- 分割:把密钥材料切成三份——加密密钥、完整性密钥、IV(初始化向量)。
我个人习惯在代码里把这三步分开写,方便调试。你看这个伪代码:
// 会话密钥派生示例(伪代码)
uint8_t prk[32];
hkdf_extract(prk, shared_secret, salt, 32);
uint8_t key_material[48];
hkdf_expand(key_material, prk, "SessionKey", 48);
// 分割密钥材料
memcpy(enc_key, key_material, 16); // AES-CCM加密密钥
memcpy(mac_key, key_material + 16, 16); // 完整性密钥
memcpy(iv, key_material + 32, 16); // 初始向量
3.4 常见握手失败排查
握手失败的原因五花八门,但归纳起来就几类。我按排查优先级列出来:
| 故障现象 | 可能原因 | 排查方法 |
|---|---|---|
| Msg1发送后无响应 | 端口不通、协议版本不匹配 | 抓包确认UDP 5540端口是否可达;检查双方支持的协议版本 |
| Msg2验证失败 | 证书链不完整、签名算法不匹配 | 用openssl验证证书链;确认签名算法ID一致 |
| Msg3验证失败 | 随机数r1/r2不一致、签名密钥错误 | 打印两端r1/r2值对比;检查私钥是否与证书匹配 |
| 密钥派生后通信异常 | HKDF盐值不一致、上下文字符串拼写错误 | 逐字节对比两端的盐值和上下文字符串 |
| PASE超时 | Passcode输入错误、PIN码过期 | 确认Passcode在有效期内(通常60秒);检查是否输错位数 |
3.5 实战排查步骤
如果你现在遇到握手失败,按这个顺序来:
- 抓包确认:用Wireshark或tcpdump抓UDP 5540端口,看Msg1有没有发出去。
- 检查随机数:把r1和r2打印出来,确认两端收到的值一致。
- 验证证书:用
openssl verify -CAfile root.pem device_cert.pem检查证书链。 - 对比密钥:打印PRK,看两端是否一致。
- 检查上下文:确认HKDF-Expand的info参数完全一致,包括大小写和空格。
嗯,其实大部分问题都出在第3步和第5步。证书链不完整是新手最容易犯的错误,而上下文字符串拼写错误则是老手也会翻车的地方。我自己的习惯是,把上下文字符串定义成宏,两端用同一个头文件——这样至少能保证字符串一致。
核心要点回顾:
- PASE用于配网,CASE用于日常通信,底层都是Sigma-r协议。
- Sigma-r三轮交互,每轮带随机数防止重放。
- 会话密钥通过HKDF派生,分提取、扩展、分割三步。
- 排查时先抓包,再验证书,最后对比密钥材料。