我一直在拼命想让我的MQTT客户端连接到一个MQTT代理,该代理使用来自CA的证书进行设置。 (Letsencrypt:https://pypi.python.org/pypi/letsencrypt/0.4.1)我为我的https网站使用了相同的证书,这似乎工作正常。不过,我不确定这是否有任何联系。
我已使用本指南为经纪商设置证书(http://mosquitto.org/2015/12/using-lets-encrypt-certificates-with-mosquitto/)
代理,v1.4.8似乎可以正常使用以下配置:
cafile chain.pem
certfile cert.pem
keyfile privkey.pem
[ ok ] mosquitto is running.
尝试使用调试消息连接到此代理的客户端产生:
Client mosqsub/42074-titan sending CONNECT
在我的经纪人的副本日志中,我收到了以下错误消息:
1457358950: New connection from NOT.TELLING.YOU.OBVIOUSLY on port 8883.
1457358950: OpenSSL Error: error:140760FC:SSL routines:SSL23_GET_CLIENT_HELLO:unknown protocol
1457358950: Socket error on client <unknown>, disconnecting.
我已经在广泛寻找解决方案,遗憾的是那里几乎没有什么。
任何帮助将不胜感激!谢谢!
答案 0 :(得分:2)
当我使用 tcp 作为协议而不是 ssl 时,我遇到了paho.mqtt.c MQTT客户端库的问题。
所以我不得不使用
ssl://1.2.3.4:56789
而不是
tcp://1.2.3.4:56789
此外,当使用paho.mqtt.c时,请确保您使用SSL支持链接libs,并且SSL支持的lib实际上是使用SSL支持构建的!曾经有一个缺少定义的CMake文件中的错误(OPENSSL),因此SSL库没有提供SSL支持......
答案 1 :(得分:1)
我的猜测是你没有启用TLS模式 - 你是否已将--cafile
传递给mosquitto_sub?
答案 2 :(得分:1)
这对我来说只是为了测试一个简单的安全发布订阅。
我使用https://github.com/owntracks/tools/blob/master/TLS/generate-CA.sh来生成证书(在/ share / mosquitto中),很简单:
generate-CA.sh
我使用以下命令配置了mosquitto.conf(包括完整日志记录):
log_dest文件/var/log/mosquitto.log
log_type全部
cafile /share/mosquitto/ca.crt
certfile /share/mosquitto/localhost.crt
密钥文件/share/mosquitto/localhost.key
我订阅了(启用调试):
mosquitto_sub -h本地主机-t测试-p 8883-不安全-d --cafile /share/mosquitto/ca.crt
我发表于:
mosquitto_pub -h本地主机-t test -p 8883 --cafile /share/mosquitto/ca.crt -m“ Hi”-不安全
答案 3 :(得分:0)
我最近在我的一位Cloud mosquitto经纪人上开始遇到此问题。
我使用python客户端从另一个VPS连接到此代理,并且我正在使用paho.mqtt.client
Python库。
一切正常,直到一天晴朗,一切都崩溃了。原因可能是定期更新或其他内容,但突然开始给我握手错误和OP中提到的完全相同的错误。
Client connection from AREA51 failed: error:140760FC:SSL routines:SSL23_GET_CLIENT_HELLO:unknown protocol.
在python客户端上,我正在使用transport = tcp并使用tls连接到安全的MQTT端口。较早之前,这工作正常。遇到此问题后,我已将Openssl更新到最新版本,但无法解决此问题。
我的问题是我的经纪人允许所有其他客户端的所有ssl / tcp和websocket连接。甚至相同的Python代码在我的本地计算机上都可以正常工作。
很明显,其他VPS(客户端)上的传输机制出了问题
利用Python MQTT库,我发现我们可以尝试更改传输机制。
因此只需将客户端代码更改为:
client = mqtt.Client(transport="websockets")
先前是:
client = mqtt.Client(transport="tcp")
解决了我的问题。 我确实必须更改运行安全websocket的连接端口。
我希望这可以帮助处于类似情况的人。