Брокер сообщений не открывает слушатель: права и пути
Брокеры сообщений открывают слушатель и каталог хранения при запуске, и оба шага упираются в права. Отдельная сложность — пользователь службы: брокер меняет его на своего после запуска, и файлы, доступные root, оказываются недоступны.
Вероятные причины
По порядку: сверху то, что встречается чаще.
-
Нет прав на файлы сертификатов
После смены пользователя брокер читает сертификаты уже не от root. Закрытый ключ с правами только для root прочитать нельзя.
-
Каталог постоянного хранения недоступен для записи
При включённом сохранении состояния брокер пишет файл в свой каталог. Без права записи запуск отказывает.
-
Порт занят другим экземпляром
Второй экземпляр или оставшийся процесс держит порт, и новый слушатель открыть нельзя.
Диагностика
Команды идут в том порядке, в котором их стоит выполнять: каждая следующая проверяет то, что осталось после предыдущей.
Сообщения брокера о слушателях и правах.
journalctl -u mosquitto -n 30 --no-pagerКто занимает порты брокера.
sudo ss -tlnp | grep -E ":1883|:8883"Пользователь и каталоги службы.
systemctl show mosquitto -p User -p StateDirectory -p ProtectSystemРешение
Решение своё для каждой причины. Сначала определите, какая из них ваша, — иначе правки наложатся друг на друга.
- Почему происходит
- После смены пользователя брокер читает сертификаты уже не от root. Закрытый ключ с правами только для root прочитать нельзя.
- Как проверить
-
Посмотрите права на ключи и пользователя брокера.
sudo ls -l /etc/mosquitto/certs/ 2>/dev/null grep -hE "^user|^listener" /etc/mosquitto/mosquitto.conf /etc/mosquitto/conf.d/* 2>/dev/null
- Как исправить
- Дайте пользователю брокера право чтения ключа через группу, не меняя права на общие каталоги сертификатов. Копия ключа с широкими правами — плохая замена.
- Почему происходит
- При включённом сохранении состояния брокер пишет файл в свой каталог. Без права записи запуск отказывает.
- Как проверить
-
Посмотрите каталог и параметры хранения.
grep -hE "^persistence|^persistence_location" /etc/mosquitto/mosquitto.conf 2>/dev/null sudo ls -ld /var/lib/mosquitto 2>/dev/null
- Как исправить
-
Объявите каталог через
StateDirectory=в unit-файле: systemd создаст его с нужным владельцем при каждом запуске.[Service] StateDirectory=mosquitto
- Почему происходит
- Второй экземпляр или оставшийся процесс держит порт, и новый слушатель открыть нельзя.
- Как проверить
-
Посмотрите, кто держит порт.
sudo ss -tlnp | grep -E ":1883|:8883"
- Как исправить
- Остановите лишний экземпляр или разведите слушатели по портам и адресам.
Пример вывода
Закрытый ключ недоступен пользователю брокера. Пример показательный: он собран на тестовой машине специально для этой страницы, а не взят из чужого журнала.
mosquitto[5900]: Error: Unable to load server key file "/etc/mosquitto/certs/server.key". Check keyfile.
mosquitto[5900]: Error: Unable to start listener on port 8883.
systemd[1]: mosquitto.service: Main process exited, code=exited, status=3/NOTIMPLEMENTED
Связанные ошибки
- Permission denied в журнале службы Отказ в доступе у службы systemd: права на файл, каталоги по пути, пользователь службы, параметры изоляции, SELinux и AppArmor.
- nginx: ошибки сертификата при запуске (SSL_CTX_use_PrivateKey) nginx не запускается из-за сертификата: не совпадает ключ, неполная цепочка, файл повреждён, нет прав на чтение ключа.
- status=238/STATE_DIRECTORY в systemd Код 238/STATE_DIRECTORY: не удалось подготовить постоянный каталог службы в /var/lib из StateDirectory=.
- Обратный прокси не получает сертификаты: файл хранения недоступен Автоматический выпуск сертификатов не проходит: права на файл хранения слишком широкие или файл недоступен.
- Почтовый сервер доступа не запускается: не читается сертификат Служба падает при чтении сертификата: права на закрытый ключ, неверный порядок цепочки или путь к ней.
- Служба на Java не может проверить сертификат собеседника Соединения отклоняются: хранилище доверенных сертификатов недоступно, устарело или не содержит нужного центра.
- Служба не читает закрытый ключ TLS Права на закрытый ключ: как дать доступ службе, не открывая ключ всем. Группы и каталоги сертификатов.
- AppArmor: apparmor="DENIED" в журнале ядра Профиль AppArmor запретил операцию: как прочитать запись, найти профиль и поправить его правильно.
Источники
- Документация Mosquitto
-
Воспроизведено на тестовой машине, systemd 255 (Ubuntu 24.04)
Воспроизведено закрытым ключом с правами только для root.