带有 SSL "Connection reset by peer" 错误的 MQTT
MQTT with SSL "Connection reset by peer" error
我正在使用 Raspberry Pi 向 VPS 中的 MQTT 代理发布消息。我使用了 python paho-mqtt 脚本并得到了这个错误:
Traceback (most recent call last):
File "mqttpub5.py", line 14, in <module>
client.connect("mydomain.com",8883,60)
File "/usr/local/lib/python3.4/dist-packages/paho/mqtt/client.py", line 839, in connect
return self.reconnect()
File "/usr/local/lib/python3.4/dist-packages/paho/mqtt/client.py", line 994, in reconnect
sock.do_handshake()
File "/usr/lib/python3.4/ssl.py", line 804, in do_handshake
self._sslobj.do_handshake()
ConnectionResetError: [Errno 104] Connection reset by peer
这是我的python脚本
#!/usr/bin/env python3
import paho.mqtt.client as mqtt
import time
def on_connect(client, userdata, flags, rc):
print("Connected("+str(rc)+"). Publishing Message...")
client = mqtt.Client()
client.username_pw_set("myusername","mypassword")
client.tls_set("/etc/ssl/certs/ca-bundle.crt")
client.tls_insecure_set(True)
client.connect("mydomain.com",8883,60)
client.on_connect = on_connect
client.loop_start()
count=0
while count<20:
count=count+1
client.publish("test","test no."+str(count))
time.sleep(1)
print("Message Published")
client.disconnect()
我以为是证书问题,但是当我使用这个命令发布时:
mosquitto_pub -h mydomain.com -t test -u myusername -P mypassword --cafile /etc/ssl/certs/ca-bundle.crt -p 8883 -m message
消息发布没有问题。
我在 VPS
中使用 Let's Encrypt
这是当我 运行 来自我的 Pi 的脚本时来自代理的日志:
1573442272: mosquitto version 1.6.7 starting
1573442272: Config loaded from /etc/mosquitto/mosquitto.conf.
1573442272: Opening ipv6 listen socket on port 1883.
1573442272: Opening ipv4 listen socket on port 1883.
1573442272: Opening ipv4 listen socket on port 8883.
1573442272: Opening ipv6 listen socket on port 8883.
1573442272: Opening websockets listen socket on port 8083.
1573442281: New connection from xx.xx.xx.xxx on port 8883.
1573442281: OpenSSL Error: error:140760FC:SSL routines:SSL23_GET_CLIENT_HELLO:unknown protocol
1573442281: Socket error on client <unknown>, disconnecting.
我在另一台计算机上使用了相同的脚本,它运行没有问题。
如有任何帮助,我们将不胜感激。谢谢
看来解决方案只是升级。当错误出现时,我有 Raspbian Jessie 和 Mosquitto 版本 1.3.4。我将 Raspbian 升级到 Stretch with Mosquitto 版本 1.4.10,问题消失了
对我有用的解决方案是在 tls_set() 中设置 TLS 版本:
`
import time
import paho.mqtt.client as paho
import ssl
#define callbacks
def on_message(client, userdata, message):
print("received message =",str(message.payload.decode("utf-8")))
def on_log(client, userdata, level, buf):
print("log: ",buf)
def on_connect(client, userdata, flags, rc):
print("publishing ")
client.publish("topic1","message")
client=paho.Client()
client.on_message=on_message
client.on_log=on_log
client.on_connect=on_connect
print("connecting to broker")
client.tls_set("/home/admin/certs/server_iot.crt", tls_version=ssl.PROTOCOL_TLSv1_2)
client.tls_insecure_set(True)
client.connect("iot.eclipse.org", 8883, 60)
##start loop to process received messages
client.loop_start()
#wait to allow publish and logging and exit
time.sleep(1)
我正在使用 Raspberry Pi 向 VPS 中的 MQTT 代理发布消息。我使用了 python paho-mqtt 脚本并得到了这个错误:
Traceback (most recent call last):
File "mqttpub5.py", line 14, in <module>
client.connect("mydomain.com",8883,60)
File "/usr/local/lib/python3.4/dist-packages/paho/mqtt/client.py", line 839, in connect
return self.reconnect()
File "/usr/local/lib/python3.4/dist-packages/paho/mqtt/client.py", line 994, in reconnect
sock.do_handshake()
File "/usr/lib/python3.4/ssl.py", line 804, in do_handshake
self._sslobj.do_handshake()
ConnectionResetError: [Errno 104] Connection reset by peer
这是我的python脚本
#!/usr/bin/env python3
import paho.mqtt.client as mqtt
import time
def on_connect(client, userdata, flags, rc):
print("Connected("+str(rc)+"). Publishing Message...")
client = mqtt.Client()
client.username_pw_set("myusername","mypassword")
client.tls_set("/etc/ssl/certs/ca-bundle.crt")
client.tls_insecure_set(True)
client.connect("mydomain.com",8883,60)
client.on_connect = on_connect
client.loop_start()
count=0
while count<20:
count=count+1
client.publish("test","test no."+str(count))
time.sleep(1)
print("Message Published")
client.disconnect()
我以为是证书问题,但是当我使用这个命令发布时:
mosquitto_pub -h mydomain.com -t test -u myusername -P mypassword --cafile /etc/ssl/certs/ca-bundle.crt -p 8883 -m message
消息发布没有问题。 我在 VPS
中使用 Let's Encrypt这是当我 运行 来自我的 Pi 的脚本时来自代理的日志:
1573442272: mosquitto version 1.6.7 starting
1573442272: Config loaded from /etc/mosquitto/mosquitto.conf.
1573442272: Opening ipv6 listen socket on port 1883.
1573442272: Opening ipv4 listen socket on port 1883.
1573442272: Opening ipv4 listen socket on port 8883.
1573442272: Opening ipv6 listen socket on port 8883.
1573442272: Opening websockets listen socket on port 8083.
1573442281: New connection from xx.xx.xx.xxx on port 8883.
1573442281: OpenSSL Error: error:140760FC:SSL routines:SSL23_GET_CLIENT_HELLO:unknown protocol
1573442281: Socket error on client <unknown>, disconnecting.
我在另一台计算机上使用了相同的脚本,它运行没有问题。
如有任何帮助,我们将不胜感激。谢谢
看来解决方案只是升级。当错误出现时,我有 Raspbian Jessie 和 Mosquitto 版本 1.3.4。我将 Raspbian 升级到 Stretch with Mosquitto 版本 1.4.10,问题消失了
对我有用的解决方案是在 tls_set() 中设置 TLS 版本: `
import time
import paho.mqtt.client as paho
import ssl
#define callbacks
def on_message(client, userdata, message):
print("received message =",str(message.payload.decode("utf-8")))
def on_log(client, userdata, level, buf):
print("log: ",buf)
def on_connect(client, userdata, flags, rc):
print("publishing ")
client.publish("topic1","message")
client=paho.Client()
client.on_message=on_message
client.on_log=on_log
client.on_connect=on_connect
print("connecting to broker")
client.tls_set("/home/admin/certs/server_iot.crt", tls_version=ssl.PROTOCOL_TLSv1_2)
client.tls_insecure_set(True)
client.connect("iot.eclipse.org", 8883, 60)
##start loop to process received messages
client.loop_start()
#wait to allow publish and logging and exit
time.sleep(1)