ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

IoT-For-Beginners 实战:使用 X.509 证书将树莓派与虚拟 IoT 设备安全接入 Azure IoT Hub

2026/9/14 9:37:36 拓冰建站 浏览量
IoT-For-Beginners 实战:使用 X.509 证书将树莓派与虚拟 IoT 设备安全接入 Azure IoT Hub IoT-For-Beginners 实战使用 X.509 证书将树莓派与虚拟 IoT 设备安全接入 Azure IoT Hub【免费下载链接】IoT-For-Beginners12 Weeks, 24 Lessons, IoT for All!项目地址: https://gitcode.com/GitHub_Trending/io/IoT-For-Beginners本篇技术指南围绕 IoT-For-Beginners 仓库数字农业项目第 6 课Keep your plant secure展开聚焦于在 Raspberry Pi 或虚拟 IoT 设备Virtual IoT device上用 X.509 证书替代连接字符串connection string安全连接 Azure IoT Hub 的完整实操流程。读完本文你将掌握 X.509 证书的生成命令、Python 设备代码的改造要点、连接后的消息与直接方法direct method验证手段以及对称/非对称加密在这一安全链路中的底层原理。课程背景为什么要给植物换一套“证书身份”在前几课中你已经用连接字符串将土壤湿度传感器设备接入了 IoT Hub。连接字符串包含HostName、DeviceId与SharedAccessKey其中SharedAccessKey是设备与 IoT Hub 共享的对称密钥。对称加密的天然弱点是密钥必须被共享一旦密钥在传输途中被截获、或源代码泄露攻击者就能克隆设备身份并伪造遥测数据例如一直上报高土壤湿度导致灌溉系统永不开启、植物枯死。X.509 证书则走非对称加密路线设备持有公钥/私钥对公钥被放进一份由可信第三方证书颁发机构 CA签名的数字文档中。双方交换证书、用对方的公钥加密数据、用自己的私钥解密数据。由于私钥永不离开设备安全性远高于对称方案。本课要做的就是为设备创建一个基于 X.509 证书的新身份soil-moisture-sensor-x509并让 Python 设备代码放弃连接字符串改用IoTHubDeviceClient.create_from_x509_certificate()完成连接。前置条件已完成的基础设施与代码在开始本文步骤前你需要已经完成本课程前序内容即拥有一个已创建的 Azure IoT HubF1 免费层即可支持每天 8000 条消息创建命令可参考第 4 课 READMEaz iot hub create --resource-group soil-moisture-sensor \ --sku F1 \ --partition-count 2 \ --name hub_name一个通过连接字符串连接的土壤湿度传感器程序使用 Python SDKazure-iot-device既能上报soil_moisture遥测也能响应relay_on/relay_off直接方法请求已安装并登录 Azure CLIaz login已安装 IoT 扩展az extension add --name azure-iot树莓派场景下证书文件生成于 PC/Mac通过 VS Code Remote SSH 开发时可直接将文件拖入 VS Code 资源管理器完成复制。生成 X.509 证书与设备身份Azure CLI 的az iot hub device-identity命令支持一次性完成三件事在 IoT Hub 中注册新设备身份、自动生成公钥/私钥对、创建自签名证书。在终端中执行az iot hub device-identity create --device-id soil-moisture-sensor-x509 \ --am x509_thumbprint \ --output-dir . \ --hub-name hub_name参数说明参数含义--device-id新设备身份 ID取soil-moisture-sensor-x509以区分上一课注册的soil-moisture-sensor--am x509_thumbprint认证方式为 X.509 证书指纹认证authentication mode--output-dir .将生成的证书与密钥文件输出到当前目录--hub-name替换为你实际创建的 IoT Hub 名称命令执行后当前目录会出现两个关键文件soil-moisture-sensor-x509-key.pem—— 设备的私钥文件soil-moisture-sensor-x509-cert.pem—— 设备的 X.509 证书文件。⚠️ 私钥文件务必妥善保管绝不能提交到公共源码仓库。若私钥泄露任何持有者都能冒充该设备接入 IoT Hub。需要说明的是这里通过 CLI 自动生成的属于自签名证书self-signed适用于学习与测试课程明确提醒生产环境不应使用自签名证书而应使用受信任的 CA 签发的证书。如果你希望了解 OpenSSL 手工生成证书的详细步骤可参考课程 README 中给出的微软官方教程指引见 README。在设备代码中使用 X.509 证书拿到证书与私钥文件后将这两个.pem文件复制到存放 IoT 设备代码的文件夹中与app.py同目录然后按以下步骤改造代码。以下每一步均对应关联文档的原始操作清单。第 1 步声明 IoT Hub 主机名在创建设备客户端device client的代码之前添加主机名变量host_name host_namehost_name替换为你 IoT Hub 的主机名。可以从原连接字符串的HostName段取得其形式为你的IoT Hub名称.azure-devices.net。第 2 步声明设备 IDdevice_id soil-moisture-sensor-x509注意此 ID 必须与上一步注册设备身份时使用的--device-id完全一致否则连接会被拒绝。第 3 步导入 X509 类在from azure.iot.device导入语句中加入X509from azure.iot.device import IoTHubDeviceClient, Message, MethodResponse, X509第 4 步创建 X509 实例在host_name声明下方用证书文件与私钥文件构造X509实例x509 X509(./soil-moisture-sensor-x509-cert.pem, ./soil-moisture-sensor-x509-key.pem)构造函数的两个参数依次为证书文件路径与私钥文件路径。这里采用相对路径意味着两个.pem文件必须与app.py位于同一目录。第 5 步改用证书方式创建设备客户端将原来基于连接字符串创建device_client的代码device_client IoTHubDeviceClient.create_from_connection_string(connection_string)替换为device_client IoTHubDeviceClient.create_from_x509_certificate(x509, host_name, device_id)create_from_x509_certificate()接收三个参数X509实例、IoT Hub 主机名、设备 ID。此后 SDK 内部会使用 X.509 证书完成身份认证而不再依赖连接字符串。第 6 步清理旧代码删除connection_string变量的声明行避免残留明文密钥。第 7 步运行并验证运行程序按前几课的方式用az iot hub monitor-events监控遥测、用az iot hub invoke-device-method发送直接方法请求你将看到设备正常上报土壤湿度读数并响应relay_on/relay_off请求——只不过这次的连接身份来自 X.509 证书。源码视角完整改造后的 app.py 长什么样改造后的完整代码可在仓库中找到两份树莓派版见 code/pi/soil-moisture-sensor/app.py虚拟设备版见 code/virtual-device/soil-moisture-sensor/app.py。两份代码结构一致仅传感器读取方式不同树莓派使用grove.adc虚拟设备使用counterfit_shims_grove.adc并通过 CounterFit 模拟硬件。核心部分如下import time from grove.adc import ADC from grove.grove_relay import GroveRelay import json from azure.iot.device import IoTHubDeviceClient, Message, MethodResponse, X509 adc ADC() relay GroveRelay(5) host_name host_name.azure-devices.net device_id soil-moisture-sensor-x509 x509 X509(./soil-moisture-sensor-x509-cert.pem, ./soil-moisture-sensor-x509-key.pem) device_client IoTHubDeviceClient.create_from_x509_certificate(x509, host_name, device_id) print(Connecting) device_client.connect() print(Connected) def handle_method_request(request): print(Direct method received - , request.name) if request.name relay_on: relay.on() elif request.name relay_off: relay.off() method_response MethodResponse.create_from_method_request(request, 200) device_client.send_method_response(method_response) device_client.on_method_request_received handle_method_request while True: soil_moisture adc.read(0) print(Soil moisture:, soil_moisture) message Message(json.dumps({ soil_moisture: soil_moisture })) device_client.send_message(message) time.sleep(10)从源码结构可以清晰看到 X.509 方案与原方案的差异点导入面X509类加入导入列表身份信息host_name、device_id作为独立变量存在替代了连接字符串客户端创建create_from_x509_certificate()取代create_from_connection_string()其余业务逻辑不变直接方法处理器handle_method_request通过request.name分发relay_on/relay_off用MethodResponse.create_from_method_request(request, 200)返回成功状态码主循环每 10 秒读取一次模拟量通道 0 的土壤湿度并上报 JSON 遥测。这印证了 X.509 改造的侵入面很小——只涉及“身份与连接建立”这一层传感器读数、消息封装、方法响应等业务逻辑完全复用。为什么这样连接是安全的对称密钥与 SAS 令牌对照对比上一课使用的连接字符串方案可以更深入理解 X.509 的价值。连接字符串格式为HostNamesoil-moisture-sensor.azure-devices.net;DeviceIdsoil-moisture-sensor;SharedAccessKeyBhryind7kKEIDxubK61RiEHHRTrPl7HUow8cEm/mU0它由三段键值组成键示例值说明HostNamesoil-moisture-sensor.azure-devices.netIoT Hub 的 URLDeviceIdsoil-moisture-sensor设备唯一 IDSharedAccessKeyBhryind7kKEIDxubK61RiEHHRTrPl7HUow8cEm/mU0设备与 IoT Hub 共知的对称密钥对称方案下设备首次连接时发送一个共享访问签名SAS令牌其中包含 IoT Hub URL、过期时间戳通常为当前时间起 1 天以及用SharedAccessKey加密的签名。IoT Hub 用同一把密钥解密校验并核对当前时间是否早于过期时间从而判断发送方是否持有正确的对称密钥。这个过程优雅但脆弱——密钥一旦共享就可能泄露而 X.509 方案中私钥始终保存在设备端。注意事项与适用前提Arduino/Wio Terminal 暂不支持截至课程编写时Azure Arduino SDK 不支持 X.509 证书。若你使用 Wio Terminal可参考 wio-terminal-x509.md 中的说明——该文档明确建议改用虚拟 IoT 设备的 Python SDK 指南进行实验。自签名证书仅限学习课程明确提示“绝不能在生产发布中使用自签名证书”。生产环境应使用 CA 签发证书并且 CA 签发的证书通常需要付费。证书可复用X.509 证书的一大优势是可跨设备共享——生成一份证书上传到 IoT Hub可服务多个设备每台设备只需持有私钥即可解密来自 IoT Hub 的消息。密钥文件保管soil-moisture-sensor-x509-key.pem必须保密不要签入公共代码仓库相对路径引用意味着运行目录必须正确。课程结束后的清理本课是数字农业项目的最后一课完成课后作业后请按 clean-up.md 清理云资源避免产生持续费用清理前务必先完成 assignment.md 中的任务因为作业仍需要使用这些服务。小结通过本课实践你完成了对土壤湿度传感器设备的一次“安全升级”从共享对称密钥的连接字符串切换为基于 X.509 证书的非对称认证链路。关键成果可以概括为三条其一用az iot hub device-identity create --am x509_thumbprint一条命令同时完成设备注册、密钥对生成与自签名证书签发其二设备代码仅需改动导入、身份变量与客户端工厂方法三处即可切换为证书连接其三完整的可运行实现保存在仓库的 树莓派版 与 虚拟设备版 代码目录中可随时对照学习。【免费下载链接】IoT-For-Beginners12 Weeks, 24 Lessons, IoT for All!项目地址: https://gitcode.com/GitHub_Trending/io/IoT-For-Beginners创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考