通过 MQTT 和 TLS 从 NodeMCU 向 Raspberry Pi 发送数据

我遇到了通过 MQTT 和 TLS 从 NodeMCU 向 Raspberry Pi 发送数据的问题。

配置

Raspberry Pi(安装有 Minibian)运行了 Mosquitto (版本为 1.4.11)代理。配置如下:

allow_anonymous true

listener 8883
cafile /etc/mosquitto/ca.crt
certfile /etc/mosquitto/minibian.crt
keyfile /etc/mosquitto/minibian.key
require_certificate false

证书是通过 generate-CA.sh 从 https://github.com/owntracks/tools/tree/master/TLS 生成的,并且使用了 SHA256(我也试过使用 MD5)。在生成证书之前,定义了 IPLIST(主题备用名称)环境变量,其中包含了 NodeMCU 的 IP 地址。

NodeMCU 的固件是从 master 分支构建而成,并启用了 MQTT 和 TLS 支持。

代码

代码上传后,在 NodeMCU 终端输入 dofile("cert.lua")。以下是该文件的内容:

print (tls.cert.verify([[
-----BEGIN CERTIFICATE-----
证书内容
-----END CERTIFICATE-----
]]))

它会打印出 'true'。

然后重启后:

function connect_to_broker()
   print ("Waiting for the broker")
   tls.cert.verify(true)
   m:connect(BROKER, BRPORT, 1, 1,
      function (client)
      print("Connected to MQTT:" .. BROKER .. ":" .. BRPORT .." as " .. CLIENTID )
      end,
   handle_connection_error
)
m:on("offline", handle_broker_offline)
end

[...]

print "Connecting to MQTT broker. Please wait..."
m = mqtt.Client( CLIENTID, MQTT_KEEPALIVE, BRUSER, BRPWD)
connect_to_broker()

结果

Mosquitto 打印如下信息:

1488542161: 新连接来自于 192.168.0.101,端口号为 8883
1488542162: OpenSSL 错误:error:140940E5:SSL routines:SSL3_READ_BYTES:ssl handshake failure
1488542162: 客户端出现 Socket 错误,断开连接。

当使用相同的证书从我的 PC 连接代理时,使用以下命令,代理接受连接并将消息传递给订阅者:

mosquitto_pub --cafile ca.crt -h 192.168.0.103 -p 8883 -t /test -m message

首先,我没有设置 IPLIST 变量。然后,我发现我的 mosquitto 版本过旧(需要支持 MQTT 3.1.1)。然后,我发现 NodeMCU 仅支持少量签名算法,因此我将其更改为 SHA256,因为我知道 SHA256 可以被支持。你有任何关于我的代码/配置有问题的想法吗?

点赞