Вступление
MQTT - это протокол обмена сообщениями между машинами, предназначенный для облегчения обмена данными по публикации / подписке с устройствами «Интернета вещей». Mosquitto - популярный сервер MQTT (илиbroker, на языке MQTT), который имеет отличную поддержку сообщества и прост в установке и настройке.
В этом кратком руководстве по быстрому запуску мы установим и настроим Mosquitto и будем использовать SSL-сертификаты Let Encrypt для защиты нашего MQTT-трафика. Если вам нужен более подробный обзор любого из шагов, просмотрите следующие учебные пособия:
Предпосылки
Перед началом этого урока вам понадобится:
-
Сервер Ubuntu 18.04 с пользователем без полномочий root, с поддержкой sudo и базовым брандмауэром, как описано вthis Ubuntu 18.04 server setup tutorial
-
Доменное имя указывает на ваш сервер. В этом руководстве будет использоваться заполнитель
mqtt.example.com
-
Порт 80 должен быть не использован на вашем сервере. Если вы устанавливаете Mosquitto на машину с веб-сервером, который занимает этот порт, вам нужно будет использовать другой метод для получения сертификатов, напримерwebroot mode Certbot.
[[step-1 -—- install-the-software]] == Шаг 1. Установка программного обеспечения
Сначала мы установим специальный репозиторий программного обеспечения, чтобы получить последнюю версию Certbot, клиента Let Encrypt:
sudo add-apt-repository ppa:certbot/certbot
НажмитеENTER
, чтобы принять, затем установите пакеты программного обеспечения для Mosquitto и Certbot:
sudo apt install certbot mosquitto mosquitto-clients
Затем мы получим наш сертификат SSL.
[[step-2 -—- download-an-ssl-certificate]] == Шаг 2. Загрузка сертификата SSL
Откройте порт80
в брандмауэре:
sudo ufw allow 80
Затем запустите Certbot, чтобы получить сертификат. Не забудьте заменить доменное имя вашего сервера здесь:
sudo certbot certonly --standalone --preferred-challenges http -d mqtt.example.com
Вам будет предложено ввести адрес электронной почты и принять условия обслуживания. После этого вы должны увидеть сообщение о том, что процесс прошел успешно и где хранятся ваши сертификаты.
Мы настроим Mosquitto для использования этих сертификатов дальше.
[[step-3 -—- configuring-mosquitto]] == Шаг 3. Настройка Mosquitto
Сначала мы создадим файл паролей, который Mosquitto будет использовать для аутентификации соединений. Используйте для этогоmosquitto_passwd
, не забудьте подставить ваше собственное предпочтительное имя пользователя:
sudo mosquitto_passwd -c /etc/mosquitto/passwd your-username
Вам будет дважды предложено ввести пароль.
Теперь откройте новый файл конфигурации для Mosquitto:
sudo nano /etc/mosquitto/conf.d/default.conf
Это откроет пустой файл. Вставьте в следующее:
/etc/mosquitto/conf.d/default.conf
allow_anonymous false
password_file /etc/mosquitto/passwd
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 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
Обязательно замените доменное имя, которое вы использовали на шаге 2, наmqtt.example.com
. Сохраните и закройте файл, когда вы закончите.
Этот файл делает следующее:
-
Отключить анонимные логины
-
Использует наш файл паролей для включения аутентификации по паролю
-
Устанавливает незащищенный приемник на порт 1883 только дляlocalhost
-
Устанавливает безопасный приемник на порт
8883
-
Устанавливает безопасный прослушиватель на основе веб-сокетов на порт
8083
Перезапустите Mosquitto, чтобы получить изменения конфигурации:
sudo systemctl restart mosquitto
Убедитесь, что служба снова работает:
sudo systemctl status mosquitto
Output● mosquitto.service - LSB: mosquitto MQTT v3.1 message broker
Loaded: loaded (/etc/init.d/mosquitto; generated)
Active: active (running) since Mon 2018-07-16 15:03:42 UTC; 2min 39s ago
Docs: man:systemd-sysv-generator(8)
Process: 6683 ExecStop=/etc/init.d/mosquitto stop (code=exited, status=0/SUCCESS)
Process: 6699 ExecStart=/etc/init.d/mosquitto start (code=exited, status=0/SUCCESS)
Tasks: 1 (limit: 1152)
CGroup: /system.slice/mosquitto.service
└─6705 /usr/sbin/mosquitto -c /etc/mosquitto/mosquitto.conf
Статус должен бытьactive (running)
. Если это не так, проверьте файл конфигурации и перезапустите снова. Некоторая дополнительная информация может быть доступна в файле журнала Mosquitto:
sudo tail /var/log/mosquitto/mosquitto.log
Если все в порядке, используйтеufw
, чтобы пропустить два новых порта через брандмауэр:
sudo ufw allow 8883
sudo ufw allow 8083
Теперь, когда Mosquitto настроен, мы настроим Certbot для перезапуска Mosquitto после обновления наших сертификатов.
[[step-4 -—- configuring-certbot-Renewals]] == Шаг 4. Настройка продлений Certbot
Certbot автоматически продлит срок действия наших SSL-сертификатов до истечения срока их действия, но после этого необходимо указать, что необходимо перезапустить службу Mosquitto.
Откройте файл конфигурации обновления Certbot для вашего доменного имени:
sudo nano /etc/letsencrypt/renewal/mqtt.example.com.conf
Добавьте следующую опциюrenew_hook
в последнюю строку:
/etc/letsencrypt/renewal/mqtt.example.com.conf
renew_hook = systemctl restart mosquitto
Сохраните и закройте файл, затем выполните пробный запуск Certbot, чтобы убедиться, что синтаксис в порядке:
sudo certbot renew --dry-run
Если вы не видите ошибок, все готово. Давайте протестируем наш MQTT-сервер дальше.
[[step-5 -–- testing-mosquitto]] == Шаг 5 - Тестирование Mosquitto
На шаге 1 мы установили несколько клиентов MQTT для командной строки. Мы можем подписаться на темуtest в прослушивателе localhost следующим образом:
mosquitto_sub -h localhost -t test -u "your-user" -P "your-password"
И мы можем публиковать сmosquitto_pub
:
mosquitto_pub -h localhost -t test -m "hello world" -u "your-user" -P "your-password"
Чтобы подписаться с помощью защищенного прослушивателя на порт 8883, выполните следующие действия:
mosquitto_sub -h mqtt.example.com -t test -p 8883 --capath /etc/ssl/certs/ -u "your-username" -P "your-password"
И вот как вы публикуете для защищенного слушателя:
mosquitto_pub -h mqtt.example.com -t test -m "hello world" -p 8883 --capath /etc/ssl/certs/ -u "your-username" -P "your-password"
Обратите внимание, что мы используем полное имя хоста вместоlocalhost
. Поскольку наш SSL-сертификат выпущен дляmqtt.example.com
, при попытке установить безопасное соединение сlocalhost
мы получим ошибку о том, что имя хоста не соответствует имени хоста сертификата.
Для тестирования функциональности веб-сокета мы будем использовать общедоступный клиент MQTT на основе браузера. Open the Eclipse Paho javascript client utility in your browser и заполните информацию о подключении следующим образом:
-
Host - это домен вашего сервера Mosquitto,
mqtt.example.com
-
Port равно
8083
-
ClientId можно оставить случайным значением по умолчанию
-
Path можно оставить со значением по умолчанию/ws
-
Username - ваше имя пользователя Mosquitto из шага 3
-
Password - это пароль, который вы выбрали на шаге 3
Остальные поля могут быть оставлены с их значениями по умолчанию.
После нажатияConnect клиент подключится к вашему серверу. Вы можете опубликовать и подписаться с помощью панелейSubscribe иPublish Message под панельюConnection.
Заключение
Теперь мы настроили и протестировали защищенный, защищенный паролем и MQTT-сервер с шифрованием SSL. Это может служить надежной и безопасной платформой обмена сообщениями для вашего IoT, домашней автоматизации или других проектов.