BPI/BPI-M1+ установка mosquitto

Установка брокера

apt-get install mosquitto

По умолчанию сервис Mosquitto запускается сразу после установки.

Настройка MQTT

Для генерирования файла паролей служит утилита mosquitto_passwd. Эта команда предложит ввести пароль для указанного пользователя и поместит результат в /etc/mosquitto/имя_файла.

mosquitto_passwd -c /etc/mosquitto/имя_файла имя_пользователя

Примеры использования утилиты mosquitto_passwd

Опции:
-b Запуск в пакетном режиме. Это позволяет ввести пароль в командной строке, который может быть удобным, но должен использоваться с осторожностью, поскольку пароль будет отображаться в командной строке и в истории команд.

-c Создаёт новый файл паролей. Если файл уже существует, он будет перезаписан.

-D Удалит указанного пользователя из файла паролей.

-U Эта опция может использоваться для обновления/конвертации файла паролей с паролями обычного текста в файл с использованием хэшированных паролей. Он изменит указанный файл. Он не определяет, были ли хэшированы пароли, поэтому его использование в файле паролей, который уже содержит хэшированные пароли, будет генерировать новые хэши на основе старых хешей и сделает файл паролей непригодным для использования.

passwordfile Файл с паролями для изменения.

username Имя пользователя для добавления/обновления/удаления.

password Пароль для использования в пакетном режиме.

В конфигурационный файл Mosquitto /etc/mosquitto/mosquitto.conf нужно добавить информацию о новом файле паролей:

allow_anonymous false
password_file /etc/mosquitto/имя_файла

Строка allow_anonymous false блокирует доступ анонимных пользователей. Строка password_file указывает путь к файлу паролей.

Перезапускаю Mosquitto:

systemctl restart mosquitto

Установка клиента

apt-get install mosquitto-clients
rehash
Публикация сообщений

mosquitto_pub -h localhost -t test -u «пользователь» -P «пароль»

Подписка на сообщения

mosquitto_sub -h localhost -t test -u «пользователь» -P «пароль»

Пароли передаются в не зашифрованном виде. Чтобы исправить это, нужно настроить Mosquitto для поддержки SSL-шифрования.

6: Настройка поддержки SSL

Чтобы настроить шифрование, нужно изменить права на сертификаты Let’s Encrypt.

Процесс mosquitto запускается не через root, а через пользователя mosquitto из соображений безопасности. Но для чтения сертификатов SSL нужны права root.

Чтобы не изменять владельца файлов, добавьте сертификаты в группу mosquitto:

sudo chgrp -R mosquitto /etc/letsencrypt/archive/mqtt.example.com/

Команда chgrp -R обновит группу указанного каталога и всех файлов в нём. Однако Certbot, обновляя сертификаты, будет создавать новые файлы, которые будут принадлежать root, а при перезапуске Mosquitto будет возникать ошибка.

Чтобы исправить это, нужно установить SGID на каталог сертификатов. SGID – это параметр прав доступа, который передаёт права root другой группе (в данном случае mosquitto).

sudo chmod g+s /etc/letsencrypt/archive/mqtt.example.com/

Убедитесь, что изменения вступили в силу:

sudo ls -al /etc/letsencrypt/archive/mqtt.example.com/

В каталоге должен быть установлен бит SGID.

drwxr-sr-x 2 root mosquitto 4096 Oct 5 17:48 .

В привилегиях (последовательности drwxr-sr-x) есть символ s. Каталог должен принадлежать группе mosquitto.

Попробуйте также запросить права группы mosquitto на сертификаты.

-rw-r–r– 1 root mosquitto 1809 Oct 1 16:42 cert1.pem

Если все установлено верно, можно обновить конфигурации Mosquitto. Откройте конфигурационный файл:

sudo nano /etc/mosquitto/conf.d/default.conf

Добавьте в него:

. . . listener 1883 localhost listener 8883 certfile /etc/letsencrypt/live/mqtt.example.com/cert.pem cafile /etc/letsencrypt/live/mqtt.example.com/chain.pem keyfile /etc/letsencrypt/live/mqtt.example.com/privkey.pem

