Из-за временных ограничений на территории РФ наблюдаются проблемы с оплатой. Если платёж не проходит, оставьте запрос в службу поддержки.Служба поддержки работает 24/7 — мы всегда на связи по вопросам хостинга и серверов.Открыт прием заявок на аренду выделенных серверов и размещение оборудования в дата-центре.Напоминаем: рекомендуем включить резервное копирование для дополнительной защиты данных.Доступна новая линейка VPS/VDS с NVMe-дисками и увеличенной производительностью.Технические работы на части серверов завершены. Все сервисы работают в штатном режиме.
Статья7 мин чтенияПросмотры1

openssl verify: почему цепочка сертификата не собирается без intermediate CA

Практический guide для OpenSSL 3.0: различаем trust anchor и intermediate, воспроизводим ошибки 20, 2 и 62, читаем depth и отдельно проверяем DNS-имя.

Комментарии 0

Сервер и защищённый контейнер соединены цепью, промежуточное звено рассматривают через лупу
В этой статье

Если leaf-сертификат подписан промежуточным CA, одного доверенного root.pem недостаточно: OpenSSL должен получить intermediate.pem для построения пути. Передайте корневой сертификат через -CAfile, а промежуточный — через -untrusted. Затем проверяйте не только строку OK, но и код завершения процесса.

Параметр -untrusted здесь не объявляет сертификат вредоносным. Он означает, что сертификат можно использовать для построения цепочки, но нельзя считать самостоятельной точкой доверия. Это различие помогает не лечить ошибку 20 случайным добавлением сертификатов в системное хранилище.

Входные условия

  • Ubuntu 24.04.3 LTS и OpenSSL 3.0.13.

  • Три PEM-файла учебной цепочки: leaf.pem, intermediate.pem и root.pem.

  • Leaf выдан для DNS-имени backup.example.test; приватные ключи для проверки цепочки не нужны.

  • Команды выполняются в изолированном временном каталоге без сети и рабочих сертификатов.

  • Проверка воспроизведена 22 октября 2026 года.

Какую цепочку строит OpenSSL

Документация openssl verify для версии 3.0 определяет -untrusted как набор сертификатов для построения цепочки, а -show_chain показывает построенный путь и помечает сертификаты из этого набора как untrusted.

В терминах RFC 5280 путь связывает проверяемый сертификат с trust anchor. В учебной модели это leaf → intermediate → root. Валидатор проверяет подписи, сроки и ограничения сертификатов, а приложение может добавлять отдельные требования.

Учебная цепочка доверия: leaf-сертификат, промежуточный CA и корневой CA
Путь проверки строится от leaf через intermediate к доверенному root.

Ошибка без промежуточного сертификата

openssl verify -show_chain -CAfile root.pem leaf.pem

CN = backup.example.test error 20 at 0 depth lookup: unable to get local issuer certificate error leaf.pem: verification failed

Команда завершилась с кодом 2. Root доверен, но leaf подписан не им напрямую. Без intermediate.pem валидатор не может перейти от depth 0 к следующему издателю. По одному error 20 рано делать вывод, что root неверный: сначала нужно понять, какого сертификата не хватает на указанной глубине.

Полная цепочка через -untrusted

openssl verify -show_chain -CAfile root.pem -untrusted intermediate.pem leaf.pem

leaf.pem: OK Chain: depth=0: CN = backup.example.test (untrusted) depth=1: CN = Guide Intermediate CA (untrusted) depth=2: CN = Guide Root CA

Результат — код 0. Пометка untrusted у leaf и intermediate в выводе -show_chain не означает ошибку: эти сертификаты участвовали в построении пути, но доверие завершилось на root из -CAfile.

Почему intermediate не стоит молча делать корнем доверия

Если передать intermediate.pem как единственный -CAfile без -partial_chain, учебная команда вернула error 2 на depth 1: издатель промежуточного сертификата не найден. С -partial_chain тот же intermediate становится допустимым завершением пути, и проверка проходит. Это уже другая политика доверия, а не ремонт недостающей цепочки.

Команда

Результат

Код

Что проверено

root без intermediate

error 20 на depth 0

2

не найден сертификат issuer для leaf

root + -untrusted intermediate

OK, путь до root

0

полная учебная цепочка

intermediate как -CAfile

error 2 на depth 1

2

нет издателя intermediate

intermediate + -partial_chain

OK до intermediate

0

intermediate принят как trust anchor

неверный root + intermediate

error 20 на depth 1

2

intermediate не связан с доверенным root

