1. IoT设备身份注册与X.509证书签发

IoT设备身份注册与X.509证书签发 学习卡片

任务拆解:从密钥对到双向 TLS 认证

本案例围绕一个模拟温湿度传感器 th-sensor-01 展开,目标是完成三件事:生成设备密钥对与 CSR、由本地 CA 签发 X.509 设备证书、在 IoT 平台完成身份注册,并验证首次接入时的双向 TLS 认证。整个链路中,设备私钥始终不出设备,平台侧只保存证书与设备身份映射关系。

证书签发与注册链路

设备侧(th-sensor-01) 设备私钥 device.key(不出设备) 证书签名请求 CSR device.csr(含公钥+CN) 设备证书 device.crt(X.509 v3) 双向 TLS 认证 mTLS 握手 本地 CA(签发侧) CA 根证书 ca.crt / ca.key 签发设备证书 openssl x509 -req 证书链 device.crt → ca.crt IoT 平台(注册侧) 设备身份注册 thingName = th-sensor-01 证书绑定 上传 device.crt 策略关联 允许 publish/subscribe 认证结果 双向 TLS 握手成功/失败 CSR device.crt 上传证书 + 注册身份 私钥不出设备 · 平台仅存证书与身份映射 · 双向 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 找到对应设备身份。

字段值说明
thingNameth-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)。
  • 设备使用该证书连接平台后,能成功发布一条遥测消息到允许的主题。