===== BPI/BPI-M1+ установка mosquitto ===== === Установка брокера === apt-get install mosquitto По умолчанию сервис Mosquitto запускается сразу после установки. === Настройка MQTT === Для генерирования файла паролей служит утилита mosquitto_passwd. Эта команда предложит ввести пароль для указанного пользователя и поместит результат в /etc/mosquitto/имя_файла. mosquitto_passwd -c /etc/mosquitto/имя_файла имя_пользователя Примеры использования утилиты mosquitto_passwd * mosquitto_passwd [ -c | -D ] passwordfile username * mosquitto_passwd -b passwordfile username password * mosquitto_passwd -U passwordfile Опции:\\ //**-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