
在 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保护你的植物》一课面向单板计算机树莓派与虚拟 IoT 硬件两条硬件路线完整讲解如何把土壤湿度传感器设备从连接字符串方式切换到X.509 证书方式接入 Azure IoT Hub。读完本文你将掌握X.509 证书与公钥/私钥对的工作原理、用 Azure CLI 一键生成自签名设备证书的命令、以及如何在 Python 设备代码中调用IoTHubDeviceClient.create_from_x509_certificate完成认证并继续上报土壤湿度遥测与响应直接方法请求。课程背景为什么要用 X.509 证书保护 IoT 设备本课是整个农场项目2-farm的最后一课主题是设备安全。在之前的课程4-migrate-your-plant-to-the-cloud中设备通过connection_string连接 IoT Hub即使用对称密钥SharedAccessKey认证。本课则切换到非对称加密的 X.509 证书方案并将本次实操限定在虚拟 IoT 硬件和树莓派上对应课程内 single-board-computer-x509.mdWio Terminal 的说明明确写到截至编写时 Azure Arduino SDK 尚不支持 X.509 证书如需实验请参考 Python SDK 的虚拟设备说明。不安全 IoT 应用的主要风险包括伪造设备发送虚假数据导致业务错误响应例如持续上报高土壤湿度灌溉系统永不启动植物缺水枯死未授权者读取 IoT 设备数据包括个人或业务关键数据黑客向设备发送命令造成设备或所连接硬件的损坏通过攻陷 IoT 设备进入附加网络进而访问私有系统恶意人员获取个人数据用于敲诈。密码学基础对称密钥与非对称密钥设备连接 IoT 服务时使用 ID 标识自身但这个 ID 可被克隆——黑客可以用与真实设备相同的 ID 搭建恶意设备并发送伪造数据。解决办法是对传输数据进行加密加密所用的值称为加密密钥encryption key。云端使用解密密钥还原数据若密文无法用密钥解密说明设备已被入侵消息被拒绝。加密分为两类对称加密加密和解密使用同一把密钥。发送方与接收方都需要知道这把密钥密钥需要被共享因此安全性相对最低若密钥在传输中被窃取加密即被破解。上一课设备用的连接字符串正是对称方案HostNamesoil-moisture-sensor.azure-devices.net;DeviceIdsoil-moisture-sensor;SharedAccessKeyBhryind7kKEIDxubK61RiEHHRTrPl7HUow8cEm/mU0其中SharedAccessKey就是设备和 IoT Hub 共知的对称密钥。它从不随消息在设备与云端之间传输而是用于加密收发数据设备首次连接时发送共享访问签名SAS令牌其中包含 IoT Hub URL、过期时间戳通常为当前时间 1 天后以及用共享访问密钥加密的签名IoT Hub 用同一密钥解密校验并核对当前时间是否早于过期时间从而防止恶意设备截获并重放真实设备的 SAS 令牌。非对称加密使用公钥/私钥对。公钥用于加密但无法解密私钥用于解密但无法用于加密。接收方共享自己的公钥发送方用它加密消息接收方用私钥解密。私钥永不共享因此更安全对称加密更快非对称更安全真实系统中常两者结合先用非对称加密传递对称密钥再用对称密钥加密全部数据。X.509 证书把公钥放进可验证的数字文档非对称加密需要把公钥提供给想给你发数据的人但对方如何确认这把公钥确实属于你而不是伪装者解决方案就是 X.509 证书——一种数字文档包含公钥/私钥对中的公钥部分通常由受信任的第三方机构证书颁发机构 CA签发并数字签名表明该密钥有效且属于你。你信任证书是因为信任签发它的 CA类似于信任护照或驾照是因为信任签发国。证书包含多个字段公钥归属者、签发 CA 详情、有效期、公钥本身等使用前应验证证书确实由原 CA 签名。由于 CA 签发证书通常收费测试场景下可以自签名self-sign即自己创建并自己签名的证书。生产环境绝不应使用自签名证书。使用 X.509 证书时双方各自拥有自己的公钥/私钥对和包含公钥的 X.509 证书交换证书后用对方的公钥加密所发数据用自己的私钥解密所收数据。其一大优势是证书可跨设备共享你可以创建一份证书上传到 IoT Hub用于所有设备每台设备只需知道私钥来解密来自 IoT Hub 的消息。设备向 IoT Hub 发送消息时用于加密的证书由 Microsoft 发布许多 Azure 服务共用同一证书有时直接内置在 SDK 中——公钥就是公开的可以出现在源码里。实操前置用 Azure CLI 生成设备身份与 X.509 证书生成 X.509 证书的标准两步流程为创建公钥/私钥对最广泛使用的算法之一是 RSARivest–Shamir–Adleman将公钥及相关数据提交签名可由 CA 签名也可自签名。Azure CLI 提供了命令可在 IoT Hub 中创建新设备身份并自动生成公钥/私钥对与自签名证书。在终端中运行以下命令来自 课程 READMEaz iot hub device-identity create --device-id soil-moisture-sensor-x509 \ --am x509_thumbprint \ --output-dir . \ --hub-name hub_name将hub_name替换为你实际创建的 IoT Hub 名称。该命令会在当前目录生成两个文件soil-moisture-sensor-x509-key.pem—— 设备的私钥文件soil-moisture-sensor-x509-cert.pem—— 设备的 X.509 证书文件。设备 ID 取为soil-moisture-sensor-x509以便与上一课创建的设备身份区分。务必妥善保管这两个文件私钥文件绝不应提交到公共源码控制中。补充本课为农场项目最后一课完成作业后建议按 clean-up.md 清理云资源。删除整个资源组即可连带删除组内全部服务az group delete --name resource-group-name确认提示输入y。删除过程会持续一段时间。核心实操在设备代码中使用 X.509 证书本节严格对照课程文档 single-board-computer-x509.md 的步骤该部分同时适用于虚拟 IoT 硬件与树莓派两条路线。步骤 1拷贝密钥与证书文件把上面生成的密钥和证书文件复制到包含 IoT 设备代码的文件夹中。若你通过 VS Code Remote SSH 使用树莓派、且密钥是在 PC 或 Mac 上创建的可以直接把文件拖放进 VS Code 的资源管理器完成复制。步骤 2打开app.py并声明主机名打开设备代码中的app.py。要在代码中使用 X.509 证书需要 IoT Hub 的主机名host name和证书文件本身。在创建设备客户端之前先加入保存主机名的变量host_name host_name将host_name替换为你的 IoT Hub 主机名。它可以从连接字符串的HostName部分获得即你的 IoT Hub 名称加.azure-devices.net后缀。步骤 3声明设备 ID在主机名下方声明设备 ID 变量device_id soil-moisture-sensor-x509该 ID 必须与上一步az iot hub device-identity create命令中创建的设备身份 ID 一致。步骤 4导入X509类你需要一个包含 X.509 文件内容的X509类实例。把X509加入从azure.iot.device模块导入的类列表from azure.iot.device import IoTHubDeviceClient, Message, MethodResponse, X509步骤 5创建X509实例在host_name声明下方用你的证书和密钥文件创建X509类实例x509 X509(./soil-moisture-sensor-x509-cert.pem, ./soil-moisture-sensor-x509-key.pem)该构造器使用前面生成的soil-moisture-sensor-x509-cert.pem证书含公钥与soil-moisture-sensor-x509-key.pem私钥两个文件。步骤 6改用证书工厂方法创建客户端把原来从连接字符串创建device_client的那行代码替换为device_client IoTHubDeviceClient.create_from_x509_certificate(x509, host_name, device_id)这一步是关键差异此前使用的是IoTHubDeviceClient.create_from_connection_string(connection_string)参见上一课 single-board-computer-connect-hub.md 中的写法现在改为通过证书完成认证不再依赖连接字符串。接着删除代码中connection_string变量的那一行。步骤 7运行验证运行你的代码。像之前一样监控发往 IoT Hub 的消息并发送直接方法请求你会看到设备成功连接、持续上报土壤湿度读数、并正常接收直接方法请求。仓库中的完整参考实现仓库为两条硬件路线各提供了一份完整可运行的示例代码可直接对照参考树莓派版本code/pi/soil-moisture-sensor/app.py —— 使用grove.adc的ADC读取土壤湿度、GroveRelay(5)控制继电器虚拟设备版本code/virtual-device/soil-moisture-sensor/app.py —— 开头通过CounterFitConnection.init(127.0.0.1, 5000)连接 CounterFit 模拟器传感器与执行器改用counterfit_shims_grove下的adc.ADC与grove_relay.GroveRelay。两份代码在 X.509 相关部分完全一致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)可见示例中主机名直接写成host_name.azure-devices.net的占位形式实际使用时只需把host_name替换为你的 IoT Hub 名称。设备连接成功后会打印Connecting/Connected随后进入主循环通过handle_method_request响应relay_on/relay_off直接方法用MethodResponse.create_from_method_request(request, 200)返回成功状态并每 10 秒用adc.read(0)读取一次土壤湿度封装成 JSON 消息{soil_moisture: soil_moisture}经device_client.send_message(message)上报。常见问题与注意事项SDK 支持差异Python Azure IoT SDK 支持 X.509 证书而 Wio Terminal 所依赖的 Azure Arduino SDK 在当时尚不支持这是本课将 X.509 实操限定在虚拟设备与树莓派Python路线的原因。自签名证书仅限测试本课使用 Azure CLI 自动生成的正是自签名证书切勿用于生产发布。私钥保密soil-moisture-sensor-x509-key.pem是私钥泄露等同于设备身份泄露不应进入公共源码仓库云资源在课程结束后也应按 clean-up.md 清理避免产生费用免费层 IoT Hub 每账号仅限一个长期占用会阻碍后续实验。替换而非并存切换为证书认证后代码中不应再保留connection_string变量避免同一客户端上同时存在两种认证方式导致混淆。小结至此你的土壤湿度传感器程序已通过 X.509 证书安全连接到 Azure IoT Hub设备身份由 Azure CLI 的x509_thumbprint方式注册公钥/私钥对与自签名证书自动生成Python 侧仅需导入X509类、用证书与密钥文件构造实例再把create_from_connection_string换成create_from_x509_certificate即可。相比连接字符串的对称密钥方案X.509 证书基于公钥/私钥对实现非对称认证私钥永不外传且同一份证书可复用于多台设备为农场项目乃至更大规模设备群提供了更可管理、更安全的上云认证路径。【免费下载链接】IoT-For-Beginners12 Weeks, 24 Lessons, IoT for All!项目地址: https://gitcode.com/GitHub_Trending/io/IoT-For-Beginners创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考