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轮交互。我画了个流程图,你一看就明白:

Sigma-r 三轮握手流程(以CASE为例) 发起方(Initiator) 响应方(Responder) 生成随机数 r1 发送 r1 + 支持的密码套件 Msg1: r1, CipherSuites 生成随机数 r2 发送 r2 + 证书 + 签名 Msg2: r2, Cert, Sig 验证证书和签名 发送证书 + 签名 Msg3: Cert, Sig 验证签名 派生会话密钥 密钥派生完成 派生共享密钥 K = H(r1 || r2 || 共享秘密)

你看,三轮交互,每轮都带随机数。为什么要随机数?防止重放攻击。我见过一个案例,有人把随机数生成器写死了,结果每次握手都一样——那安全性基本等于零。

3.3 会话密钥派生:从共享秘密到加密密钥

握手完成后,双方有了共享秘密K。但K不能直接用,得派生出会话密钥。Matter用的是HKDF(HMAC-based Key Derivation Function),流程如下:

  1. 提取阶段:用HKDF-Extract,输入共享秘密K和盐值(salt),输出伪随机密钥PRK。
  2. 扩展阶段:用HKDF-Expand,输入PRK和上下文信息(比如"SessionKey"字符串),输出指定长度的密钥材料。
  3. 分割:把密钥材料切成三份——加密密钥、完整性密钥、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);      // 初始向量
调试小技巧:如果握手失败,先别急着看证书。把两端的PRK打印出来对比——如果PRK不一致,说明共享秘密计算有问题;如果PRK一致但后面通信失败,那问题在密钥派生或分割阶段。

3.4 常见握手失败排查

握手失败的原因五花八门,但归纳起来就几类。我按排查优先级列出来:

故障现象 可能原因 排查方法
Msg1发送后无响应 端口不通、协议版本不匹配 抓包确认UDP 5540端口是否可达;检查双方支持的协议版本
Msg2验证失败 证书链不完整、签名算法不匹配 用openssl验证证书链;确认签名算法ID一致
Msg3验证失败 随机数r1/r2不一致、签名密钥错误 打印两端r1/r2值对比;检查私钥是否与证书匹配
密钥派生后通信异常 HKDF盐值不一致、上下文字符串拼写错误 逐字节对比两端的盐值和上下文字符串
PASE超时 Passcode输入错误、PIN码过期 确认Passcode在有效期内(通常60秒);检查是否输错位数
我曾经踩过的坑:有一次CASE握手总是卡在Msg2,查了两天发现是证书里的Subject Key Identifier和Authority Key Identifier不匹配。Matter对证书链的校验非常严格,哪怕一个字节不对都过不去。所以,生成证书时一定要用Matter官方工具,别自己手写。

3.5 实战排查步骤

如果你现在遇到握手失败,按这个顺序来:

  1. 抓包确认:用Wireshark或tcpdump抓UDP 5540端口,看Msg1有没有发出去。
  2. 检查随机数:把r1和r2打印出来,确认两端收到的值一致。
  3. 验证证书:用openssl verify -CAfile root.pem device_cert.pem检查证书链。
  4. 对比密钥:打印PRK,看两端是否一致。
  5. 检查上下文:确认HKDF-Expand的info参数完全一致,包括大小写和空格。

嗯,其实大部分问题都出在第3步和第5步。证书链不完整是新手最容易犯的错误,而上下文字符串拼写错误则是老手也会翻车的地方。我自己的习惯是,把上下文字符串定义成宏,两端用同一个头文件——这样至少能保证字符串一致。

核心要点回顾:

  • PASE用于配网,CASE用于日常通信,底层都是Sigma-r协议。
  • Sigma-r三轮交互,每轮带随机数防止重放。
  • 会话密钥通过HKDF派生,分提取、扩展、分割三步。
  • 排查时先抓包,再验证书,最后对比密钥材料。