3、设备身份认证:设备身份认证机制、基于证书的双向认证、TLS/DTLS握手协议

设备身份认证,说白了就是回答一个问题:「你是谁?」。在物联网场景里,这个问题比互联网复杂得多。互联网上你登录个网站,输个密码就行。但物联网设备呢?成千上万台,没人守在旁边输密码。它们得自己证明身份。

我早年做过一个智能电表项目,当时用的还是简单的预共享密钥(PSK)。结果呢?密钥被逆向工程扒出来了,整个小区的电表都能被伪造指令控制。从那以后,我对设备身份认证这件事就特别较真。

3.1 设备身份认证机制

物联网设备身份认证,常见的有这么几种方式:

认证方式 原理 安全性 典型场景
预共享密钥(PSK) 设备和服务端共享同一个密钥 低(密钥易泄露) 家庭智能家居、低功耗传感器
基于用户名/密码 设备出厂写入账号密码 低(密码硬编码风险) 早期物联网设备
基于设备指纹 采集硬件特征(MAC、芯片ID等) 中(可被模拟) 设备注册、准入控制
基于证书(X.509) 使用公钥基础设施(PKI) 高 工业物联网、车联网、医疗设备
基于硬件安全模块(HSM/TEE) 私钥存储在安全芯片中 极高 金融支付、高安全等级设备

我个人习惯,只要设备算力允许,优先选基于证书的方式。为什么?因为证书体系天然支持大规模部署、吊销和轮换。你想想看,一万台设备用PSK,每台密钥不同,你得维护一个巨大的密钥表。用证书呢?只要信任同一个CA,所有设备都能互认。

核心原则:设备身份认证的强度,取决于私钥的存储安全。私钥一旦泄露,再强的算法也没用。

3.2 基于证书的双向认证

单向认证大家很熟悉——你访问HTTPS网站,浏览器验证服务器的证书。但物联网场景里,服务器也需要验证设备的身份。这就是双向认证(Mutual TLS,mTLS)。

双向认证的流程,我画了个图帮你理解:

基于证书的双向认证流程 物联网设备 持有设备证书 + 私钥 认证服务器 持有服务器证书 + 私钥 ① ClientHello(支持算法列表) ② ServerHello + 服务器证书 + 请求设备证书 ③ 设备证书 + ClientKeyExchange + CertificateVerify ④ 验证设备证书 + 完成握手 🔒 加密通信通道建立 💡 关键点:双方都验证了对方的证书链,确保没有中间人攻击。 设备私钥必须安全存储,建议使用安全芯片或TEE。

这个流程里,有几个关键步骤我特别想强调:

  • 步骤②:服务器发送自己的证书,同时要求设备也提供证书。这是双向认证和单向认证最直观的区别。
  • 步骤③:设备发送证书后,还要用私钥对握手消息签名(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 实践建议:如何选择认证方案

说了这么多,到底怎么选?我根据项目经验,给你几个判断标准:

  1. 设备算力:如果MCU只有几十MHz,没有硬件加速,TLS握手可能耗时几秒。考虑使用DTLS + PSK,或者用硬件加速芯片。
  2. 网络环境:TCP连接稳定的场景用TLS;UDP或弱网场景用DTLS。
  3. 安全等级:消费级产品用PSK或单向认证就够了;工业、医疗、车联网必须上双向证书认证。
  4. 运维成本:证书有生命周期,需要规划证书轮换和吊销机制。我见过一个项目,证书过期导致整个产线停摆。

一句话总结:设备身份认证不是「有没有」的问题,而是「够不够」的问题。选方案时,先想清楚你的威胁模型——谁在攻击你?攻击能力有多强?然后选择匹配的认证强度。