#Симптомы и условия возникновения
Запрос https.get() или fetch из Node.js завершается кодами UNABLE_TO_VERIFY_LEAF_SIGNATURE, SELF_SIGNED_CERT_IN_CHAIN, CERT_HAS_EXPIRED либо несовпадением имени. Причину устанавливают по сертификату удалённого сервера и доверенным корням клиентской среды. Для начала проверьте используемую версию среды и точный текст ошибки на копии проекта, не меняя рабочий сервер.
#Причины и как их отличить
| Возможная причина | Как узнать | Что делать |
|---|---|---|
| Сервер не отдаёт промежуточный сертификатВ этой ситуации наблюдается конкретный диагностический признак. Сопоставьте его с журналом ошибки и результатом соответствующей проверки, прежде чем выбирать исправление. | Ошибка цепочки наблюдается у нескольких клиентов | Администратор сервера должен настроить полную цепочку. |
| Корпоративный посредникВ этой ситуации наблюдается конкретный диагностический признак. Сопоставьте его с журналом ошибки и результатом соответствующей проверки, прежде чем выбирать исправление. | Сертификат выдаёт корпоративный центр, браузер работает, Node — нет | Получить утверждённый сертификат центра и настроить доверие. |
| Истёк сертификат или неправильное времяВ этой ситуации наблюдается конкретный диагностический признак. Сопоставьте его с журналом ошибки и результатом соответствующей проверки, прежде чем выбирать исправление. | CERT_HAS_EXPIRED или CERT_NOT_YET_VALID | Исправить время или заменить сертификат на стороне владельца. |
#Пошаговая диагностика и решение
- 1. Запишите код и домен запросаИз журнала скопируйте
error.codeи домен назначения без токенов и параметров запроса. Различайте сбой при установке TLS и ответ HTTP 403/500: во втором случае TLS мог успешно пройти.
- 2. Проверьте системное время и адресНа клиенте проверьте дату, часовой пояс и точный домен из URL. Нельзя подменять адрес IP: проверка имени сертификата выполняется по имени сервера. Исправление неправильного времени выполните штатными настройками ОС.
- 3. Сравните сертификат через curlВ терминале того же компьютера запустите
curl -Iv https://example.com/с реальным доменом. Успех curl не гарантирует успех Node: наборы доверенных сертификатов могут различаться. Не используйте флаг -k.Linux · Терминал (Bash)КомандаКоманда не передаёт пароль; замените example.com на свой домен без секретных параметров. Ожидается успешная проверка TLS и HTTP-заголовки.curl -Iv https://example.com/
- 4. Отделите проблему сервера от доверия клиентаЕсли разные машины не доверяют цепочке — проверьте промежуточные сертификаты и срок действия на сервере. Если проблема только на корпоративной сети, выясните у администратора, есть ли официальный TLS-посредник; не устанавливайте произвольные сертификаты из интернета.
- 5. Добавьте утверждённый центр сертификацииЕсли организация выдаёт файл доверенного корневого центра в PEM, можно указать путь
NODE_EXTRA_CA_CERTSДО запуска процесса Node. В Linux экспортируйте переменную только в тестовом терминале. Для systemd настройка должна быть в управляемом конфигурационном файле службы, без хранения секретов.Linux · Терминал (Bash)КомандаLinux/macOS, тестовый запуск без root; пример пути замените подтверждённым PEM. Переменная читается при старте Node.NODE_EXTRA_CA_CERTS=/etc/ssl/company/approved-root.pem node app.js
- 6. Проверьте особые настройки TLSВ приложении найдите
https.Agent({ca: ...})илиtls.connect({ca: ...}): явное поле ca меняет список доверенных сертификатов для этого подключения. Исправляйте его по документации вашей библиотеки; NODE_EXTRA_CA_CERTS может не повлиять.
- 7. Подтвердите цепочку и верните штатный запускПовторите исходный запрос и проверьте код ответа и адрес назначения. Удалите временные переменные из тестового терминала после проверки. Если сервер отдаёт плохую цепочку, обратитесь к владельцу: клиентским обходом исправлять её нельзя.
#Как проверить результат и что делать, если не помогло
При повторном HTTPS-запросе нет TLS-кода ошибки, сертификат соответствует домену и проверяется без отключения защиты. При повторении сохраните код и сведения о доверенной цепочке для администратора.
Если неисправность повторилась, выпишите первый код ошибки и действие, на котором она возвращается. Сравните версию Node.js/npm, рабочий каталог, настройки процесса и журнал тестового запуска. Откатите только внесённые изменения из предварительно сохранённой копии, затем разберите причину на отдельной среде.