Теперь файл содержит два отдельных блока listener. Первый, listener 1883 localhost, обновляет прослушиватель MQTT на порте 1883 (это стандартный нешифрованный порт MQTT). Часть строки localhost привязывает этот порт к интерфейсу локального хоста, потому к нему не будет внешнего доступа (в любом случае, внешние запросы заблокировал бы брандмауэр).

Строка listener 8883 настраивает зашифрованный прослушиватель на порт 8883. Это стандартный порт MQTT + SSL (также называется MQTTS). Следующие три строки, certfile, cafile и keyfile указывают Mosquitto путь к файлам сертификата Let’s Encrypt.

Сохраните и закройте файл. Перезапустите Mosquitto:

sudo systemctl restart mosquitto

Откройте порт 8883 в брандмауэре.

sudo ufw allow 8883 Rule added

Создайте ещё одно тестовое сообщение с помощью mosquitto_pub, добавив несколько опций для SSL:

mosquitto_pub -h mqtt.example.com -t test -m «hello again» -p 8883 –capath /etc/ssl/certs/ -u «8host» -P «password»

Обратите внимание: вместо localhost используется полное имя хоста. Поскольку сертификат SSL предназначен для домена (в данном случае для mqtt.example.com), при попытке подключиться к localhost вы получите ошибку: имя хоста не совпадает с именем хоста сертификата (несмотря на то, что оба они указывают на один сервер Mosquitto).

Опция —capath /etc/ssl/certs/ включает SSL для mosquitto_pub и сообщает, где найти root-сертификаты. Путь зависит от операционной системы. Команда mosquitto_pub проверяет подпись сертификата сервера Mosquitto. Команды mosquitto_pub и mosquitto_sub не смогут создать SSL-соединение без этой опции (или её аналога, —cafile) даже с помощью стандартного порта 8883.

Если настройка выполнена правильно, во втором терминале появится сообщение «hello again». MQTT-сервер полностью готов к работе.

7: Поддержка веб-сокетов (опционально)

Для взаимодействия с JavaScript в браузерах в протокол MQTT была добавлена поддержка стандартных веб-сокетов.

Чтобы включить эту функцию, нужно добавить ещё один блок listener в настройки Mosqiutto:

sudo nano /etc/mosquitto/conf.d/default.conf

Добавьте в конец файла:

. . . listener 8083 protocol websockets certfile /etc/letsencrypt/live/mqtt.example.com/cert.pem cafile /etc/letsencrypt/live/mqtt.example.com/chain.pem keyfile /etc/letsencrypt/live/mqtt.example.com/privkey.pem

Этот блок почти такой же, как предыдущие, он отличается толлько номером порта и строкой protocol websockets. У MQTT нет стандартного порта для поддержки веб-сокетов, обычно для этого используется 8083.

Сохраните и закройте файл. Перезапустите сервер:

sudo systemctl restart mosquitto

Откройте этот порт в брандмауэре:

sudo ufw allow 8083

Чтобы протестировать эту настройку, используйте открытый MQTT-клиент для браузера (например, mqtt-admin). Откройте mqtt-admin в браузере.

На экране появится окно настроек.

Заполните предложенные поля:

Protocol: wss (что значит websocket secure). Host: домен сервера Mosquitto. Port: 8083. User: имя пользователя Mosquitto (в данном случае 8host). Password: пароль. ClientId: можно оставить по умолчанию (mqtt-admin). Нажмите Save Settings, после чего mqtt-admin подключится к серверу Mosquitto. В следующем окне укажите:

Topic: test Payload: введите любое сообщение Нажмите Publish. Сообщение должно появиться в терминале mosquitto_sub.

Запуск

/etc/init.d/mosquitto start

Проверяю.

ps acx | grep mosquitto

Ссылки:
https://infocenter.nordicsemi.com/index.jsp?topic=%2Fcom.nordic.infocenter.iotsdk.v0.9.0%2Fiot_sdk_user_guides_mosquitto.html
https://habrahabr.ru/company/intel/blog/283440
https://golos.io/ru--razrabotka/@ropox/mqtt
http://domoticx.com/esp8266-wifi-lcd-1602-2004-via-i2c-nodemcu
http://12volt.kloppenburgweb.nl/esp8266-12-als-monitoring-device
https://www.8host.com/blog/ustanovka-brokera-soobshhenij-mosquitto-v-ubuntu-16-04
http://mosquitto.org/man/mosquitto_passwd-1.html