Emb Linux上的IoT Hub客户端在send_event_async时返回SSL通道关闭

时间:2017-01-10 09:52:20

标签: linux azure ssl raspberry-pi iot


我正在使用带有Ubuntu Mate的RaspberryPi,我正在尝试从Iot Hub Client运行示例。我为Ubuntu doumented here建造了图书馆。我还构建了Windows版本仅用于测试,它与确切的代码一起运行良好。在使用IoTHubClient.send_event_async时,我在Unix上遇到的错误是:

Python 2.7.12 (default, Nov 19 2016, 06:48:10)
[GCC 5.4.0 20160609]
IoT Hub for Python SDK Version: 1.0.17
Starting the IoT Hub Python sample...
    Protocol MQTT
    Connection string=HostName=<hub name>.azure-devices.net;DeviceId=BananaPi_rasp;SharedAccessKey=<access kwy>
Info: IoT Hub SDK for C, version 1.0.17
IoTHubClient sending 2 messages
IoTHubClient.send_event_async accepted message [0] for transmission to IoT Hub.
Error: Time:Tue Jan 10 02:21:25 2017 File:/home/pi/azure-iot-sdks/c/iothub_client/src/iothubtransport_mqtt_common.c Func:mqtt_operation_complete_callback Line:951 Connection Not Accepted: 0x5: Not Authorized
Error: Time:Tue Jan 10 02:21:25 2017 File:/home/pi/azure-iot-sdks/c/c-utility/src/tlsio_openssl.c Func:decode_ssl_received_bytes Line:654 SSL channel closed in decode_ssl_received_bytes.
Error: Time:Tue Jan 10 02:21:25 2017 File:/home/pi/azure-iot-sdks/c/c-utility/src/tlsio_openssl.c Func:on_underlying_io_bytes_received Line:709 Error in decode_ssl_received_bytes.

我尝试通过设置系统时间和签出证书规范来修复它: 我试图&#34; ping&#34;服务器,看看我是否可以通过以下方式连接到它:

  

openssl s_client -connect .azure-devices.net:8883

我明白了:

CONNECTED(00000003)
depth=2 C = IE, O = Baltimore, OU = CyberTrust, CN = Baltimore CyberTrust Root
......
Server certificate
-----BEGIN CERTIFICATE-----
MIIGcjCCBFqgAwIBAgITWgABtrN..........<etire certificate>...
......
SSL handshake has read 3677 bytes and written 531 bytes
---
New, TLSv1/SSLv3, Cipher is ECDHE-RSA-AES256-SHA384
Server public key is 2048 bit
.....
Protocol  : TLSv1.2
Cipher    : ECDHE-RSA-AES256-SHA384
Session-ID: B0010000E7F6C6ADDC09A37DC7C618C4F4522528E20C8AD6E08DCB5B302101D2
Session-ID-ctx:
Start Time: 1483986649
Timeout   : 300 (sec)
Verify return code: 0 (ok)
---
read:errno=0

从我可以理解所有看起来都很好。

我还试图检查证书的有效性:

  

openssl x509 -in /usr/lib/ssl/certs/Baltimore_Cyber​​Trust_Root.pem

我明白了:

  ........
  Validity
            Not Before: May 12 18:46:00 2000 GMT
            Not After : May 12 23:59:00 2025 GMT
    ......

所以似乎没问题, 这里的一切看起来都很好,但我仍然得到了这个错误。 有没有人知道可能出错的是什么? 感谢

1 个答案:

答案 0 :(得分:0)

我有一些经验可以帮到你。

首先,确保RaspberryPi上的系统时间正确。

然后打印设备密码以查看se字段是否正确: 在umqtt / src / mqtt_codec.c constructConnPayload()中 mqttOptions-&gt;密码如下所示: SharedAccessSignature sr = IoT-xxxx.azure-devices.net / devices / xxxx&amp; sig = xxxxxxxxxxx&amp; se = 1484812561&amp; skn =

如果您看到se = 3600或不等于(当前UTC时间+3600),那么您的情况与我的情况相同。

如何修复它: 在iothub_client / src / iothubtransport_mqtt_common.c中SendMqttConnectMsg() 案例DEVICE_KEY: 修改size_t secSinceEpoch =(size_t)(difftime(get_time(NULL),EPOCH_TIME_T_VALUE)+ 0); to size_t secSinceEpoch =(size_t)(time(NULL));

我的系统上的EPOCH_TIME_T_VALUE为0,因此(difftime(get_time(NULL),EPOCH_TIME_T_VALUE)+ 0)应该等于get_time(NULL)。 但是difftime似乎不适用于我的系统,因此secSinceEpoch始终为0。 最后我只使用时间(NULL)。

我花了好几天时间来解决这个问题。希望它可以帮到你。