Mqtts:// erreur tls

Version de Jeedom : 4.2.21
Version du plugin : 2022-10-16 01:01:21

Bonjour,

En configurant la connexion à un broker distant en TLS, j’ai eu les erreurs suivantes :

  • dans jMQTTd :
0464|[2022-10-23 08:02:06,702][ERROR] Client335       MainThread           start() : Fatal TLS Certificate import Exception, this connection will most likely fail!
0465|Traceback (most recent call last):
0466|File "/var/www/html/plugins/jMQTT/resources/jmqttd/jMqttClient.py", line 161, in start
0467|self.mqttclient.tls_set(ca_certs=ca.name, certfile=cert.name, keyfile=key.name)
0468|File "/var/www/html/plugins/jMQTT/resources/jmqttd/venv/lib/python3.7/site-packages/paho/mqtt/client.py", line 796, in tls_set
0469|context.load_cert_chain(certfile, keyfile, keyfile_password)
0470|ssl.SSLError: [SSL] PEM lib (_ssl.c:3824)
0471|[2022-10-23 08:02:06,725][ERROR] Client335       Brk335Th     on_disconnect() : Unexpected disconnection from broker!
0472|[2022-10-23 08:02:11,749][ERROR] Client335       Brk335Th     on_disconnect() : Unexpected disconnection from broker!
0473|[2022-10-23 08:02:21,772][ERROR] Client335       Brk335Th     on_disconnect() : Unexpected disconnection from broker!
  • côté broker :
1666504921: New connection from xx.xx.xx.xx:15329 on port 8883.
1666504921: OpenSSL Error[0]: error:1408F10B:SSL routines:ssl3_get_record:wrong version number
1666504921: Client <unknown> disconnected: Protocol error.

La configuration du broker :

En regardant le code et spécifiquement /var/www/html/plugins/jMQTT/resources/jmqttd/jMqttClient.py, j’ai l’impression que si on met mqtts comme protocole, ça implique un certificat client (ce qui ne doit pas être le cas) :

if self.message['proto'] == 'mqtts':
                        try:
                                ca = NamedTemporaryFile(delete=False)
                                ca.write(str.encode(self.message['tlsca']))
                                ca.close()
                                cert = NamedTemporaryFile(delete=False)
                                cert.write(str.encode(self.message['tlsclicert']))
                                cert.close()
                                key = NamedTemporaryFile(delete=False)
                                key.write(str.encode(self.message['tlsclikey']))
                                key.close()
                                self.mqttclient.tls_set(ca_certs=ca.name, certfile=cert.name, keyfile=key.name)
                                self.mqttclient.tls_insecure_set(('tlsinsecure' in self.message) and self.message['tlsinsecure'])
                                unlink(ca.name)
                                unlink(cert.name)
                                unlink(key.name)
                        except:
                                self._log.exception('Fatal TLS Certificate import Exception, this connection will most likely fail!')
                       

En attendant, j’ai remplacé (dans le code ci-dessus) la ligne :
self.mqttclient.tls_set(ca_certs=ca.name, certfile=cert.name, keyfile=key.name)
par
self.mqttclient.tls_set(certfile=None, keyfile=None,cert_reqs=ssl.CERT_REQUIRED) (ajouter l’import du module ssl)

et la connexion via mqtts fontionne

Hello @tomdom,

Belle prise !
Et Merci pour l’analyse claire et détaillée ! :+1: :+1: :+1:

Est-ce que ça fonctionnait pour toi avant la version « 2022-10-16 01:01:21 » de jMQTT ?
Mais il me semble qu’on a toujours forcé l’utilisation des certificats client si MQTTS est activé.

Je regarde pour corriger, c’est pas trop compliqué.
Par contre, j’avais prévu une nouvelle version d’ici demain/après-demain (avec notamment avec le support du transport WS/WSS si ca peut aussi t’intéresser), ce sera certainement dans celle-ci.

Bad

Hello,

Merci pour cette prise en compte rapide :slight_smile:

Je n’avais pas testé avant cette version. Je viens juste de mettre en place le nouveau broker.

Je testerais la nouvelle version quand elle sera dispo :wink:
Concernant le support de ws/wss, j’allais le suggérer (j’avais mis le broker en mode websocket derrière un reverse proxy avant de m’apercevoir que le plugin ne le supportait pas :upside_down_face:)

Bon courage

Petit teasing :

Ce sujet a été automatiquement fermé après 24 heures suivant le dernier commentaire. Aucune réponse n’est permise dorénavant.