我在使用TLS通过MQTT从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
Certs是由带有SHA256的https://github.com/owntracks/tools/tree/master/TLS的generate-CA.sh生成的(我也尝试过MD5)。在生成证书之前,IPLIST(使用者替代名称)环境变量是使用NodeMCU的IP定义的。
NodeMCU的固件是由主分支的云构建服务构建的,启用了MQTT和TLS支持。
代码
代码上传后,我输入NodeMCU终端dofile("cert.lua")
。以下是此文件的内容:
print (tls.cert.verify([[
-----BEGIN CERTIFICATE-----
cert here
-----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: New connection from 192.168.0.101 on port 8883.
1488542162: OpenSSL Error: error:140940E5:SSL routines:SSL3_READ_BYTES:ssl handshake failure
1488542162: Socket error on client <unknown>, disconnecting.
当我使用相同的证书通过以下命令从我的PC连接到代理时,代理接受连接,并将消息传递给订阅者。
mosquitto_pub --cafile ca.crt -h 192.168.0.103 -p 8883 -t /test -m message
首先,我没有设置IPLIST变量。然后我发现我有过时的mosquittoI(需要支持MQTT 3.1.1)。然后我发现NodeMCU只支持一些签名算法,因此我将其更改为SHA256,因为我知道它是受支持的。你知道我的代码/配置有什么问题吗?