apt-get install mosquitto
По умолчанию сервис Mosquitto запускается сразу после установки.
Для генерирования файла паролей служит утилита 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