Я пытаюсь подключить python клиента (paho-mqtt 1.5.0
) к москитному брокеру (самозаверяющий сертификат). Подключение с использованием MQTT.fx с сертификатами TLS работает. Но когда я попытался подключиться, используя python клиент с этим кодом ( полный код )
mqtt_client.username_pw_set(mqtt_username, password=mqtt_password)
mqtt_client.on_connect = on_connect
mqtt_client.on_publish = on_publish
mqtt_client.tls_set(ca_certs=TLS_CA_CERT, certfile=TLS_CLIENT_CERT,
keyfile=TLS_CLIENT_KEY, cert_reqs=ssl.CERT_REQUIRED,
tls_version=ssl.PROTOCOL_TLSv1_2, ciphers=None)
mqtt_client.tls_insecure_set(False)
mqtt_client.connect(broker_endpoint, port=port)
mqtt_client.loop_start()
, я получил следующую ошибку
Traceback (most recent call last):
File "device.py", line 99, in <module>
main()
File "device.py", line 88, in main
if not connect(mqtt_client, MQTT_USERNAME,
File "device.py", line 55, in connect
mqtt_client.connect(broker_endpoint, port=port)
File "/usr/local/lib/python3.8/site-packages/paho/mqtt/client.py", line 937, in connect
return self.reconnect()
File "/usr/local/lib/python3.8/site-packages/paho/mqtt/client.py", line 1100, in reconnect
sock.do_handshake()
File "/usr/local/lib/python3.8/ssl.py", line 1309, in do_handshake
self._sslobj.do_handshake()
ssl.SSLCertVerificationError: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: self signed certificate (_ssl.c:1108)
Журналы от брокера
1586374114: New connection from 20.4.32.278 on port 8883.
1586374114: OpenSSL Error[0]: error:14035418:SSL routines:ACCEPT_SR_CERT:tlsv1 alert unknown ca
1586374114: OpenSSL Error[1]: error:140350E5:SSL routines:ACCEPT_SR_CERT:ssl handshake failure
1586374114: Socket error on client <unknown>, disconnecting.
В соответствии с этой проблемой я изменил свой код
mqtt_client.tls_set(ca_certs=TLS_CA_CERT, certfile=TLS_CLIENT_CERT,
keyfile=TLS_CLIENT_KEY, cert_reqs=ssl.CERT_NONE,
tls_version=ssl.PROTOCOL_TLSv1_2, ciphers=None)
mqtt_client.tls_insecure_set(True)
С этим я могу подключиться к брокеру. Но первая попытка сценария завершается неудачно с
Traceback (most recent call last):
File "device.py", line 99, in <module>
main()
File "device.py", line 88, in main
if not connect(mqtt_client, MQTT_USERNAME,
File "device.py", line 55, in connect
mqtt_client.connect(broker_endpoint, port=port)
File "/usr/local/lib/python3.8/site-packages/paho/mqtt/client.py", line 937, in connect
return self.reconnect()
File "/usr/local/lib/python3.8/site-packages/paho/mqtt/client.py", line 1100, in reconnect
sock.do_handshake()
File "/usr/local/lib/python3.8/ssl.py", line 1309, in do_handshake
self._sslobj.do_handshake()
OSError: [Errno 0] Error
Я вижу эту ошибку на стороне посредника
1586379530: New connection from 20.4.32.278 on port 1883.
1586379530: Client <unknown> disconnected due to protocol error.
Вторая попытка сценария без изменений работает и клиент подключается к порту
1586379710: New connection from 20.4.32.278 on port 8883.
1586379710: New client connected from 20.4.32.278 as auto-697CC441-83F5-7F50-6DF8-E85F96DEA1D7 (p2, c1, k60, u'.device.dev.lightcloud.com').
Попытка понять, почему клиент подключается к порту 1883
в первый раз и терпит неудачу, затем подключается к порту 8883
во второй раз и успешно.
с cert_reqs=ssl.CERT_NONE
& tls_insecure_set(True)
клиент будет иметь полную страховую связь с брокером? Безопасно ли использовать его в непроизводственной среде?