4. CoAP安全机制

CoAP 协议在设计之初就考虑了物联网设备的资源受限特性,其安全层直接复用 DTLS(Datagram Transport Layer Security)。DTLS 是 TLS 在 UDP 上的变体,解决了 UDP 不可靠传输下的分片、重排序和丢包问题。本章将深入剖析 DTLS 握手流程、两种主流认证模式(PSK 与证书),并量化分析 CoAP over DTLS 在低功耗设备上的实际开销。

4.1 DTLS 握手流程详解

DTLS 握手的目标是在客户端与服务器之间协商加密套件、交换密钥并建立安全会话。与 TLS 不同,DTLS 必须处理 UDP 的无序和丢包特性,因此引入了 显式序列号、重传定时器 和 分片重组 机制。

关键区别: DTLS 握手消息必须携带 16 位消息序列号(epoch + sequence_number),用于检测重放和乱序。握手过程中若丢包,接收方会发送 HelloVerifyRequest 要求客户端重传 ClientHello,以此防止 DoS 攻击。

下图展示了 DTLS 1.2 完整握手流程(PSK 模式可省略 Certificate 和 CertificateVerify 步骤):

DTLS 1.2 完整握手流程(基于 UDP) CoAP 客户端 CoAP 服务器 ClientHello (cookie=0) HelloVerifyRequest (cookie=C1) ClientHello (cookie=C1, cipher suites) ServerHello + Certificate + ServerKeyExchange + ServerHelloDone Certificate + ClientKeyExchange + CertificateVerify + ChangeCipherSpec + Finished ChangeCipherSpec + Finished CoAP 应用数据(加密) 说明:PSK 模式可省略 Certificate、CertificateVerify 和 ServerKeyExchange 消息,握手仅需 2-RTT(4 次消息交换)
握手 RTT 分析: 完整证书模式需要 3-RTT(6 次消息交换),PSK 模式仅需 2-RTT(4 次消息交换)。对于低功耗设备,每减少一次 RTT 可节省约 30-50% 的握手能耗。

4.2 PSK 与 RSA 证书模式对比

ThingsBoard 支持两种 DTLS 认证模式:预共享密钥(PSK) 和 RSA 证书。选择哪种模式取决于设备的安全等级、计算能力和部署规模。

对比维度 PSK 模式 RSA 证书模式
密钥管理 对称密钥,需安全分发到每台设备 非对称密钥对,公钥可公开,私钥本地存储
握手 RTT 2-RTT(4 条消息) 3-RTT(6 条消息)
计算开销 低(仅 HMAC 和对称加密) 高(需 RSA 签名验证和密钥交换)
内存占用 约 2-4 KB(密钥 + 会话状态) 约 8-16 KB(证书链 + 私钥 + 会话状态)
安全性 中等(密钥泄露影响单设备) 高(私钥不传输,抗中间人攻击)
适用场景 传感器节点、电池供电设备、大规模部署 网关、边缘计算节点、高安全要求设备
ThingsBoard 配置 设备凭证类型选择 "PSK",填写 Identity 和 Key 设备凭证类型选择 "X.509 Certificate",上传 CA 证书
PSK 密钥分发风险: 在工厂预置 PSK 时,必须确保密钥存储区不可读(如使用安全元件或 MCU 的 OTP 区域)。切勿将 PSK 硬编码在可读固件中,否则攻击者可通过固件逆向获取所有设备的密钥。

4.3 CoAP over DTLS 在低功耗设备上的开销分析

低功耗设备(如基于 ESP32、STM32、nRF52 的传感器节点)在启用 DTLS 后,主要面临 计算开销、内存开销 和 网络开销 三方面的挑战。以下基于典型 Cortex-M4 内核(主频 80 MHz,RAM 64 KB)的实测数据进行分析。

4.3.1 计算开销:握手阶段 vs 数据阶段

