Проблемы с использованием клиента Paho MQTT с Python 3.7 - PullRequest
0 голосов
/ 17 октября 2018

Я использую следующий код для подключения к серверу mqtt.

import paho.mqtt.client as mqtt
import ssl
import uuid

client = mqtt.Client(str(uuid.uuid1()))
client.tls_set(
    "ca.crt",
    "client.crt",
    "client.key",
    cert_reqs=ssl.CERT_REQUIRED,
    tls_version=ssl.PROTOCOL_TLSv1
)
client.connect(
    "127.0.0.1",
    8883,
)
client.loop_forever()

Этот код отлично работает с версией python2.7.Но когда я запускаю его с версией python3.7, я получаю следующую ошибку:

Traceback (most recent call last):
  File "test.py", line 29, in <module>
    8883,
  File "virtualenvs/mqtt-xG2h6zri/lib/python3.7/site-packages/paho/mqtt/client.py", line 839, in connect
    return self.reconnect()
  File "mqtt-xG2h6zri/lib/python3.7/site-packages/paho/mqtt/client.py", line 994, in reconnect
    sock.do_handshake()
  File ".pyenv/versions/3.7.0/lib/python3.7/ssl.py", line 1108, in do_handshake
    self._sslobj.do_handshake()
ssl.SSLCertVerificationError: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: IP address mismatch, certificate is not valid for '127.0.0.1'. (_ssl.c:1045)

Пожалуйста, помогите мне разобраться, как заставить это работать в python 3.7.

1 Ответ

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

Найден ответ.

На самом деле, согласно эта ссылка, сопоставляющая IP-адрес сервера с полем сертификата CN, считается устаревшей более 15 лет.Но версии Python ниже 3.7 все еще позволяют это, даже если это устарело.Поэтому мне пришлось создать сертификат с IP-адресом сервера, добавленным в поле SAN.

Создание сертификатов с полями SAN объясняется в этом ответе.Но решение в ответе использует доменные имена.Если вы создаете сертификаты с IP-адресом, используйте эту команду для создания сертификата вместо команды в этом ответе.

openssl x509 -req -in server.csr \
        -extfile <(printf "subjectAltName=IP:127.0.0.1") \
        -CA ca.crt \
        -CAkey ca.key \
        -CAcreateserial -out server.crt \
        -days 365

После использования этих сертификатов ошибка устранена.

...