Прохождение crt/pem с пахо

На данный момент я пытаюсь понять, как сделать публикацию MQTT, используя файлы .crt и .pem для нашего приложения.

ниже приведен псевдокод того, что я пытаюсь сделать: подключиться к существующей теме через tls, опубликовать сообщение

import paho.mqtt.publish as mqtt
import paho.mqtt.client as mqttclient  
topic = "Some/Topic/Goes/Here"
my_ca_cert = open("<path_to_cert>\ca.crt", 'rb').read()
my_pri_cert = open("<path_to_cert>\private.pem", 'rb').read()
my_key_cert = open("<path_to_cert>\certificate.pem", 'rb').read()

mqttc = mqttclient.Client("Python_Ex_Pub")
mqttc.tls_set(my_ca_cert, certfile=my_pri_cert, keyfile=my_key_cert)
mqttc.connect("<gateway_address>", 8883)
mqttc.publish(topic_name, "This is a test pub from Python.")
mqttc.loop(timeout=2.0, max_packets=1)

При запуске скрипта вылетает следующая ошибка:

Traceback (most recent call last):
  File "mqtt_pub_test.py", line 9, in <module>
    mqttc.tls_set(my_ca_cert, certfile=my_pri_cert, keyfile=my_key_cert)
  File "C:\Python27\lib\site-packages\paho\mqtt\client.py", line 557, in tls_set

    raise IOError(ca_certs+": "+err.strerror)
IOError: -----BEGIN CERTIFICATE-----
<cert_info_here>
-----END CERTIFICATE-----: No such file or directory

Я прочитал пример TLS на странице документа paho, но просто не понимаю, как я должен передавать файлы crt/pem в своем коде. В какой-то момент я указывал только на папку, содержащую файлы, и даже дошел до chmod 777 папки, но в этот момент мне отказывали в доступе от python во время выполнения.

Приветствуется любая помощь


person Lombax    schedule 08.03.2016    source источник


Ответы (2)


Вы хотите выполнить аутентификацию клиента TLS (то есть ваш скрипт Python должен пройти аутентификацию на сервере/брокере MQTT)? Или вы хотите, чтобы ваш скрипт Python вел себя как веб-браузер и просто проверял сертификат сервера?

Если вы хотите только последнее, я успешно использовал метод tls_set() в клиенте Paho Python, когда я указывал его на файл PEM, содержащий сертификат сервера. И это единственный аргумент, который вам нужно передать tls_set(), чтобы клиент Paho проверил сертификат сервера и подключился к брокеру с помощью TLS. Например:

mqttc.tls_set("/home/bob/certificates/mqttbrokercertificate.pem")

Как получить сертификат брокера mqtt в формате PEM? Самый простой способ - с openssl:

openssl s_client -host mqtt.broker.hostname.com -port 8883 -showcerts

Перенаправьте вывод в файл и удалите каждую строку в файле, кроме той, что находится между строками «BEGIN CERTIFICATE» и «END CERTIFICATE» (включительно — обязательно включите и эти строки). Это хорошая статья на StackOverflow о том, как сохранить SSL-сертификат сервера с помощью openssl:

Как сохранить SSL-сертификат сервера в файл

Наконец, вы должны быть уверены, какую версию TLS поддерживает ваш брокер, и убедиться, что ваш клиент Python также поддерживает ее. Например, для платформы IBM Watson IoT требуется TLS 1.2. Модуль ssl в Python 2.7 (построенный на openssl) не поддерживает TLS 1.2. Как правило, вам нужен Python 3.X и openssl версии не ниже 1.0.1. Вот как вы можете установить версию TLS на клиенте Paho (не забудьте импортировать ssl):

 mqttc.tls_set("/home/bob/certificates/mqttbrokercertificate.pem", tls_version=ssl.PROTOCOL_TLSv1_2)

Если вам нужна аутентификация клиента TLS, об этом, вероятно, лучше рассказать в отдельной статье. Но я надеюсь, что это поможет с аутентификацией сервера TLS с помощью клиента Paho Python.

person Henry DeAngelis    schedule 27.10.2016
comment
Нет ли способа напрямую передать доверенный путь CA в функции tls_sety, как это делается в этой команде - mosquitto_sub -h HOSTNAME -t test -p 8883 --capath /etc/ssl/certs/ -u abc -P abc ? - person Rahul Gusai; 13.08.2020

Глядя на ошибку, можно предположить, что функция tls_set ожидает передачи путей к файлам, а не содержимого файла.

person hardillb    schedule 09.03.2016
comment
Спасибо. я посмотрю - person Lombax; 09.03.2016