IoT-For-Beginners 智能农场安全加固从对称密钥到 X.509 证书保护你的土壤湿度设备【免费下载链接】IoT-For-Beginners12 Weeks, 24 Lessons, IoT for All!项目地址: https://gitcode.com/GitHub_Trending/io/IoT-For-Beginners导读本篇技术指南源自 IoT-For-Beginners 课程第二项目《智能农场》的收官课程讲解如何为已经接入 Azure IoT Hub 的土壤监测设备建立完整的安全防线先剖析 IoT 设备面临的真实威胁与密码学基础再深入讲解连接字符串背后的对称密钥SAS Token认证机制最后给出基于 X.509 证书的非对称认证方案并介绍 Azure CLI 的实操命令与 Python SDK 的完整接入代码。学完本篇你将掌握为什么 IoT 设备会被攻破“对称与非对称加密在设备认证中如何分工”以及如何用一条 CLI 命令生成证书并用其替换连接字符串的完整实战能力。为什么需要保护 IoT 设备在前几课中你已经搭建了土壤湿度监测设备并将其接入云。但假设竞争对手雇佣的黑客夺取了你的 IoT 设备控制权他们可以持续上报土壤湿度充足的假读数让灌溉系统永远不启动植物因缺水枯死也可以强制开启水泵让系统不停浇水植物因涝死水费暴涨。这正是本课要解决的场景——IoT 安全。IoT 安全的目标有两层只允许预期的设备连接云端 IoT 服务并发送遥测以及只有你的云服务能向设备发送命令。同时 IoT 数据可能涉及医疗或私密信息整个应用都需要把安全纳入考虑防止数据泄露。如果应用不安全将面临以下风险伪造设备发送错误数据导致应用做出错误响应例如持续上报高湿度灌溉系统永不启动未授权用户读取 IoT 设备上的个人或商业关键数据黑客向设备发送控制命令损坏设备或与其相连的硬件通过攻破 IoT 设备进入更多网络访问私有系统恶意用户窃取个人数据用于敲诈勒索。这些并非理论假设而是真实发生过的事件2018 年黑客利用水族箱恒温器上的开放 WiFi 接入点侵入赌场网络窃取数据2016 年Mirai 僵尸网络利用使用默认用户名/密码的 DVR 和摄像头等 IoT 设备发起分布式拒绝服务攻击DDoS导致大范围网络中断Spiral Toys 公司的 CloudPets 联网玩具用户数据库在互联网上公开暴露儿童的语音消息被泄露并被勒索健身应用 Strava 公开了用户跑步时经过的其他用户位置与路线陌生人可以借此推断你的住址。 安全是一个宏大的主题本课只涉及设备连接云端的基础部分。设备端数据防篡改、设备被直接入侵、设备配置被篡改等不在本课范围内。IoT 攻击威胁之大催生了类似电脑杀毒软件、专为低功耗小型 IoT 设备设计的防护工具。密码学基础加密、解密与密钥设备连接 IoT 服务时用设备 ID 标识自己。但 ID 可以被克隆——黑客可以伪造一台使用相同 ID 的设备发送假数据。解决办法是把要发送的数据转换成乱码格式用只有设备和云知道的某个值来打乱数据。这一过程称为加密encryption用于加密数据的值称为加密密钥encryption key。云服务随后使用相同或配对的密钥把数据恢复为可读格式这一过程称为解密decryption。如果密文无法用密钥解开说明设备已被入侵消息会被拒绝。这套加密/解密技术统称为密码学cryptography。早期密码学最早的密码类型是替换密码substitution cipher可追溯到 3500 年前其思想是用一个字母替换另一个字母。例如凯撒密码Caesar cipher按固定位数平移字母表只有发送方和接收方知道平移位数。维吉尼亚密码Vigenère cipher更进一步用单词来加密文本使原文中每个字母被平移不同的位数而非统一平移相同数量。历史上密码学用途广泛保护古代美索不达米亚陶工的釉料配方、在印度书写秘密情书、为古埃及魔法咒语保密等。现代密码学现代密码学建立在复杂数学之上可用密钥数量多到让暴力破解在事实上不可行。现代加密应用在生活各处HTTPSHyperText Transfer ProtocolSecure即加密了浏览器与 Web 服务器之间的通信即使有人截获流量也无法读取内容你的电脑还可能对整个硬盘加密设备被盗时没有密码就无法读取数据。 尽管现代密码学声称破解加密需要数十亿年量子计算的兴起可能让现有加密在极短时间内被破解——这也是后量子密码学受到关注的原因。不幸的是并非所有设备都安全有些设备完全没有防护有些使用极易被破解的弱密钥甚至同一型号的所有设备共用同一个密钥。曾有非常私密的 IoT 设备全部使用相同的 WiFi/蓝牙连接密码——如果你能连上自己的设备就能连上别人的进而访问私密数据或控制设备。对称密钥与非对称密钥加密分两种类型对称加密和非对称加密。对称加密使用同一个密钥完成加密和解密发送方与接收方都需要持有这把钥匙安全性相对最低因为密钥必须以某种方式共享——发送方必须先告知接收方密钥如果密钥在传输中被窃取或发送方/接收方被入侵后密钥泄露加密即被破解非对称加密使用两把密钥——加密密钥与解密密钥即公钥/私钥对。公钥用于加密消息但不能解密私钥用于解密消息但不能加密接收方公开分享公钥发送方用其加密消息接收方用私钥解密。私钥从不分享因此非对称加密更安全任何人都可以持有公钥因为它只能用于加密。两种方案各有取舍对称加密更快非对称加密更安全。混合方案也常见——先用非对称加密安全地交换对称密钥再用对称密钥加密所有数据兼顾安全性与速度。保护 IoT 设备两种认证路径IoT 设备可以用对称或非对称加密保护。对称方案更简单但安全性较低。对称密钥连接字符串与 SAS Token你在把设备接入 IoT Hub 时使用了连接字符串其典型形态为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 共知的对称密钥最后一段SharedAccessKey就是设备与 IoT Hub 共同持有的对称密钥它永远不会在设备与云之间传输只用于加密收发的数据。✅ 实验修改连接字符串中的SharedAccessKey段再连接设备观察会发生什么——连接将被拒绝。SAS Token 的握手原理设备首次连接时会发送一个共享访问签名SASToken包含三部分IoT Hub 的 URL、签名过期时间戳通常为当前时间起 1 天和签名。签名是URL 过期时间用连接字符串中的共享访问密钥加密后的结果。IoT Hub 用共享访问密钥解密该签名若解密值与 URL 和过期时间匹配则允许设备连接同时校验当前时间早于过期时间防止恶意设备捕获真机的 SAS Token 后重放攻击。这是一种优雅的身份验证方式发送方同时给出已知数据的明文与密文服务端解密密文并比对明文若一致即证明双方持有同一把对称加密密钥。由于有过期时间设备需要准确的时间通常从 NTP 服务器读取时间不准会导致连接失败。连接建立后设备与 IoT Hub 之间的所有双向数据都用共享访问密钥加密。✅ 思考如果多台设备共用同一个连接字符串会发生什么 把密钥硬编码进代码是不良安全实践黑客拿到源码就等于拿到密钥且发布代码时每台设备都要重新编译。更好的做法是从硬件安全模块HSM——设备上一块存储加密值、供代码读取的芯片——加载密钥。学习阶段把密钥写在代码里如前几课那样通常更方便但绝不能把密钥提交进公开的源代码仓库。双密钥与密钥轮换每台设备有两把密钥和两套对应的连接字符串。这允许你进行密钥轮换rotation当第一把密钥被泄露时切换到第二把然后重新生成第一把。轮换机制是 IoT Hub 设备身份认证的内置能力使密钥泄露后可快速止损。X.509 证书更安全的非对称认证使用非对称加密时你需要把公钥提供给任何想给你发数据的人。问题是接收方如何确认这把公钥真的属于你而不是冒名顶替者答案是不直接提供公钥而是把公钥放进一份由可信第三方验证过的证书中即X.509 证书。X.509 证书是包含公钥/私钥对中公钥部分的数字文档。它们通常由被称为证书颁发机构CA的可信组织签发并由 CA 数字签名以证明密钥有效且属于你。你信任证书及其中的公钥是因为你信任签发它的 CA——就像你信任护照或驾照是因为信任签发国。证书需要付费因此为了测试你也可以自签名self-signed——自己创建并自己签名一份证书。⚠️绝不要在生产环境使用自签名证书。自签名证书仅用于测试验证。证书包含若干字段公钥归属者、签发 CA 的详情、有效期以及公钥本身。使用证书前应校验它确实由原始 CA 签名。使用 X.509 证书时发送方和接收方各自持有自己的公钥、私钥以及包含公钥的 X.509 证书。双方交换证书用对方的公钥加密所发送的数据用自己的私钥解密所接收的数据X.509 证书的一大优势是可以在设备之间共享你可以创建一份证书上传到 IoT Hub供所有设备使用每台设备只需知道用于解密 IoT Hub 消息的私钥。设备向 IoT Hub 加密消息所用的证书由 Microsoft 发布与众多 Azure 服务使用的是同一张证书有时甚至内置在 SDK 中。 记住公钥就是公开的。Azure 公钥只能用于加密发往 Azure 的数据不能解密因此可以随处分享包括放进源码。设备代码中用到的客户端证书一般放在项目内的certs/目录IoT Hub 通过指纹或 CA 关系来校验。实操生成并使用 X.509 证书生成 X.509 证书的步骤为生成一对公钥/私钥。最广泛使用的密钥对生成算法之一是RSARivest–Shamir–Adleman将公钥连同相关数据提交签名可由 CA 签名也可自签名。Azure CLI 提供了在 IoT Hub 中创建新设备身份、自动生成公钥/私钥对并创建自签名证书的命令一步到位。任务一用 X.509 证书创建设备身份运行以下命令注册新的设备身份自动生成密钥与证书az iot hub device-identity create --device-id soil-moisture-sensor-x509 \ --am x509_thumbprint \ --output-dir . \ --hub-name hub_name将hub_name替换为你的 IoT Hub 名称。该命令会创建 ID 为soil-moisture-sensor-x509的设备与上一课创建的soil-moisture-sensor区分并在当前目录生成两个文件soil-moisture-sensor-x509-key.pem—— 设备的私钥文件soil-moisture-sensor-x509-cert.pem—— 设备的X.509 证书文件。务必妥善保管这两个文件私钥文件绝不能提交进公开源代码仓库。 若想了解不用 Azure CLI、手动生成证书的详细步骤如用 OpenSSL可参考前序课程对 OpenSSL 自签名流程的说明。任务二在设备代码中使用 X.509 证书不同硬件平台的接入方式不同Arduino - Wio Terminal截至撰写本文时Azure Arduino SDK 尚不支持 X.509 证书。想体验 X.509可改用 Python SDK 的虚拟设备方案详见 Wio Terminal 说明。树莓派 / 虚拟 IoT 设备Python SDK完整步骤见 单板电脑 X.509 接入指南核心改动如下。Python SDK 的 X.509 接入要点把soil-moisture-sensor-x509-key.pem和soil-moisture-sensor-x509-cert.pem复制到设备代码所在目录树莓派通过 VS Code Remote SSH 时可直接拖拽复制打开app.py在创建设备客户端前声明 IoT Hub 主机名host_name host_name将host_name替换为 IoT Hub 主机名来自连接字符串的HostName段即 hub 名称加.azure-devices.net后缀声明设备 IDdevice_id soil-moisture-sensor-x509从azure.iot.device模块导入X509类from azure.iot.device import IoTHubDeviceClient, Message, MethodResponse, X509用证书与私钥文件创建X509实例x509 X509(./soil-moisture-sensor-x509-cert.pem, ./soil-moisture-sensor-x509-key.pem)将原来用连接字符串创建device_client的代码替换为device_client IoTHubDeviceClient.create_from_x509_certificate(x509, host_name, device_id)这将以 X.509 证书替代连接字符串完成认证删除connection_string变量那一行运行代码按之前的方式监测发送到 IoT Hub 的消息并发送直接方法direct method请求。你会看到设备正常连接、上报土壤湿度读数并能接收直接方法请求。本课仓库中提供了可直接对照的完整实现树莓派版本 与 虚拟设备版本。从源码结构可以看到完整的认证改造host_name、device_id、X509实例三段式配置取代了前序课程第 4 课连接代码中的connection_string connection_string与create_from_connection_string(connection_string)设备端handle_method_request对relay_on/relay_off直接方法的响应逻辑保持不变遥测照常以Message(json.dumps({soil_moisture: soil_moisture}))形式每 10 秒上报一次——安全加固并未改变应用行为只替换了认证凭据。 对比前序课程可知第 4 课 中创建设备身份用的是az iot hub device-identity create --device-id soil-moisture-sensor --hub-name hub_name默认走对称密钥再用az iot hub device-identity connection-string show取出连接字符串本课则是同一命令族增加--am x509_thumbprint参数直接从对称密钥切换到 X.509 指纹认证两份凭据互不干扰、可随时切换。项目收尾清理云资源控制成本这是本项目的最后一课。完成本课及作业后务必清理云服务作业需要这些服务所以先完成作业再清理。清理指南详见 clean-up.md。在本项目中你可能创建过以下资源资源组Resource Group、IoT Hub、设备注册、存储账户、函数应用Functions App等。多数资源免费或处于免费层即便费用较低用完后删除仍然值得——例如订阅中免费层的 IoT Hub 只能创建一个想再建就得用付费层。由于所有服务都建在资源组内删除资源组即可连同其中所有服务一并删除az group delete --name resource-group-name将resource-group-name替换为你的资源组名称。命令会弹出确认提示Are you sure you want to perform this operation? (y/n):输入y确认删除所有服务会花费一些时间。 挑战用 Azure Portal 管理服务创建、管理和删除 Azure 服务如资源组与 IoT Hub有多种方式其中一种是Azure Portal——基于 Web 的图形化管理界面。请登录 Portal尝试用 Portal 创建一个 IoT Hub然后将其删除。提示通过 Portal 创建服务时无需预先创建资源组创建服务时可以一并创建但完成后务必把资源组也删除。作业构建一台全新的 IoT 设备详细要求与评分标准见 assignment.md。在过去的 6 课中你学习了数字农业以及如何用 IoT 设备采集数据预测植物生长、依据土壤湿度自动浇水。现在请综合所学用你选定的传感器与执行器构建一台新 IoT 设备向 IoT Hub 发送遥测并用无服务器代码依据遥测控制执行器。可以使用本课程或前一项目用过的传感器与执行器若有其他硬件也可以尝试新组件。评分关注三方面能否编码出同时使用传感器和执行器的设备、能否部署 IoT Hub 并双向通信发送遥测 接收命令、能否部署由遥测事件触发的 Azure Function 来控制执行器。回顾与自修建议深入了解密码学的演进历史从替换密码到现代密码体系系统阅读 X.509 证书规范掌握其中的字段含义与证书链验证机制若想深入了解 IoT Hub 的其他通信原语设备到云消息、云到设备消息、直接方法、设备孪生可回顾第 4 课对 IoT Hub 通信模型的讲解。【免费下载链接】IoT-For-Beginners12 Weeks, 24 Lessons, IoT for All!项目地址: https://gitcode.com/GitHub_Trending/io/IoT-For-Beginners创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考