3、设备身份认证:设备身份认证机制、基于证书的双向认证、TLS/DTLS握手协议
设备身份认证,说白了就是回答一个问题:「你是谁?」。在物联网场景里,这个问题比互联网复杂得多。互联网上你登录个网站,输个密码就行。但物联网设备呢?成千上万台,没人守在旁边输密码。它们得自己证明身份。
我早年做过一个智能电表项目,当时用的还是简单的预共享密钥(PSK)。结果呢?密钥被逆向工程扒出来了,整个小区的电表都能被伪造指令控制。从那以后,我对设备身份认证这件事就特别较真。
3.1 设备身份认证机制
物联网设备身份认证,常见的有这么几种方式:
| 认证方式 | 原理 | 安全性 | 典型场景 |
|---|---|---|---|
| 预共享密钥(PSK) | 设备和服务端共享同一个密钥 | 低(密钥易泄露) | 家庭智能家居、低功耗传感器 |
| 基于用户名/密码 | 设备出厂写入账号密码 | 低(密码硬编码风险) | 早期物联网设备 |
| 基于设备指纹 | 采集硬件特征(MAC、芯片ID等) | 中(可被模拟) | 设备注册、准入控制 |
| 基于证书(X.509) | 使用公钥基础设施(PKI) | 高 | 工业物联网、车联网、医疗设备 |
| 基于硬件安全模块(HSM/TEE) | 私钥存储在安全芯片中 | 极高 | 金融支付、高安全等级设备 |
我个人习惯,只要设备算力允许,优先选基于证书的方式。为什么?因为证书体系天然支持大规模部署、吊销和轮换。你想想看,一万台设备用PSK,每台密钥不同,你得维护一个巨大的密钥表。用证书呢?只要信任同一个CA,所有设备都能互认。
核心原则:设备身份认证的强度,取决于私钥的存储安全。私钥一旦泄露,再强的算法也没用。
3.2 基于证书的双向认证
单向认证大家很熟悉——你访问HTTPS网站,浏览器验证服务器的证书。但物联网场景里,服务器也需要验证设备的身份。这就是双向认证(Mutual TLS,mTLS)。
双向认证的流程,我画了个图帮你理解:
这个流程里,有几个关键步骤我特别想强调:
- 步骤②:服务器发送自己的证书,同时要求设备也提供证书。这是双向认证和单向认证最直观的区别。
- 步骤③:设备发送证书后,还要用私钥对握手消息签名(CertificateVerify)。这证明设备确实拥有对应的私钥。
- 步骤④:服务器验证设备证书的合法性——证书是否由受信任CA签发、是否在有效期内、是否被吊销。
我的经验:在资源受限的物联网设备上,证书链验证可能很耗时。我建议在设备端只存储设备证书和中间CA证书,根证书可以预置在固件中。这样验证路径短,握手更快。
3.3 TLS/DTLS握手协议
TLS(传输层安全协议)是互联网上最广泛使用的安全协议。但物联网设备很多使用UDP通信,所以有了DTLS(数据报传输层安全协议)。DTLS基于TLS设计,但能处理UDP的丢包和乱序问题。
嗯,这里要注意:TLS和DTLS的握手流程基本一致,但DTLS增加了重传机制和显式序列号。我做过一个基于CoAP(使用DTLS)的项目,刚开始没处理好重传超时,设备在弱网环境下频繁断连。后来调整了重传策略才稳定下来。
3.3.1 TLS 1.3 握手(简化版)
TLS 1.3相比1.2,握手效率提升了很多。我直接给你看核心流程:
客户端(设备) 服务器
| |
|--- ClientHello (密钥共享) ---→|
| |--- 验证服务器证书
|←-- ServerHello + 证书 + 完成 -|
| |
|--- 验证服务器证书 -----------→|
|--- 发送设备证书 + CertificateVerify →|
| |--- 验证设备证书
|←-- 完成 ----------------------|
| |
|========= 加密通信 ============|
TLS 1.3最大的变化是:
- 1-RTT握手:大多数情况下,一次往返就能完成握手。TLS 1.2需要2-RTT。
- 0-RTT(早期数据):如果之前连接过,可以立即发送加密数据。但要注意重放攻击。
- 移除了不安全算法:RSA密钥交换、CBC模式等都被移除了。
⚠️ 避坑指南:我曾经在项目中启用0-RTT,结果发现攻击者可以重放之前的请求。后来我加上了「反重放机制」——在0-RTT数据中包含时间戳和一次性随机数(Nonce)。如果你要用0-RTT,务必考虑重放防护。
3.3.2 DTLS 1.2 握手要点
DTLS和TLS的主要区别,我整理了一个对比表:
| 特性 | TLS 1.3 | DTLS 1.2 |
|---|---|---|
| 传输层 | TCP(可靠) | UDP(不可靠) |
| 握手RTT | 1-RTT(0-RTT可选) | 1-RTT(需处理重传) |
| 重传机制 | 由TCP保证 | 协议层实现超时重传 |
| 序列号 | 隐式(基于TCP序列号) | 显式(防止重放) |
| 典型应用 | HTTPS、MQTT over TCP | CoAP、LwM2M、VoIP |
DTLS握手时,如果握手消息丢失,发送方会超时重传。接收方收到重复消息,根据序列号丢弃。这个机制在弱网环境下特别重要。
3.4 实践建议:如何选择认证方案
说了这么多,到底怎么选?我根据项目经验,给你几个判断标准:
- 设备算力:如果MCU只有几十MHz,没有硬件加速,TLS握手可能耗时几秒。考虑使用DTLS + PSK,或者用硬件加速芯片。
- 网络环境:TCP连接稳定的场景用TLS;UDP或弱网场景用DTLS。
- 安全等级:消费级产品用PSK或单向认证就够了;工业、医疗、车联网必须上双向证书认证。
- 运维成本:证书有生命周期,需要规划证书轮换和吊销机制。我见过一个项目,证书过期导致整个产线停摆。
一句话总结:设备身份认证不是「有没有」的问题,而是「够不够」的问题。选方案时,先想清楚你的威胁模型——谁在攻击你?攻击能力有多强?然后选择匹配的认证强度。