Битлента
Ошибки и коды3 мин чтения·

unable to get local issuer certificate: не найден издатель сертификата

Что значит сообщение unable to get local issuer certificate в Node.js, curl, git и других программах, какие причины бывают чаще всего и как это исправить.

Как читать это сообщение

Фраза «unable to get local issuer certificate» пришла из библиотеки OpenSSL и встречается в самых разных программах: Node.js, Python, git, curl, Docker. Дословно: не удалось найти локально сертификат того, кто выдал проверяемый сертификат. Программа получила от сервера сертификат, посмотрела, кто его подписал, и не обнаружила этого издателя среди доверенных.

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

Три основные ситуации

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

Вторая: ваша система или окружение не знают нужный корневой сертификат. Старый образ контейнера, минимальная установка, устаревшая версия Node.js со встроенным списком корневых сертификатов, Python-окружение со своим набором.

Третья: трафик проходит через устройство, которое подменяет сертификат своим: корпоративный шлюз, антивирус с проверкой HTTPS, отладочный прокси. Его корневой сертификат установлен в системе, но конкретная программа читает другой набор и о нём не знает.

Порядок проверки: unable to get local issuer certificate

Откройте адрес в браузере и изучите цепочку в сведениях сертификата. Если издатель там неожиданный (название организации, антивируса или прокси вместо публичного центра), вы на третьем сценарии. Если цепочка обычная, но в вашей программе ошибка, смотрите на набор сертификатов этой программы.

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

Затем убедитесь, что системные дата и время верны: при сдвиге часов сертификат может выглядеть недействительным, хотя сообщение будет другим.

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

🛡️ Остались проблемы с соединением?
Можно пользоваться постоянно: российские приложения работают, включать и выключать ничего не нужно. Без карты и регистрации, настройка за пару минут.
Попробовать бесплатно

Исправление без отключения защиты

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

Если в вашей сети действует корпоративный центр сертификации, получите его корневой сертификат у администратора и укажите программе через её настройку (у многих есть переменная окружения или параметр для пути к файлу сертификатов) либо добавьте в системное хранилище.

Отключение проверки, например переменной, которая говорит Node.js не проверять TLS, снимает ошибку, но и отменяет смысл шифрования: подмену сервера вы больше не заметите. Допустимо лишь на изолированной тестовой машине.

Признаки, что дело в сайте

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

Если вы владелец: проверьте, что в конфигурации указан файл полной цепочки, а не одиночный сертификат, и что после замены сертификата служба была перезагружена. Затем повторите запрос из чистой среды без ваших локальных настроек, чтобы убедиться, что цепочка полная для всех клиентов.

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

Как это выглядит в разных программах

В Node.js сообщение выглядит как ошибка запроса с кодом UNABLE_TO_GET_ISSUER_CERT_LOCALLY, у Python оно вплетено в исключение SSLError, у git оно идёт после слов про сертификат. Текст один, но лечится в каждой программе по-своему, потому что у каждой свой источник корневых сертификатов.

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

🛡️ Остались проблемы с соединением?
Можно пользоваться постоянно: российские приложения работают, включать и выключать ничего не нужно. Без карты и регистрации, настройка за пару минут.
Попробовать бесплатно
sslсертификатыцепочка доверияошибки

Часто задаваемые вопросы

Читайте также