首页 > 解决方案 > Azure IOTEdge-网关身份验证错误

问题描述

我一直在尝试将 IOTEdge 设备设置为透明网关,以通过 IOTEdge 将叶子遥测转发到 IOTHub。我已经按照 Azure 官方文档中的步骤阅读并阅读了这些步骤。我将总结一下它做了什么

  1. 有一个工作的 IotEdgeDevice
  2. 从 zip 文件下载 IotEdge 工具(仅用于测试目的)
  3. 从/etc/iotedge/config.yaml复制主机名(从主机 iotEdge 设备)并从为测试目的提供的证书生成工具/bash-scripts 创建证书
  4. 将 Root-cert、intermediatte cert 和 key 移至 Iot-Edge-Device 并在config.yaml中的 iotedge(/ etc/iotedge /)中设置它们的绝对路径 ( /home/user/certs/xxx.pem )
  5. 使用 systemctl 重新启动 IotEdge(因为为什么不)
  6. 将 RootCA 复制到 Leaf-Device(在我的情况下是一个 rasberry pi
  7. 我知道我必须做两者中的任何一个,但我最终做了这两个(第 8 点和第 9 点
  8. 在操作系统中安装 Root.Ca(将 rootCA.pem 文件复制到/usr/local/share/ca-certificates/)然后运行​​sudo update-ca-certificates。此时 TSL 握手命令 ( openssl s_client -connect ) 已验证成功,因此我决定直接不通过 SDK 提及/链接 Root-CA,但此时我已经验证失败。
  9. 通过 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 参数并通过网关发送)

标签: azureazure-iot-hubazure-iot-edgeazure-iot-sdk

解决方案


来自https://docs.microsoft.com/en-us/azure/iot-edge/how-to-connect-downstream-device#troubleshoot-the-gateway-connection

在此处输入图像描述

听起来像 1) 和 2) 可能正是你的问题。您在 config.yaml 中设置的主机名需要解析为正确的 IP


推荐阅读