2. 设备身份与凭证管理:唯一标识符、预共享密钥与证书的生成与分发

设备注册的第一步,就是给设备一个「合法身份」。说白了,你得让云端知道:你是谁?你凭什么接入?

我见过不少项目,一上来就急着写业务逻辑,结果设备身份管理做得一塌糊涂。等到设备量上了万,才发现没法区分哪台设备在发数据——那场面,真是灾难。

这一节,我们重点聊三个东西:Device ID、PSK 和 证书。它们怎么生成?怎么分发?有什么坑?

2.1 唯一标识符(Device ID)

Device ID 是设备的「身份证号」。它必须唯一、不可篡改、且能在设备全生命周期内稳定存在。

2.1.1 常见的 Device ID 来源

来源 优点 缺点
芯片唯一序列号(如 MCU UID) 硬件绑定,不可伪造 部分芯片序列号可被读取改写
MAC 地址 网络层天然唯一 可被篡改,且隐私合规风险高
IMEI / MEID(蜂窝模组) 运营商级唯一 仅限蜂窝设备,且需授权读取
云端预分配 UUID 完全可控,长度灵活 需安全通道写入设备

我个人习惯:优先用芯片 UID + 云端预分配组合。芯片 UID 做硬件锚点,云端再补一个业务 ID,这样既防物理篡改,又方便管理。

注意: 不要直接用 MAC 地址做 Device ID。GDPR 和《个人信息保护法》里,MAC 地址可能被认定为「可关联个人身份的信息」。我在一个智能家居项目里吃过这个亏——后来全部翻工,换成哈希后的设备指纹。

2.1.2 生成规范

  • 长度:建议 16-32 字节,太短容易碰撞,太长浪费存储。
  • 编码:推荐 hex 或 base64,避免特殊字符导致协议解析出错。
  • 不可预测性:不要用自增 ID,防止被枚举扫描。用随机数 + 时间戳 + 硬件指纹做哈希。
// 示例:基于 HMAC-SHA256 生成 Device ID
device_id = HMAC-SHA256(
    key = factory_secret,
    data = chip_uid || timestamp || nonce
).substring(0, 16)

2.2 预共享密钥(PSK)

PSK 是最轻量的对称凭证。适合资源受限的 MCU、Zigbee 节点、蓝牙传感器。

2.2.1 PSK 的生成策略

PSK 不能是「123456」这种弱口令。我建议用 KDF(密钥派生函数) 从主密钥派生。

// 基于 Device ID 派生出唯一 PSK
psk = HKDF-SHA256(
    salt = device_id,
    ikm = master_secret,
    info = "device-psk-v1",
    length = 16
)

这样做的好处:主密钥只保存在云端,设备端只存派生后的 PSK。即使一台设备被物理破解,也拿不到其他设备的密钥。

经验之谈: 我曾经在一个 LoRa 项目里,直接用设备 MAC 地址后 6 位当 PSK。结果被客户的安全审计抓了个正着——所有设备 PSK 可被暴力枚举。后来改成每台设备单独派生,审计才通过。

2.2.2 PSK 的分发方式

方式 安全性 适用场景
出厂预烧录 高(需管控烧录环境) 大批量、同批次设备
首次上电动态获取 中(依赖 TLS 通道) 消费类 IoT,支持 OOB 绑定
二维码/蓝牙扫描 中(需防中间人) 智能家居、可穿戴设备

嗯,这里要注意:动态分发必须走加密通道。我见过一个项目,PSK 通过明文 HTTP 下发——那跟把家门钥匙挂在门口有什么区别?

2.3 证书(X.509 Certificate)

证书是 IoT 里最安全的凭证方案,但也是实现成本最高的。适合网关、服务器、高安全等级设备。

2.3.1 证书链结构

典型的 IoT 证书链分三层:

  1. 根 CA:离线保存,只用来签发中间 CA。
  2. 中间 CA:负责签发设备证书,可在线。
  3. 设备证书:每台设备独一份,包含 Device ID 和公钥。
核心原则: 根 CA 永远不要联网。我见过有人把根 CA 放在 CI/CD 服务器上——结果一次构建被投毒,整个信任链全废了。

2.3.2 证书生成流程

# 1. 设备生成密钥对(在安全元件内完成)
openssl ecparam -genkey -name prime256v1 -out device.key

# 2. 生成证书签名请求(CSR)
openssl req -new -key device.key -out device.csr \
  -subj "/CN=device-{device_id}"

# 3. 中间 CA 签名
openssl x509 -req -in device.csr \
  -CA intermediate.crt -CAkey intermediate.key \
  -CAcreateserial -out device.crt -days 3650

你想想看,如果私钥在生成过程中被泄露,那证书就是一张废纸。所以,私钥生成必须在设备安全元件(SE / TEE)内完成,私钥永不出芯片。

2.3.3 证书分发与生命周期

阶段 操作 安全要点
生产 证书写入设备安全存储 防止烧录工具被篡改
激活 设备首次联网上报证书指纹 云端校验是否被吊销
运行 TLS 握手时双向认证 定期检查证书有效期
到期 通过 OTA 更新证书 必须签名验证,防中间人
吊销 云端更新 CRL / OCSP 设备端需支持吊销列表

2.4 三种凭证的选型对比

维度 Device ID PSK 证书
安全等级 低(仅标识) 中 高
计算开销 几乎为零 低(对称算法) 高(非对称算法)
存储开销 几字节 16-32 字节 几百字节到几 KB
吊销能力 无 需云端黑名单 CRL / OCSP 原生支持
合规要求 基础 中等(如 PSA Level 1) 高(如 PSA Level 2+、FIPS)

我个人建议:消费类 IoT 用 PSK + Device ID 组合;工业、车联网、医疗设备必须上证书。别为了省几毛钱的安全芯片成本,把整个产品的合规性搭进去。

2.5 知识体系总览

下面这张图,把三种凭证的生成、分发、使用关系串起来了。你可以把它当作本章的「思维导图」。

设备身份与凭证管理知识体系 设备身份与凭证管理 — 核心流程 设备身份(Device ID) 预共享密钥(PSK) X.509 证书 ID + PSK 组合 KDF 派生 / 出厂预置 密钥对生成 → CSR → CA 签名 ID 哈希 + PSK 绑定 出厂烧录 / 首次上电获取 安全元件写入 / OTA 更新 二维码 / 蓝牙 OOB 分发 凭证生命周期:生成 → 分发 → 激活 → 运行 → 更新/吊销 ⚠️ 核心原则:私钥永不出安全元件 | 根 CA 离线保存 | 动态分发必须走加密通道 选型建议:消费类 → PSK + ID | 工业/车联网 → 证书 | 资源极度受限 → 纯 ID + 云端校验

2.6 合规要点速查

  • GDPR / 个人信息保护法:Device ID 不能直接关联个人身份。建议用哈希或匿名化处理。
  • PSA Certified / NIST:Level 2 以上要求硬件安全存储凭证,私钥不可读。
  • ETSI EN 303 645:消费类 IoT 必须支持凭证更新机制,不能硬编码死密钥。
  • 车联网(ISO 21434):证书吊销列表必须在设备端缓存,支持离线验证。
一个小技巧: 合规审计时,审计员最喜欢问「凭证怎么生成的?密钥存哪了?」。提前准备好一份《凭证管理 SOP》,把生成工具、存储介质、访问权限写清楚,能省很多麻烦。