MQTT – это легковесный протокол сообщений, предназначенный для общения между устройствами (machine-to-machine) интернета вещей. Он используется для отслеживания перемещения транспортных средств, домашней автоматизации и сбора данных.
Mosquitto – это популярный MQTT-сервер (или брокер). Он прост в установке и настройке и активно поддерживается сообществом.
Данный мануал поможет установить Mosquitto, настроить его для поддержки SSL и настроить безопасное взаимодействие устройств по MQTT.
Требования
- Сервер Ubuntu 18.04, настроенный согласно этому мануалу.
- Доменное имя (в руководстве используется условный домен mqtt.example.com).
- Автоматически обновляемый сертификат от сервиса Let’s Encrypt, сгенерированный с помощью Certbot. Получить такой вам поможет мануал Автоматическое извлечение SSL-сертификатов Let’s Encrypt с помощью Certbot в Ubuntu 18.04. Вы также можете добавить systemctl restart mosquitto как renew_hook в разделе 4.
1: Установка Mosquitto
В репозитории Ubuntu 18.04 можно найти сравнительно новую версию Mosquitto.
Обновите индекс пакетов:
sudo apt update
Чтобы установить Mosquitto, введите:
sudo apt install mosquitto mosquitto-clients
По умолчанию сервис Mosquitto запускается сразу после установки. Проверьте стандартные настройки. Для этого нужно подписаться на тему с помощью одного из клиентов Mosquitto.
Темы – это метки, которые присваиваются опубликованным заметкам. Они расположены в виде иерархии (например, sensors/outside/temp или sensors/outside/humidity). Упорядочивание тем полностью зависит от ваших потребностей.
Откройте ещё одну сессию терминала, в результате у вас должно быть два терминала. Запустите в новом терминале команду mosquitto_sub, чтобы подписаться:
mosquitto_sub -h localhost -t test
Флаг –h указывает имя хоста сервера MQTT, -t – тему. После запуска команды на экране не появится вывода, поскольку команда mosquitto_sub ждет получения сообщений. Вернитесь в первый терминал и опубликуйте сообщение:
mosquitto_pub -h localhost -t test -m "hello world"
Команда mosquitto_pub использует те же опции, что и mosquitto_sub, однако в этот раз используется дополнительный флаг –m (он позволяет ввести текст сообщения). Нажмите Enter, и вы увидите в другом терминале MQTT-сообщение hello world.
Введите во втором терминале CTRL+C, чтобы остановить mosquitto_sub, но не прерывайте подключения к серверу (оно понадобится позже).
Теперь нужно защитить установку парольной аутентификацией.
2: Настройка пароля MQTT
Теперь настройте пароль для Mosquitto.
Mosquitto предоставляет утилиту mosquitto_passwd для генерирования файла паролей. Эта команда предложит ввести пароль для указанного пользователя и поместит результат в /etc/mosquitto/passwd.
sudo mosquitto_passwd -c /etc/mosquitto/passwd 8host
Откройте конфигурационный файл Mosquitto и добавьте информацию о новом файле паролей:
sudo nano /etc/mosquitto/conf.d/default.conf
На экране появится пустой файл. Введите:
allow_anonymous false
password_file /etc/mosquitto/passwd
Строка allow_anonymous false блокирует доступ анонимных пользователей. Строка password_file указывает путь к файлу паролей. Сохраните и закройте файл.
Перезапустите Mosquitto:
sudo systemctl restart mosquitto
Теперь нужно протестировать новые настройки. Попробуйте опубликовать сообщение без пароля:
mosquitto_pub -h localhost -t "test" -m "hello world"
Сервер должен отклонить сообщение:
Connection Refused: not authorised.
Error: The connection was refused.
Перейдите во второй терминал и подпишитесь на тему test.
mosquitto_sub -h localhost -t test -u "8host" -P "password"
Оставьте этот терминал открытым до конца руководства, чтобы периодически отправлять в него тестовые сообщения.
Вернитесь в первый терминал и опубликуйте сообщение:
mosquitto_pub -h localhost -t "test" -m "hello world" -u "8host" -P "password"
Сообщение появится во втором терминале. Если это так, то настройка пароля Mosquitto прошла успешно.
Пока что пароли передаются в незашифрованном виде. Чтобы исправить это, нужно настроить Mosquitto для поддержки SSL-шифрования.
3: Настройка поддержки SSL
Чтобы настроить SSL шифрование, нужно сообщить Mosquitto, где находятся сертификаты Let’s Encrypt. Откройте конфигурационный файл.
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
Rule added (v6)
Создайте ещё одно тестовое сообщение с помощью 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-сервер полностью готов к работе.
4: Поддержка веб-сокетов (опционально)
Для взаимодействия с 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
Откройте порт 8083 в брандмауэре:
sudo ufw allow 8083
Чтобы протестировать эту настройку, используйте открытый MQTT-клиент для браузера (например, Eclipse Paho JavaScript Client). Откройте Eclipse Paho JavaScript Client в браузере.
На экране появится окно настроек.
Заполните предложенные поля:
- Host: домен сервера Mosquitto (mqtt.example.com).
- Port: 8083.
- ClientId: можно оставить по умолчанию (js-utility-DI1m6).
- Path: оставьте по умолчанию, /ws.
- Username: имя пользователя Mosquitto (в данном случае 8host).
- Password: пароль.
Остальные поля можно оставить по умолчанию.
Нажмите Connect, после чего клиент Paho подключится к серверу Mosquitto.
Чтобы опубликовать сообщение, перейдите в раздел Publish Message, в Topic укажите test и введите любое сообщение в поле Message. Нажмите Publish. Сообщение появится в терминале mosquitto_sub.
Заключение
Сервер MQTT установлен, защищен паролем и готов к работе. SSL-сертификат Let’s Encrypt шифрует трафик и автоматически обновляется. Теперь у вас есть надёжная платформа для обмена сообщениями.
С протоколом MQTT хорошо работают следующие программы:
- OwnTracks – открытое приложение геолокации, которое можно установить на телефон. Полученные данные можно переносить на карту, на их основе можно создавать предупреждения и настроить запуск компонентов интернета вещей.
- Node-RED – графический веб-интерфейс для настройки интернета вещей. Инструмент позволяет перенаправлять вывод одной ноды на ввод другой, фильтровать данные, применять разные протоколы и базы данных и многое другое.
- ESP8266 – недорогой wifi микроконтроллер с поддержкой MQTT. С его помощью вы можете следить за температурой, атмосферным давлением и т.п.