По мротивам https://www.onetransistor.eu/2019/05/mosquitto-mqtt-tls-certificate.html + доку на бридж mosquitto
Введение
Авторизация по логину паролю интернет устройств не очень безопасна, но очень просто программируется в них. Ососбенно в интернет розетках. Поэтому идея такая. На рапспберри пи (или любом мелком компе) поднимаем mosquitto с авторизацией по логину\парлю, а дальше делаем бридж в натсоящий mosquitto по tls (авторизация на основе сертификатов). Внутренний mosquitto недоступен извне, логины летают только внутри локальной сети, а внешний коннект в центральный mosquitto защищен.
Делаем ca.crt
openssl req -new -x509 -days 365 -extensions v3_ca -keyout ca.key -out ca.crt -subj "/C=RO/ST=Home/L=Home/O=OneTransistor/OU=OneTransistor/CN=onetransistor.eu"
На сервере
openssl genrsa -out server.key 2048
openssl req -new -out server.csr -key server.key -subj "/C=RO/ST=H/L=Home/O=MQTT Broker/OU=MQTT Broker/CN=mqtt-broker.lan"
Нам понадобиться ca.crt ca.key с сервер, я их забираю командой scp
scp -P port user@host:/home/pi/ca/ca.crt ./
scp -P port user@host:/home/pi/ca/ca.key ./
openssl x509 -req -in server.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out server.crt -days 365
openssl rsa -in server.key -out server.key
На каждом клиенте
openssl genrsa -out client.key 2048
openssl req -new -out client.csr -key client.key -subj "/C=RO/ST=H/L=Home/O=MQTT Client/OU=MQTT Client/CN=Thing01"
openssl x509 -req -in client.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out client.crt -days 365
openssl rsa -in client.key -out client.key
Mosquitto на сервере
Делаем /etc/mosquitto/conf.d/mosquitto.conf
# Certificate listener
listener 8883
cafile /etc/mosquitto/ca.crt
certfile /etc/mosquitto/server.crt
keyfile /etc/mosquitto/server.key
require_certificate true
use_identity_as_username true
Mosquitto на клиенте
Копируем в /etc/mosquitto/ca_certificates сделанные файлы
ca.crt client.crt client.key
присваеваем владельца mosquitto
sudo chown mosquitto /etc/mosquitto/ca_certificates/*
Делаем файл
/etc/mosquitto/conf.d/bridge.conf
allow_anonymous false
password_file /etc/mosquitto/passwd
connection local_remote
address ns.lab240.ru:8883
topic /donoff/# both
bridge_cafile /etc/mosquitto/ca_certificates/ca.crt
bridge_insecure true
bridge_certfile /etc/mosquitto/ca_certificates/client.crt
bridge_keyfile /etc/mosquitto/ca_certificates/client.key
Добавляем юзеров которые будут ходить на локальный mqtt по логину\паролю
mosquitto_passwd /etc/mosquitto/passwd <user>