azure - Azure IOTEdge-网关身份验证错误
问题描述
我一直在尝试将 IOTEdge 设备设置为透明网关,以通过 IOTEdge 将叶子遥测转发到 IOTHub。我已经按照 Azure 官方文档中的步骤阅读并阅读了这些步骤。我将总结一下它做了什么
- 有一个工作的 IotEdgeDevice
- 从 zip 文件下载 IotEdge 工具(仅用于测试目的)
- 从/etc/iotedge/config.yaml复制主机名(从主机 iotEdge 设备)并从为测试目的提供的证书生成工具/bash-scripts 创建证书
- 将 Root-cert、intermediatte cert 和 key 移至 Iot-Edge-Device 并在config.yaml中的 iotedge(/ etc/iotedge /)中设置它们的绝对路径 ( /home/user/certs/xxx.pem )
- 使用 systemctl 重新启动 IotEdge(因为为什么不)
- 将 RootCA 复制到 Leaf-Device(在我的情况下是一个 rasberry pi)
- 我知道我必须做两者中的任何一个,但我最终做了这两个(第 8 点和第 9 点)
- 在操作系统中安装 Root.Ca(将 rootCA.pem 文件复制到/usr/local/share/ca-certificates/)然后运行sudo update-ca-certificates。此时 TSL 握手命令 ( openssl s_client -connect ) 已验证成功,因此我决定直接不通过 SDK 提及/链接 Root-CA,但此时我已经验证失败。
- 通过 python SDK 使用 Root-CA(示例 python 程序https://github.com/Azure/azure-iot-sdk-python/blob/master/device/samples/edge_downstream_client.py)。所以此时我在我的操作系统中安装了有效的 CA-cert,我也通过 python-SDK 链接了它。仍然无法连接(PS 通过 bash 的测试命令返回 Verified OK)
PS我在leafDevice中使用的连接字符串中的主机名是一个IP地址(DNS似乎把它弄乱了,config.yaml主机中给出的名称似乎在这里无法解析,即使我们从网络上的另一个设备可以ping到那个。所以我只是决定提及该主机名后面的IP地址-属于IOTEdge)。此外,我在门户中创建时将 IOTEdgeDevice 设置为 Leaf 的父设备,并且我选择了对称的身份验证,以便为自己节省所有手动 X509 混乱以进行测试
我从 edgeHub 容器日志中得到的错误是多个。我列出了其中的一些
- Error authenticating token for hmspi because the audience hostname
192.168.100.14 does not match IoTHub hostname mps-hms.azure-devices.net or the EdgeHub hostname
edgeuser-virtual-machine.
- Client hmspi in device scope not authenticated locally.
2019-07-19 05:29:13.979 +00:00 [WRN]
- 0x05 not Authorized
这里要提一下,docker容器(EdgeHub)中的时间与EdgeDevice或LeafDevice的时间不同(这两个时区相同,设置为GMT+5,而docker容器EdgeHub的时区似乎是UTC-i认为它与 iotEdgeHub 在 Azure 服务器上的位置相同 - 但我怀疑它会产生问题,因为带有证书的 openSSL 的 bash 测试命令返回“已验证好的”)。任何输入都将受到高度赞赏,因为我现在似乎无法解决这个问题。
更新: **所以我从较短的版本更改了连接字符串**
HostName=myGatewayDevice;DeviceId=myDownstreamDevice;SharedAccessKey=xxxyyyzzz
至
HostName=myiothub.azure-devices.net;DeviceId=myDownstreamDevice;SharedAccessKey=xxxyyyzzz;GatewayHostName=myGatewayDevice
它现在可以工作,但我很困惑为什么它不会,因为我已经在 EdgeDevice 和我的 LeafDevice 之间建立了父/子关系(如此处所述 https://docs.microsoft.com/en-us/azure/iot- edge/how-to-authenticate-downstream-device您可以在设置父/子时使用较短版本的连接字符串。我正在使用 python SDK----我也确实解析了我的 DNS 但是没有办法知道数据是否只是通过直接 IOT HUB 连接而忽略 gatewayHostname 参数,或者它是否使用 gatewayHostName 参数并通过网关发送)
解决方案
听起来像 1) 和 2) 可能正是你的问题。您在 config.yaml 中设置的主机名需要解析为正确的 IP
推荐阅读
- python - 为什么 re.split() 保留分隔符而 split() 没有
- android - 重定向 URI 与使用包名称和签名哈希生成的不匹配
- oracle - 在“In”运算符中使用子查询的 Oracle 性能问题
- reactjs - 如何使用 react 和 typescript 在同一组件文件中使用上下文?
- ssl - 测试 Swish API 时 SSLError 证书验证失败
- r - R:是什么原因导致“在 eval(ei, envir) 中:强制引入的 NAs”?
- java - 在java中合并ArrayList中元素的最佳方法
- python - 使用python计算有多少整数严格大于其右侧的所有整数的代码
- css - 单击按钮时如何删除蓝框填充?
- selenium - 如何单击 id 和 name 唯一的表(从数据库值生成)的第一行中的按钮