Как настроить зашифрованный mosquitto broker как веб-страницу с https?

Я пытаюсь настроить брокера mosquitto, который зашифрован с помощью ssl/tls. Я не хочу создавать клиентские сертификаты. Я просто хочу зашифрованное соединение.

На странице руководства описаны только доступные настройки, а не те, которые необходимы и как они используются.

Какие настройки необходимы и как вы их устанавливаете?

Я использую mosquitto 1.3.5

Ответ 1

Здесь есть небольшой путеводитель, но он не говорит много: http://mosquitto.org/man/mosquitto-tls-7.html

Вам необходимо установить следующие параметры: CERTFILE файл_ключа cafile

Они могут быть сгенерированы с помощью команд в приведенной выше ссылке. Но проще использовать этот script: https://github.com/owntracks/tools/blob/master/TLS/generate-CA.sh

После запуска script и изменения конфигурации он может выглядеть примерно так:

listener 8883
cafile /etc/mosquitto/certs/ca.crt
certfile /etc/mosquitto/certs/hostname.localdomain.crt
keyfile /etc/mosquitto/certs/hostname.localdomain.key

Если mosquitto говорит Unable to load server key file, это означает, что у пользователя, на котором выполняется mosquitto, нет разрешения на чтение файла. Даже если вы запустите его как root, брокер может начать как другой пользователь, например, москит. Чтобы решить эту проблему, например, chown mosquitto:root keyfile

Для подключения к брокеру клиенту потребуется файл ca.crt. Если вы этого не сделаете, брокер скажет что-то вроде:

Ошибка OpenSSL: ошибка: 1408F10B: процедуры SSL: SSL3_GET_RECORD: неправильный номер версии

Чтобы предоставить команду mosquitto_sub, используйте --cafile pathToCaCrt. Ca.crt может быть распределен с клиентами, и он будет убедиться, что сервер, к которому он подключен, на самом деле является правильным сервером.

Флаг --insecure mosquitto_sub не позволяет клиенту принимать все сертификаты (например, с помощью wget или аналогичных), он просто позволяет сертификату не подключать хост, к которому вы подключаетесь общим именем. Поэтому вы должны убедиться, что ваш сертификат имеет хост вашего брокера как общее имя.

Ответ 2

Чтобы обеспечить доступ к WebSocket для Mosquitto, например. используя сертификат Let Encrypt, ваш файл конфигурации может выглядеть так:

listener 9001
protocol websockets
certfile /etc/letsencrypt/live/yourdomain.com/cert.pem
cafile /etc/letsencrypt/live/yourdomain.com/chain.pem
keyfile /etc/letsencrypt/live/yourdomain.com/privkey.pem

Убедитесь, что файлы доступны для чтения в Mosquitto (Debian, в частности, запускает Mosquitto под пользователем mosquitto, который непривилегирован). Вам нужна Mosquitto 1.4 для поддержки WebSockets.

Чтобы подключиться к этому WebSocket с помощью клиента Paho JavaScript:

// host and port overwritten at connect
var mqtt = new Paho.MQTT.Client("yourdomain.com", 9001, "");   

mqtt.connect({
    hosts: [ "wss://yourdomain.com:9001/" ],
    useSSL: true
});

Обратите внимание, что это еще не означает никакого контроля доступа, поэтому ваш брокер MQTT будет общедоступным. Вы также можете добавить авторизацию.