2017-09-08 3 views
1

J'ai un problème avec Python (je suis un python noob et je l'apprends). J'ai utilisé la version 2.7.9 sur un système Debian 9. J'ai installé le paquetage paho et tinkerforge en python.MQTT PAHO [CERTIFICATE_VERIFY_FAILED]

J'ai développé un script en utilisant le client Paho MQTT pour connecter mon courtier mosquitto. Je veux utiliser une connexion cryptée. Ma connexion fonctionne correctement lorsqu'elle n'est pas cryptée mais échoue lorsqu'elle est cryptée. Les travaux de connexion bien cryptée sur openHAB (MQTT-abonné) et MQTTFX (MQTT-abonné et producteur)

J'utilise ces paramètres pour mon script:

self.client = mqtt.Client() 
self.client.tls_set("/home/pi/ca-cert.pem","/home/pi/IWILR1-1-cert.pem","/home/pi/IWILR1-1.pem",tls_version=ssl.PROTOCOL_TLSv1) 
# disables peer verification 
self.client.tls_insecure_set(False) 
    self.client.on_connect = self.mqtt_on_connect 
    self.client.on_disconnect = self.mqtt_on_disconnect 
self.client.on_message = self.mqtt_on_message 

    self.device_proxies = {} 
    self.device_proxy_classes = {} 

    for subclass in DeviceProxy.subclasses(): 
     self.device_proxy_classes[subclass.DEVICE_CLASS.DEVICE_IDENTIFIER] = subclass 

def connect(self): 
    if self.broker_username is not None: 
     self.client.username_pw_set(self.broker_username, self.broker_password) 

    self.client.connect(self.broker_host, self.broker_port) 
    self.client.loop_start() 

Mais maintenant, le problème est l'erreur Python.

sudo python /home/pi/brick-mqtt-proxy.py 
Traceback (most recent call last): 
    File "/home/pi/brick-mqtt-proxy.py", line 1250, in <module> 
    proxy.connect() 
    File "/home/pi/brick-mqtt-proxy.py", line 1109, in connect 
    self.client.connect(self.broker_host, self.broker_port) 
    File "/usr/local/lib/python2.7/dist-packages/paho/mqtt/client.py", line 760, in connect 
    return self.reconnect() 
    File "/usr/local/lib/python2.7/dist-packages/paho/mqtt/client.py", line 919, in reconnect 
    sock.do_handshake() 
    File "/usr/lib/python2.7/ssl.py", line 840, in do_handshake 
    self._sslobj.do_handshake() 
ssl.SSLError: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:661) 

et à mosquitto ces erreurs sont arrivées.

1504896114: New connection from 143.93.197.20 on port 8883. 
1504896114: OpenSSL Error: error:14094418:SSL routines:SSL3_READ_BYTES:tlsv1 alert unknown ca 
1504896114: OpenSSL Error: error:140940E5:SSL routines:SSL3_READ_BYTES:ssl handshake failure 
1504896114: Socket error on client <unknown>, disconnecting. 

mosquitto conf

# Place your local configuration in /etc/mosquitto/conf.d/ 
# 
# A full description of the configuration file is at 
# /usr/share/doc/mosquitto/examples/mosquitto.conf.example 


pid_file /var/run/mosquitto.pid 

persistence true 
persistence_location /var/lib/mosquitto/ 


log_type all 
log_facility 5 
log_timestamp true 
log_dest file /var/log/mosquitto/mosquitto.log 

include_dir /etc/mosquitto/conf.d 

port 8883 
cafile /etc/mosquitto/ca_certificates/ca-cert.pem 
certfile /etc/mosquitto/certs/server-cert.pem 
keyfile /etc/mosquitto/certs/server-key.pem 

seul serveur et Ca correspondent au nom d'hôte de courtier. Le client utilise son propre nom d'hôte pour le CN. J'espère que c'est vrai?

J'espère que vous pouvez m'aider à résoudre mon problème. PS: J'ai utilisé un certificat auto-signé! TLS Version 1.2

+0

Modifiez la question pour inclure mosquitto.conf afin que nous puissions voir comment vous l'avez configuré. Est-ce que le certificat CN correspond au nom d'hôte du courtier? – hardillb

+0

Seul le serveur et Ca correspondaient au nom d'hôte du courtier. Le client utilise son propre nom d'hôte pour CN – ZPascal

Répondre

0

Si vous utilisez TLS v1.2 vous devez modifier l'expression (2ème ligne: self.client.tls_set()) '= tls_version ssl.PROTOCOL_TLSv1' à 'tls_version = ssl.PROTOCOL_TLSv1_2', non comme prévu de ... TLSv1.2. Cela a fonctionné pour moi.