Paho-MQTT подключается к брокеру с собственной подписью - PullRequest
0 голосов
/ 08 апреля 2020

Я пытаюсь подключить 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) клиент будет иметь полную страховую связь с брокером? Безопасно ли использовать его в непроизводственной среде?

...