Не добавляйте -partial_chain только ради зелёного результата. Используйте его лишь тогда, когда ваша политика действительно доверяет указанному промежуточному CA как конечной точке пути. Для обычной серверной цепочки сохраняйте разницу между trust anchor и сертификатами, которые сервер передаёт для построения пути.

Четыре результата openssl verify для учебной цепочки сертификатов
Глубина ошибки помогает отличить отсутствующий intermediate, неверный root и несовпадение имени.

Как читать depth и номер ошибки

Фрагмент

Смысл в учебной цепочке

depth 0

проверяемый leaf-сертификат

depth 1

промежуточный CA

depth 2

корневой CA

error 20

не найден локальный издатель на указанной глубине

error 2

не удалось получить сертификат издателя

Глубина указывает место, где построение пути остановилось. В выполненном тесте без intermediate ошибка появилась на depth 0; с неверным root — на depth 1. Одинаковый номер ошибки может сопровождать разные конфигурационные причины, поэтому сохраняйте всю команду, глубину, subject и код завершения.

Имя хоста проверяется отдельно

Успешная цепочка ещё не подтверждает, что сертификат подходит нужному DNS-имени. Для учебного leaf с subjectAltName backup.example.test выполнены две отдельные проверки.

openssl verify -CAfile root.pem -untrusted intermediate.pem -verify_hostname backup.example.test leaf.pem

leaf.pem: OK

openssl verify -CAfile root.pem -untrusted intermediate.pem -verify_hostname other.example.test leaf.pem

CN = backup.example.test error 62 at 0 depth lookup: hostname mismatch error leaf.pem: verification failed

Совпавшее имя дало код 0, другое имя — error 62 и код 2. Поэтому отчёт «цепочка корректна» и отчёт «сертификат подходит имени» должны оставаться двумя явными проверками.

Протокол воспроизводимого теста

  • Root CA создан самоподписанным с CA:TRUE и keyCertSign.

  • Intermediate CA подписан root и ограничен pathlen:0.

  • Leaf подписан intermediate, содержит CA:FALSE, serverAuth и DNS:backup.example.test.

  • Без intermediate получены error 20 и exit 2.

  • С root и -untrusted intermediate получены OK и exit 0.

  • Intermediate как -CAfile без -partial_chain дал error 2 и exit 2; с -partial_chain — OK и exit 0.

  • Неверный root дал error 20 на depth 1 и exit 2.

  • Правильное имя прошло с exit 0; другое имя дало error 62 и exit 2.

Все ключи и сертификаты были созданы только внутри временного каталога и удалены после теста. Они не относятся к клиенту или домену рабочей системы. Пример проверяет поведение локального валидатора, а не настройку конкретного веб-сервера.

Порядок проверки рабочей цепочки

  1. Зафиксируйте версию OpenSSL, проверяемый leaf, ожидаемое DNS-имя и доверенное корневое хранилище.

  2. Получите intermediate из проверенного источника и не смешивайте его с приватным ключом.

  3. Сначала выполните verify с явными -CAfile и -untrusted, затем сохраните -show_chain и код завершения.

  4. Если ошибка указывает depth 0, проверьте наличие издателя leaf; если depth 1 — связь intermediate с выбранным root.

  5. Отдельно выполните -verify_hostname или -verify_ip согласно типу адреса.

  6. Не применяйте -partial_chain, -no_check_time и отключение проверок без документированного требования.

  7. После локальной проверки проверьте фактический набор сертификатов, который отдаёт сервис, и повторите проверку тем TLS-клиентом, которым пользуетесь.

Для публичного сайта фактический сертификат, срок и переданную цепочку можно дополнительно проверить через встроенную SSL-проверку. Локальная модель и внешний ответ сервера решают разные задачи.

Границы примера

  • Тест не выполняет TLS-handshake, SNI и сетевой запрос.

  • Не проверяются OCSP, CRL и доступность URL отзыва.

  • Не исследуются порядок сертификатов в конфигурации конкретного nginx, Apache или панели.

  • Учебные сертификаты действуют три дня; это не рекомендация по срокам рабочих сертификатов.

  • Проверка цепочки не подтверждает соответствие leaf приватному ключу и не заменяет проверку прав на файлы.

  • Коды и тексты ошибок относятся к OpenSSL 3.0.13; в другой версии формулировка может отличаться.

Критерий готовности: команда с ожидаемым root и явным intermediate завершается кодом 0, -show_chain заканчивается на нужном trust anchor, а отдельная проверка имени также проходит. Любая ошибка требует разбора глубины и источника сертификата, а не случайного расширения доверенного хранилища.

Обсуждение 0

Делись опытом и задавай вопросы. Комментарии без ссылок появляются после проверки редактором.

Пока никто не написал. Начни обсуждение.