Ошибка проверки MQTT через TLS в Python (нет ошибок в C # и Mqtt.fx) - PullRequest
0 голосов
/ 25 октября 2018

У меня есть сервер Mosquitto, настроенный для использования MQTT поверх TLS, с использованием следующей конфигурации, с сертификатами и ключами, сгенерированными с помощью certbot:

user mosquitto
listener 1883 localhost
listener 8883
cafile /etc/letsencrypt/live/my.mqtt.domain/chain.pem
keyfile /etc/letsencrypt/live/my.mqtt.domain/privkey.pem
certfile /etc/letsencrypt/live/my.mqtt.domain/cert.pem

У меня проблемы с клиентом pyho python и mosquitto-клиенты (mosquitto_sub и mosquitto_pub), в то время как у меня нет никаких проблем при использовании клиента M2MQTT в C # или MQTT.fx клиент GUI (который использует клиент Paho Java).

Ниже приведен мой код Python:

import paho.mqtt.client as mqtt
import ssl

client = mqtt.Client()
client.on_connect = on_connect
client.on_message = on_message

# chain.pem is the exact same file of the mosquitto configuration 
# /etc/letsencrypt/live/my.mqtt.domain/chain.pem
client.tls_set(ca_certs="chain.pem", certfile=None, keyfile=None,
               cert_reqs=ssl.CERT_REQUIRED, tls_version=ssl.PROTOCOL_TLSv1_2, ciphers=None)

client.connect("my.mqtt.domain", 8883, 60)

И вот ошибка, которую я получаю при попытке запустить этот код:

Traceback (most recent call last):
  File "subscriber.py", line 26, in <module>
    client.connect("my.mqtt.domain", 8883, 60)
  File "venv\lib\site-packages\paho\mqtt\client.py", line 839, in connect
    return self.reconnect()
  File "\venv\lib\site-packages\paho\mqtt\client.py", line 994, in reconnect
    sock.do_handshake()
  File "C:\Program Files\Python3\lib\ssl.py", line 1108, in do_handshake
    self._sslobj.do_handshake()
ssl.SSLCertVerificationError: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get issuer certificate (_ssl.c:1045)

в то время как на стороне сервера я получаю следующее:

1540452676: OpenSSL Error: error:14094418:SSL routines:ssl3_read_bytes:tlsv1 alert unknown ca
1540452676: OpenSSL Error: error:140940E5:SSL routines:ssl3_read_bytes:ssl handshake failure

Я быЯ думал о серверной стороне ошибки конфигурации, но если я пытаюсь использовать клиент C # с M2MQTT, у меня не возникает никаких проблем:

MqttClient client = new MqttClient("my.mqtt.domain", 
    MqttSettings.MQTT_BROKER_DEFAULT_SSL_PORT, 
    true, 
    new X509Certificate("chain.pem"), 
    null, 
    MqttSslProtocols.TLSv1_2);

byte code = client.Connect(new Guid().ToString());

Console.WriteLine(code);
var message = "message";
client.Publish("test", Encoding.UTF8.GetBytes(message), 2, true);

и, тем не менее, никаких проблем с Mqtt.fx:

Mqtt.fx client configuration

Все равно попытка

openssl s_client -connect my.mqtt.domain:8883 -CAfile /etc/letsencrypt/live/my.mqtt.domain/chain.pem

работает нормально, без ошибки и код возврата 0 дляпроверка.

Любая помощь приветствуется.

1 Ответ

0 голосов
/ 25 октября 2018

сертификат имеет какую-то ошибку;Возможно, Python делает строгую проверку

, когда вы используете openssl s_client, вы расшифровали все сообщения, которые повторил s_client.У меня возникли некоторые проблемы с тестовым ssl-соединением, в конце концов я обнаружил, что сертификат имеет неправильное время, например «не до» или «не после» и т. Д.,

...