Исключение сертификата клиента Mosquitto MQTT - PullRequest
0 голосов
/ 01 апреля 2020

Я разрабатываю приложение, которое, в итоге, использует MQTT для отправки значений датчика брокеру, чтобы впоследствии визуализировать эти данные в веб-приложении панели мониторинга. У меня есть пять микроконтроллеров, подключенных к брокеру, и я настроил серверный сертификат для брокера и клиентские сертификаты для каждого микроконтроллера.

Проблема в том, что в файле mosquitto.conf мне требуется использование клиентских сертификатов для клиентов, которые хотят подключиться, поэтому, если я хочу подписаться на topi c из своего веб-приложения, мне нужно сертификат клиента. Я пытаюсь найти правильный подход для достижения этой цели, но кажется, что наличие сертификата и ключа в машине, которую вы не можете контролировать, представляет большую угрозу безопасности.

Было бы идеально, если бы кто-то знал способ настройки файла конфигурации mosquitto или установил sh какое-то исключение (возможно, похожее на ACL), требующее только клиентские сертификаты для определенных клиентов (в моем случае, микроконтроллеры) и использовать username@password для других (веб-клиенты). Можно ли сделать такую ​​вещь?

Любая помощь будет высоко ценится

РЕДАКТИРОВАТЬ (относительно ответа @hardillb)

Мой комар .conf:

pid_file /var/run/mosquitto.pid

persistence true
persistence_location /var/lib/mosquitto/

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

include_dir /etc/mosquitto/conf.d

per_listener_settings true

listener 9873
protocol websockets
#http_dir /home/jamengual/Desktop/UIB/TFG/mqtt/webAPP
cafile /etc/mosquitto/ca_certificates/ca.crt
keyfile /etc/mosquitto/certs/server.key
certfile /etc/mosquitto/certs/server.crt

listener 8883
cafile /etc/mosquitto/ca_certificates/ca.crt
keyfile /etc/mosquitto/certs/server.key
certfile /etc/mosquitto/certs/server.crt
require_certificate true

"per_listener_settings true" переводит сервер go в активное (выходное) состояние. Из руководства mosquitto.conf:

Говоря о механизмах аутентификации:

Шифрование на основе сертификатов и PSK настраивается для каждого слушателя.

Говоря о параметрах per_listener_settings:

per_listener_settings [ true | false ]

    If true, then authentication and access control settings will be controlled on a per-listener basis. The following options are affected:

    password_file, acl_file, psk_file, allow_anonymous, allow_zero_length_clientid, auth_plugin, auth_opt_*, auto_id_prefix.

Так что я понимаю, что параметр per_listener_settings может быть необязательным для части require_certificate. Однако мне все еще нужно настроить имена пользователей и пароли для веб-сокетов.

Что-то не так с моим файлом конфигурации?

Ссылка на мой вопрос о том, как хранить клиентские сертификаты и ключи в машине клиента

1 Ответ

1 голос
/ 02 апреля 2020

Mosquitto позволяет вам иметь несколько прослушивателей для каждого брокера, которые совместно используют одно пространство topi c.

Прослушиватели могут поддерживать собственные MQTT, MQTT через веб-сокеты (включая веб-сокеты через TLS) и MQTT через TLS.

Он также имеет параметр per_listener_settings, который позволяет указывать разные параметры аутентификации для разных слушателей. Эта опция была добавлена ​​в mosquitto версии 1.5.

Так что в этом случае вы можете создать MQTT через прослушиватель TLS и использовать клиентские сертификаты для аутентификации этих пользователей (устройств) и MQTT через прослушиватель Websocket, который будет использовать имя пользователя / аутентификация по паролю.

например, что-то вроде этого (но, вероятно, с использованием плагина аутентификации, а не файлов acl / пароля)

per_listener_settings true

listener 1884
cafile /path/to/ca
certfile /path/to/cert
keyfile /path/to/key
require_certificate true
acl_file /path/to/acl_file

listener 8883
protocol websockets
acl_file /path/to/acl_file
password_file /path/to/password

Вы также можете включить ca_file, cert_file и key_file опции для прослушивателя websocket, чтобы включить Websockets через TLS (но не используйте require_certificate, потому что обработка клиентских сертификатов на стороне браузера для websockets не очень удобна, так как они не спрашивают, какой использовать). Но обычно я обычно использую что-то вроде NGINX для прокси для прослушивателя websocket, а также выполняю завершение TLS.

Подробную информацию обо всех параметрах можно найти на справочной странице mosquitto.conf: https://mosquitto.org/man/mosquitto-conf-5.html

...