Azure IOTEdge-Gateway身份验证错误

时间:2019-07-19 06:25:01

标签: azure azure-iot-hub azure-iot-edge azure-iot-sdk

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

  1. 拥有一个有效的IotEdgeDevice
  2. 下载IotEdge工具仅出于zip测试目的 文件
  3. /etc/iotedge/config.yaml (从主机iotEdge设备复制)复制主机名,并从证书生成工具/ bash-创建证书提供用于测试目的的脚本
  4. 将根证书,中间证书和密钥移动到Iot-Edge-Device,并在<< em> /home/user/certs/xxx.pem 中设置其绝对路径。 emotedge处的em> config.yaml (/ etc / iotedge /)
  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 < / em>。此时,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证书,并且也通过python-SDK将其链接了。仍然无法连接(通过bash的PS测试命令返回“验证确定”)

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的时间都不相同(这两个timeZones相同,设置为GMT + 5,而docker容器EdgeHub似乎具有时区UTC-我认为它与iotEdgeHub在Azure Servers上的位置相同-但我怀疑它会产生问题,因为带有带有证书的openSSL的bash测试命令返回“ Verified Ok”。非常感谢任何输入,因为我现在似乎想解决此问题。

更新: **所以我从较短的版本更改了连接字符串 **

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 个答案:

答案 0 :(得分:0)

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

enter image description here

1)和2)之类的声音可能正是您遇到的问题。您在config.yaml中设置的主机名需要解析为正确的IP