Lua SSL 证书和 Azure Iot 中心

Lua SSL certificate and Azure Iot hub

我正在尝试将我的 NodeMCU ESP-12N 连接到 Azure IoT 中心。

我用这样的代码创建了客户端:

esp8266 = mqtt.Client(DEVICE, 240, USER, PASSWD)

调用时收到错误 esp8266:connect

PANIC: unprotected error in call to Lua API (init.lua:127: ssl not available)

当我之前连接我的 Arduino 时,使用 SSL 证书刷新 Wi-Fi 很重要。但是我不能用 NodeMCU 来做(或者更正确地说——不知道怎么做)。

我可以通过以下方式获得证书:

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

当我添加时(感谢@MarcelStör 的提示,我之前已经尝试过net.cert.verify)

tls.cert.verify([[
-----BEGIN CERTIFICATE-----
MIIGsTCCBJmgADJKJFdWgAIQF5Koy/50vI3cQAAAAhAXjANBgkqhkiG9w0BAQsF
......
lz3ZDUcyzRgG6TRtA3SjASEUlJMt3f7xuI2nNpt8p5gy9pXuRw==
-----END CERTIFICATE-----
]])

tls.cert.verify(true)

我收到另一个错误:

Error Connecting: -5

更新: 有another similar topic,我定了时间,还是没有结果

更新 2: 这是我尝试使用的一些 link:

Use Azure IoT Hub without client libraries (MQTT)

Sending Device-to-Cloud (D2C) Messages

sankarcheppali gitHub with samples

这是官方的Link Communicate with your IoT hub using the MQTT protocol 这告诉:

To use the MQTT protocol directly, your client must connect over TLS/SSL. Attempts to skip this will fail with connection errors.

此 link 还提供了与旧代码示例不同的用户名:

{iothubhostname}/{device_id}/api-version=2016-11-14

您可以参考以下两个库将NodeMCU ESP-12N连接到Azure IoT hub,这两个库可以在库管理器中搜索:

  • A​​zureIoTHubMQTTClient
  • AzureIoTProtocol_MQTT

安装完成后,您可以参考示例。

TLS/SSL 默认情况下在固件构建配置中 dis 启用。 CLIENT_SSL_ENABLE in user_config.h 必须在 compiling/building 固件之前取消注释。

最简单的方法是使用 https://nodemcu-build.com 上的云构建器(由您自己创建)并选中 TLS 复选框。

另外,net模块中的所有TLS/SSL相关函数(你用的net.cert.verify)都在前段时间被提取到了tls模块中。除非有令人信服的论据支持 not 使用当前的固件版本,否则我建议您尝试 dev 分支。当您在构建器中启用 "TLS/SSL support" 时,您会自动获得 tls 模块。

更新:有一篇关于 Azure IoT 中心和证书的好文章:Certificate between IoT hub and devices connection

我在 Device Explorer 的帮助下创建了 SAS,它看起来像:

SharedAccessSignature sr={your hub name}.azure-devices.net%2Fdevices%2FMyDevice01%2Fapi-version%3D2016-11-14&sig=vSgHBMUG.....Ntg%3d&se=1456481802

此值设置为 PASSWD 变量。已将 USER 变量更改为:

USER   = "MyAzureIoTHub.azure-devices.net/MyDeviceID/api-version=2016-11-14"

并已设置为 false tls.cert.verify

tls.cert.verify(false)

现在有效:)