MQTT Bridge with SSL

Добрый день!
Помогите пожалуйста с конфигурацией MQTT моста.

Есть удаленный брокер mosquitto в облаке (с ним работает Home Assistant). Вот его конфиг:

listener 1883
allow_anonymous false
password_file /etc/mosquitto/passwd

listener 8883
cafile /etc/mosquitto/certs/mydomainname.ru/chain.pem
keyfile /etc/mosquitto/certs/mydomainname.ru/privkey.pem
certfile /etc/mosquitto/certs/mydomainname.ru/cert.pem

На этом участке у меня нет никаких проблем, сертификаты от Let’s Encrypt поддерживают не только SSL mosquitto, но и HTTPS для Home Assistant.

Далее я пробую подключиться к этому брокеру с помощью MQTT Explorer - подключение проходит, сообщения вижу, авторизация по логину/паролю. Единственный момент - в MQTT Explorer мне приходится снять галочку Validate Certificate. Ну ок, в mosquitto это решается с помощью --insecure.

Пробую подключиться из консоли WirenBoard:

mosquitto_sub -h mydomainname.ru -p 8883 -i testid -u username -P password -t /devices/buzzer/controls/enabled/on --insecure

Подключение происходит, поучаю сообщения и от Home Assistant, и от MQTT Explorer - все в полном порядке. Пробую отправить сообщение:

mosquitto_pub -h mydomainname.ru -p 8883 -i testid -u username -P password -t /devices/buzzer/controls/enabled/on --insecure -m 1

Все отлично доходит. То есть связь работает корректно, все максимально протестировано. Далее настраиваю на стороне WirenBoard мост. Содержимое конфига /etc/mosquitto/mosquitto.conf

pid_file /run/mosquitto/mosquitto.pid

persistence true
persistence_location /var/lib/mosquitto/

log_dest file /var/log/mosquitto/mosquitto.log

include_dir /etc/mosquitto/conf.d

connection wb_ha
address mydomainname.ru:8883
remote_username username
remote_password password
clientid testid
try_private false
start_type automatic
topic # both
bridge_insecure true

Свою маленькую проблему с --insecure здесь я решаю с помощью bridge_insecure true. Перезапускаю mosquitto - все запустилось нормально, но мост не работает. Ни в одну, ни в другую сторону. Сообщения не идут.

Проблема кроется именно в SSL, потому что если в конфиге WirenBoard я меняю адрес порта с 8883 на 1883 (как видно из самого первого конфига, облачный mosquitto прослушивает два порта - 1883 без SSL и 8883 с SSL), то все работает отлично. Но не безопасно.

Смущает тот факт, что с текущими настройками SSL у меня видимо все в порядке, ведь от лица WirenBoard корректно отрабатывают команды mosquitto_sub/mosquitto_pub на порту 8883, а вот мост на этот порт видимо настроен не корректно.

Добрый день.
Какой брокер (версия) на контроллере? В релизах до 2304 - стоит mosquitto 1 версии.

Вот это прочитано? Не вижу ca.crt в конфиге.

Добрый день!
Версию брокера к сожалению сейчас посмотреть нет возможности.

Предложенную вами статью я читал. ca.crt на стороне клиента требуется в случае, если авторизация предполагается по сертификату. Я же хочу от SSL только шифрование, а авторизация может пройти средствами MQTT. В этом случае клиенту не нужен сертификат.

Прошу обратить внимание на то, что из консоли Wiren Board работает команда

mosquitto_sub -h mydomainname.ru -p 8883 -i testid -u username -P password -t /devices/buzzer/controls/enabled/on --insecure

Здесь происходит подключение к порту с SSL, но при этом нет параметра --cafile, задающего путь к файлу клиентского сертификата, авторизация производится средствами MQTT с помощью логина и пароля.
Так же на этот адрес:порт можно подключиться с помощью MQTT Explorer, указав логин, пароль и установив галочку на использование TLS. Без каких-либо сертификатов.

То есть сервер у меня легко работает с подключениями, где SSL обеспечивает только шифрование, а авторизация производится средствами MQTT. И клиент из консоли тоже подключается по этим правилам. Но вот мост на стороне клиента не конфигурируется.

Было бы очень странно, если бы инструменты, работающие из консоли (mosquitto_sub), поддерживали бы такой вариант работы, а в конфигурации моста такой функционал бы отсутствовал.

Я, к сожаленю такого не делал. Доступ по сертификату - да.
Запланирую себе попробовать настроить стенд и проверить.

Я разобрался в чем была проблема.

Нашел в описании файла конфигурации ( mosquitto.conf man page | Eclipse Mosquitto ) следующую фразу:

One of bridge_capath or bridge_cafile must be provided to allow SSL/TLS support.

Таким образом, проблема решается добавлением в конфиг клиента следующей строки:

bridge_capath /etc/ssl/certs

Забавно, что тут я указываю фактически путь к сертификатам по умолчанию, и при использовании команды mosquitto_sub по идее используется тоже этот путь к системным сертификатам, но при этом команда mosquitto_sub не требует параметра --capath для включения TLS.
В мануале на mosquitto_sub ( mosquitto_sub man page | Eclipse Mosquitto ) так и сказано:

Alternatively, if the -p 8883 option is used then the OS provided certificates will be loaded and neither --cafile or --capath are needed

То есть чтобы включилось TLS в mosquitto_sub достаточно указать порт 8883, а чтобы включилось TLS в конфигурации моста, нужно обязательно добавить bridge_capath, даже если никакой особый путь к сертификатам системы по факту не требуется. Вот такие нюансы выяснились…

В общем, вопрос закрыт, спасибо за оперативные ответы!

1 лайк

Эта тема была автоматически закрыта через 7 дней после последнего ответа. В ней больше нельзя отвечать.