操作阶段 PSK 模式耗时 RSA 证书模式耗时 能耗估算(@3.3V, 50mA)
完整握手(含密钥协商) 15-25 ms 80-150 ms PSK: 2.5-4.1 mJ / 证书: 13.2-24.8 mJ
单条数据加密(AES-128-CCM) 0.3-0.5 ms 0.3-0.5 ms 0.05-0.08 mJ
单条数据解密 0.3-0.5 ms 0.3-0.5 ms 0.05-0.08 mJ
会话恢复(Session Resumption) 5-8 ms 5-8 ms 0.8-1.3 mJ
关键结论: 握手阶段是能耗大头,证书模式握手能耗是 PSK 模式的 5-6 倍。对于每小时上报一次数据的传感器,若每次重新握手,证书模式每年额外消耗约 200-300 mAh 电池容量(按 3.7V 锂电池计算)。

4.3.2 内存开销:代码与运行时状态

DTLS 协议栈(如 mbedTLS、TinyDTLS)在低功耗 MCU 上的典型内存占用如下:

内存类型 PSK 模式 RSA 证书模式 说明
Flash(代码段) 18-25 KB 35-50 KB 证书模式需包含 RSA 和 ASN.1 解析库
RAM(运行时堆栈) 4-6 KB 10-16 KB 证书模式需缓存证书链和签名验证缓冲区
RAM(会话状态) 1-2 KB 2-4 KB 包含加密上下文、序列号、重传缓冲区
总计 RAM 5-8 KB 12-20 KB 对于 64 KB RAM 的 MCU,证书模式占用 19-31%

4.3.3 网络开销:握手消息大小与数据包膨胀

DTLS 握手消息和加密记录都会增加 CoAP 报文的传输字节数,这对低带宽网络(如 LoRaWAN、NB-IoT)影响显著。

CoAP 报文大小对比:明文 vs DTLS 加密 明文 CoAP 请求(典型传感器数据上报) CoAP Header (4B) + Token (1-8B) + Options (5-15B) + Payload (10-50B) = 20-77 字节 DTLS 加密 CoAP 请求 DTLS Record Header (13B) + IV (8B) + 加密 CoAP 数据 (20-77B) + Auth Tag (8B) = 49-106 字节 DTLS 加密开销:每报文增加 29 字节固定开销(Record Header + IV + Auth Tag) 对于 20 字节的 CoAP 报文,DTLS 导致 145% 的带宽膨胀;对于 77 字节报文,膨胀约 38% 优化建议: 1. 合并多个传感器数据到一条 CoAP 报文(减少报文数量) 2. 使用 CoAP 块传输(Block-wise Transfer)避免 IP 分片

4.3.4 低功耗优化策略

  1. 会话缓存与恢复: 设备端缓存 DTLS 会话票据(Session Ticket),下次连接时使用 abbreviated handshake,将握手 RTT 从 2-3 次降低到 1 次,能耗降低 60-70%。
  2. 长连接保持: 对于上报间隔小于 5 分钟的设备,建议保持 DTLS 会话不关闭,通过 CoAP 的 NON 消息(非确认模式)发送数据,避免频繁握手。
  3. 加密套件选择: 优先使用 TLS_PSK_WITH_AES_128_CCM_8(PSK + AES-128-CCM,8 字节认证标签),避免使用 GCM 模式(需要更多硬件加速支持)。
  4. 硬件加速: 选用集成 AES 和 SHA 硬件加速引擎的 MCU(如 ESP32-S3、STM32WBA),可将加密计算时间从毫秒级降至微秒级。
  5. 数据聚合: 在设备端缓存多个采样数据,合并为一条 CoAP 报文发送,减少 DTLS 记录数量,降低每字节开销比例。
ThingsBoard 实践建议: 对于电池供电的传感器节点,推荐使用 PSK 模式 + 会话恢复 + 15 分钟上报间隔。在 ThingsBoard 设备配置中启用 "DTLS Session Cache",服务器端可缓存会话状态 24 小时,设备重连时无需完整握手。

4.4 本章小结

DTLS 为 CoAP 提供了与 TLS 等效的安全保障,但低功耗设备必须仔细权衡安全等级与资源开销。PSK 模式在计算、内存和网络开销上均优于 RSA 证书模式,适合大规模传感器部署;证书模式则适用于网关或高安全场景。通过会话恢复、长连接保持和硬件加速,可将 DTLS 开销控制在可接受范围内。在 ThingsBoard 中,设备接入时需根据硬件能力选择凭证类型,并合理配置 DTLS 会话参数。