受限设备上的传输加密:TLS 与 DTLS 怎么选
加密不是开个开关。本文说明 TLS 与 DTLS 的适用场景、握手开销对电池设备意味着什么、证书校验里最常被省略的一步,以及会话复用能省下多少。
- 协议选择由下层传输决定:MQTT over TCP 用 TLS,CoAP over UDP 用 DTLS。
- TLS 1.3 把握手压到一次往返,对高时延蜂窝网络改善明显。
- 窄带设备上握手的流量与耗电可能超过业务数据本身,应优先会话复用。
- 调试时跳过证书校验、上线忘记关闭,是最常见也最危险的配置错误。
- 设备内置的根证书也会过期,必须预先规划更新路径。
设备和平台之间的链路要加密,这一点基本没有争议。实际项目里的分歧在于怎么加:用哪个协议、证书怎么管、握手开销能不能接受。这几个问题在资源充足的服务器之间不成问题,放到一块几十 KB 内存的模组上就成了真实约束。
先看承载协议
这个选择不是独立的 —— 它由下层传输决定。MQTT 跑在 TCP 上,对应 TLS;CoAP 通常跑在 UDP 上,对应 DTLS。DTLS 要在不可靠传输上重建握手的可靠性,因此协议里有重传和分片重组的机制,这也是它实现起来比 TLS 复杂一些的原因。
版本上,TLS 1.3 把握手从两次往返压到一次,对高时延的蜂窝网络改善明显。DTLS 1.3 做了对应的改进。设备侧的协议栈是否支持新版本,往往比平台侧更关键,需要在模组选型时就确认,而不是等开发到一半才发现只支持旧版本。
握手开销是真实成本
一次完整握手包含非对称运算和证书传输。在 NB-IoT 这类窄带网络上,证书链本身可能就是几 KB,而设备每天醒来上报一次数据,握手的流量和耗电可能超过业务数据本身。
- 尽量复用会话:保存会话票据,下次连接走简化握手,省掉大部分开销;
- 缩短证书链:平台侧用层级更浅的证书,少一级就少传一张证书;
- 考虑预共享密钥:在设备算力极其受限时,预共享密钥方案省掉了非对称运算和证书传输,代价是密钥分发和轮换要自己管。
最常被省略的一步:校验服务端证书
不少设备端实现「开启了 TLS」,但在证书校验上设置了跳过 —— 调试阶段为了方便,上线时忘了关。这种状态下链路确实加密了,却完全挡不住中间人:攻击者出示任意证书,设备照样接受。
正确的做法是设备内置根证书或平台证书的指纹,连接时校验服务端证书链与域名。同时要规划证书到期前的更新路径 —— 内置根证书也会过期,而过期当天所有设备同时连不上,是一类相当典型的事故。
双向认证是否必要
服务端证书保证设备连的是真平台;客户端证书保证平台接的是真设备。后者在用户名密码或令牌已经足够的场景下并非必需,但在设备数量大、生命周期长的项目里,客户端证书配合证书吊销机制,比管理大量长期有效的密码更清晰。取舍点通常在产线成本和运维复杂度上,而不在安全性本身。
这几项选择会直接影响后续的接入方案和运维成本,建议在物联网平台解决方案的早期设计阶段与硬件选型一起确定。内置根证书的有效期应当列入例行巡检项,相关问题我们整理在常见问题里。
常见问题
物联网设备一定要用 TLS 吗?
只要链路经过公网就应当加密,否则凭据与数据都是明文可见。真正的问题不是要不要,而是设备资源是否支撑:算力不足时可考虑预共享密钥方案,它省掉了非对称运算和证书传输,但密钥分发和轮换需要自己设计。
TLS 和 DTLS 有什么区别?
TLS 建立在可靠传输(TCP)之上,DTLS 建立在不可靠传输(UDP)之上,因此 DTLS 自己实现了握手消息的重传、排序与分片重组。功能目标一致,实现复杂度 DTLS 更高,适用场景取决于上层用的是 MQTT 还是 CoAP。
设备端跳过证书校验有多大风险?
等于失去了加密的大部分价值。链路内容虽然被加密,但攻击者可以出示任意证书冒充平台,设备会正常建立连接并交出凭据和数据。上线前必须确认校验已开启,并把这一项列入发布检查清单。