1. IoT设备身份注册与X.509证书签发
任务拆解:从密钥对到双向 TLS 认证
本案例围绕一个模拟温湿度传感器 th-sensor-01 展开,目标是完成三件事:生成设备密钥对与 CSR、由本地 CA 签发 X.509 设备证书、在 IoT 平台完成身份注册,并验证首次接入时的双向 TLS 认证。整个链路中,设备私钥始终不出设备,平台侧只保存证书与设备身份映射关系。
证书签发与注册链路
关键操作与参数
以下命令在设备侧执行,生成私钥与 CSR。私钥使用 prime256v1 椭圆曲线,CN 设为设备唯一标识 th-sensor-01,与平台注册的 thingName 保持一致。
# 1. 生成设备私钥(不出设备)
openssl ecparam -name prime256v1 -genkey -noout -out device.key
# 2. 生成 CSR,CN 必须与平台注册的 thingName 一致
openssl req -new -key device.key -out device.csr \
-subj "/CN=th-sensor-01/O=IoT-Lab/C=CN"
# 3. 查看 CSR 内容,确认公钥与 CN
openssl req -in device.csr -noout -text | grep -E "Subject:|Public Key Algorithm"
在 CA 侧使用根证书签发设备证书,有效期设为 365 天,并附加 clientAuth 扩展用途,确保该证书可用于双向 TLS 的客户端认证。
# 4. 用 CA 根证书签发设备证书
openssl x509 -req -in device.csr -CA ca.crt -CAkey ca.key \
-CAcreateserial -out device.crt -days 365 -sha256 \
-extfile <(printf "extendedKeyUsage=clientAuth")
# 5. 验证证书链
openssl verify -CAfile ca.crt device.crt
# 预期输出:device.crt: OK
平台注册与认证验证
在 IoT 平台控制台或 API 中完成设备注册,关键字段如下表。注册完成后,平台侧应能通过证书中的 CN 找到对应设备身份。
| 字段 | 值 | 说明 |
|---|---|---|
| thingName | th-sensor-01 | 与证书 CN 一致 |
| 证书 | device.crt | 上传设备证书内容 |
| CA 证书 | ca.crt | 平台用于验证设备证书链 |
| 策略 | policy-th-sensor | 允许发布遥测主题、订阅命令主题 |
设备首次接入时,使用 openssl s_client 模拟双向 TLS 握手,验证平台是否接受设备证书。以下命令中 -cert 和 -key 分别指定设备证书与私钥,-CAfile 指定 CA 根证书用于验证平台证书。
# 6. 模拟双向 TLS 握手
openssl s_client -connect iot.example.com:8883 \
-cert device.crt -key device.key \
-CAfile ca.crt -tls1_2
# 观察输出:
# Verify return code: 0 (ok) → 证书链验证通过
# 若出现 "certificate verify failed" → 检查 CA 证书或证书链顺序
双向 TLS 认证中,设备验证平台证书,平台也验证设备证书。设备私钥始终留在设备本地,平台侧只保存设备证书和 CA 证书,不保存任何私钥。
常见失败原因:CSR 中的 CN 与平台注册的 thingName 不一致;签发时未添加
clientAuth 扩展;设备证书链不完整(缺少中间 CA);系统时间偏差导致证书未生效或已过期。验证通过条件
openssl verify -CAfile ca.crt device.crt返回OK。- 平台设备详情页显示证书已绑定,且状态为“已注册”。
openssl s_client握手输出中Verify return code为0 (ok)。- 设备使用该证书连接平台后,能成功发布一条遥测消息到允许的主题。