У меня есть сервер 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:
Все равно попытка
openssl s_client -connect my.mqtt.domain:8883 -CAfile /etc/letsencrypt/live/my.mqtt.domain/chain.pem
работает нормально, без ошибки и код возврата 0 дляпроверка.
Любая помощь приветствуется.