2017-09-08 10 views
1

파이썬에 문제가 있습니다. (저는 파이썬 놈이고 그것을 배우고 있습니다.) 데비안 9 시스템에서 2.7.9 버전을 사용했습니다. 파이썬으로 paho와 tinkerforge 패키지를 설치했다.MQTT PAHO [CERTIFICATE_VERIFY_FAILED]

Paho MQTT 클라이언트를 사용하여 mosquitto 브로커를 연결하는 스크립트를 개발했습니다. 나는 암호로 고쳐 쓴 연결을 사용하고 싶다. 내 연결은 암호화되지 않았을 때 잘 동작하지만 암호화되면 실패합니다. 미세 openHAB (MQTT 구독자) 및 MQTTFX (MQTT 구독자 및 프로듀서)에 암호화 된 연결 작업

나는이 내 스크립트에 대한 매개 변수를 사용하고 있습니다 :

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() 

그러나 지금 문제에 오류가 파이썬.

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) 

이러한 오류가 발생했습니다.

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 

만 서버와 CA는 브로커의 호스트 이름을 일치. 클라이언트가 CN의 호스트 이름을 사용합니다. 나는 그것이 바랄 것이기를 바란다?

내 문제를 해결하는 데 도움이되기를 바랍니다.

추신 : 자체 서명 된 인증서를 사용했습니다. TLS 버전 1.2

+0

mosquitto.conf를 포함하도록 질문을 편집하여 구성 방법을 볼 수 있습니다. 인증서 CN이 브로커의 호스트 이름과 일치합니까? – hardillb

+0

서버와 Ca 만 브로커 호스트 이름과 일치했습니다. 클라이언트가 CN 용 호스트 이름을 사용합니다. – ZPascal

답변

0

TLS v1.2를 사용하는 경우 식 (두 번째 줄 : self.client.tls_set()) 'tls_version = ssl.PROTOCOL_TLSv1'을 'tls_version = ssl.PROTOCOL_TLSv1_2'로 수정해야합니다. 예상대로 ... TLSv1.2. 이것은 나를 위해 일했다.