К основному содержимому

Хранилище сертификатов в Linux: свой корневой CA

Безопасность · 31.10.2026 · 4 мин чтения
Иллюстрация к статье «Хранилище сертификатов в Linux: свой корневой CA»

Когда внутренний сервис или тестовый стенд использует сертификат собственного центра сертификации, curl и системные службы отвечают «unable to get local issuer certificate». Решение: добавить корневой сертификат в системное хранилище доверенных. Ниже: где оно находится в Debian, Ubuntu и семействе RHEL, как пополнить его и почему некоторые программы всё равно не доверяют. Сертификаты для SSH устроены иначе, о них написано в статье SSH-сертификаты и свой CA.

Где лежит хранилище

Системное хранилище состоит из каталога для ваших файлов и итогового набора, который собирает специальная команда. Программы читают именно итоговый набор, поэтому после копирования файла команду нужно запустить.

СемействоПапка для своих сертификатовКомандаИтоговый набор
Debian, Ubuntu/usr/local/share/ca-certificates/update-ca-certificates/etc/ssl/certs/ca-certificates.crt
RHEL, AlmaLinux, Rocky/etc/pki/ca-trust/source/anchors/update-ca-trust/etc/pki/tls/certs/ca-bundle.crt

Пакет ca-certificates приносит список общепризнанных центров сертификации. Ваши файлы лежат отдельно, и обновление пакета их не стирает.

Добавляем сертификат в Debian и Ubuntu

Нужен корневой сертификат в формате PEM (текстовый файл с блоком BEGIN CERTIFICATE) и с расширением .crt: файлы с другим расширением команда пропускает. Если вам выдали файл .cer в двоичном формате DER, сначала преобразуйте его. Команда update-ca-certificates должна сообщить, что добавлен один сертификат.

openssl x509 -inform der -in myca.cer -out myca.crt
openssl x509 -in myca.crt -noout -subject -dates
sudo cp myca.crt /usr/local/share/ca-certificates/myca.crt
sudo update-ca-certificates

Чтобы убрать сертификат, удалите файл и пересоберите набор с ключом --fresh.

sudo rm /usr/local/share/ca-certificates/myca.crt
sudo update-ca-certificates --fresh

Добавляем сертификат в RHEL-семействе

В AlmaLinux, Rocky Linux и других системах этого семейства файл кладут в каталог anchors и запускают update-ca-trust. Расширение .crt и формат PEM подходят и здесь.

sudo cp myca.crt /etc/pki/ca-trust/source/anchors/myca.crt
sudo update-ca-trust

Если вы удаляете файл из anchors, запустите update-ca-trust ещё раз, чтобы он пропал и из итогового набора.

Проверка результата

Запрос curl к внутреннему адресу должен вернуть код ответа без жалоб на сертификат, а строка Verify return code в openssl должна показать 0. Если ошибка осталась, изучите цепочку по инструкции из статьи Как проверить SSL-сертификат.

curl -sS -o /dev/null -w "%{http_code}\n" https://internal.example.com/
openssl s_client -connect internal.example.com:443 -servername internal.example.com </dev/null 2>/dev/null | grep "Verify return code"

Почему системное хранилище не всегда помогает

Многие программы приносят собственный набор доверенных центров и системное хранилище не читают. Типичные случаи:

  • Java использует файл cacerts и утилиту keytool, поэтому для неё сертификат импортируют отдельно;
  • Python с библиотекой requests берёт набор из пакета certifi, если не задана переменная REQUESTS_CA_BUNDLE;
  • Node.js содержит встроенный список, а свой файл подключается переменной NODE_EXTRA_CA_CERTS;
  • Firefox и контейнеры Docker держат собственные хранилища.
curl --cacert myca.crt https://internal.example.com/
export SSL_CERT_FILE=/etc/ssl/certs/ca-certificates.crt
export REQUESTS_CA_BUNDLE=/etc/ssl/certs/ca-certificates.crt
export NODE_EXTRA_CA_CERTS=/usr/local/share/ca-certificates/myca.crt
sudo keytool -importcert -alias myca -file myca.crt -keystore "$JAVA_HOME/lib/security/cacerts"

Для разового вызова у curl есть ключ --cacert. Проверку отключать ключами вроде -k не стоит: она перестаёт защищать соединение.

Осторожно: корневой сертификат — это доверие ко всему

Добавленный корневой сертификат позволяет его владельцу выпустить сертификат на любое имя, и система признает его настоящим. Добавляйте только свой собственный центр или тот, которому вы полностью доверяете, и храните закрытый ключ в надёжном месте. Для публичного сайта собственный центр не нужен: подробности в статье о типах сертификатов DV, OV и EV. Привязку сертификата к DNS описывает статья TLSA и DANE.

Частые вопросы

Где находится хранилище сертификатов в Ubuntu?

Итоговый набор лежит в файле /etc/ssl/certs/ca-certificates.crt, а отдельные сертификаты — в каталоге /etc/ssl/certs. Свои файлы кладут в /usr/local/share/ca-certificates/ и затем запускают update-ca-certificates. Редактировать итоговый набор вручную нельзя: при следующем запуске команды правки пропадут.

Как добавить сертификат в доверенные в Ubuntu?

Положите корневой сертификат в формате PEM с расширением .crt в каталог /usr/local/share/ca-certificates/ и выполните sudo update-ca-certificates. Команда сообщит, что добавлен один сертификат. После этого curl и системные службы начнут принимать сертификаты, выпущенные этим центром, без дополнительных ключей.

Почему curl доверяет сертификату, а Java или Python нет?

У этих программ есть собственные хранилища или встроенные наборы центров. Java читает cacerts, Python с requests использует пакет certifi, Node.js имеет встроенный список. Укажите сертификат средствами самой программы: через keytool или переменные REQUESTS_CA_BUNDLE и NODE_EXTRA_CA_CERTS.

Нужно ли перезапускать службы после update-ca-trust?

Хранилище читается при запуске процесса, поэтому уже работающие службы могут продолжать использовать старый набор. Перезапустите те службы, которые обращаются к внутренним адресам по HTTPS, и проверьте соединение. Для новых процессов, например для curl, перезапуск не нужен.

Статья помогла?
← Назад в базу знаний Задать вопрос поддержке