Служба не читает закрытый ключ TLS
Закрытый ключ должен быть недоступен посторонним, но доступен службе. Решается это группой, а не расширением прав: ключ остаётся с правами 0640, а служба входит в группу-владельца.
Вероятные причины
По порядку: сверху то, что встречается чаще.
-
Ключ доступен только root, а служба работает от другого пользователя
Обычная схема для веб-серверов — главный процесс от root — тут не работает: приложения на языках высокого уровня читают ключ уже от своего пользователя.
-
Закрыт каталог с ключами
Каталог /etc/ssl/private часто имеет права 0700. Даже при верных правах на файл войти в каталог нельзя.
-
Ключ перезаписан обновлением сертификата
Автообновление создаёт новые файлы с правами по умолчанию, и настроенный доступ теряется. Служба перестаёт работать через два месяца после настройки.
Диагностика
Команды идут в том порядке, в котором их стоит выполнять: каждая следующая проверяет то, что осталось после предыдущей.
Права на каждом уровне пути.
namei -l /путь/к/ключуПроверка доступа от имени пользователя службы.
sudo -u app test -r /путь/к/ключу && echo читается || echo отказСообщение службы о невозможности прочитать ключ.
journalctl -u myapp.service -n 20 --no-pager | grep -iE "key|permission"Решение
Решение своё для каждой причины. Сначала определите, какая из них ваша, — иначе правки наложатся друг на друга.
- Почему происходит
- Обычная схема для веб-серверов — главный процесс от root — тут не работает: приложения на языках высокого уровня читают ключ уже от своего пользователя.
- Как проверить
-
Посмотрите права и пользователя службы.
sudo ls -l /etc/ssl/private/site.key systemctl show myapp.service -p User
- Как исправить
-
Создайте группу для доступа к сертификатам, включите в неё пользователя службы и назначьте её владельцем ключа с правами 0640.
sudo groupadd -f tls-readers sudo chgrp tls-readers /etc/ssl/private/site.key sudo chmod 640 /etc/ssl/private/site.key
- Почему происходит
- Каталог /etc/ssl/private часто имеет права 0700. Даже при верных правах на файл войти в каталог нельзя.
- Как проверить
-
Пройдите по пути целиком.
namei -l /etc/ssl/private/site.key
- Как исправить
- Дайте группе право на вход в каталог (бит x) либо положите ключ в свой каталог с нужными правами.
- Почему происходит
- Автообновление создаёт новые файлы с правами по умолчанию, и настроенный доступ теряется. Служба перестаёт работать через два месяца после настройки.
- Как проверить
-
Посмотрите время изменения файла и права.
sudo ls -l --time-style=full-iso /etc/letsencrypt/live/*/privkey.pem 2>/dev/null
- Как исправить
- Добавьте перехватчик после обновления, который приводит права в порядок, — иначе проблема вернётся при следующем обновлении.
Пример вывода
Служба от обычного пользователя не читает ключ. Пример показательный: он собран на тестовой машине специально для этой страницы, а не взят из чужого журнала.
myapp[4600]: fatal: load key: open /etc/ssl/private/site.key: permission denied
$ sudo ls -l /etc/ssl/private/site.key
-rw------- 1 root root 1704 Sep 10 11:20 /etc/ssl/private/site.key
Связанные ошибки
- Permission denied в журнале службы Отказ в доступе у службы systemd: права на файл, каталоги по пути, пользователь службы, параметры изоляции, SELinux и AppArmor.
- nginx: ошибки сертификата при запуске (SSL_CTX_use_PrivateKey) nginx не запускается из-за сертификата: не совпадает ключ, неполная цепочка, файл повреждён, нет прав на чтение ключа.
- certificate verify failed в журнале службы Проверка сертификата не прошла: истёк срок, неполная цепочка, неверное имя, нет доверенных корневых сертификатов.
- Брокер сообщений не открывает слушатель: права и пути Служба падает при открытии слушателя: занятый порт, нет прав на сертификаты или каталог постоянного хранения.
- Обратный прокси не получает сертификаты: файл хранения недоступен Автоматический выпуск сертификатов не проходит: права на файл хранения слишком широкие или файл недоступен.
- Почтовый сервер доступа не запускается: не читается сертификат Служба падает при чтении сертификата: права на закрытый ключ, неверный порядок цепочки или путь к ней.
- Служба на Java не может проверить сертификат собеседника Соединения отклоняются: хранилище доверенных сертификатов недоступно, устарело или не содержит нужного центра.
- AppArmor: apparmor="DENIED" в журнале ядра Профиль AppArmor запретил операцию: как прочитать запись, найти профиль и поправить его правильно.
Где встречается чаще всего
Источники
- Документация certbot: перехватчики после обновления
-
Воспроизведено на тестовой машине, systemd 255 (Ubuntu 24.04)
Воспроизведено ключом 0600 от root при службе от обычного пользователя.