Сообщение об ошибке
npm error code SELF_SIGNED_CERT_IN_CHAIN
Также выводится как
- npm ERR! code SELF_SIGNED_CERT_IN_CHAIN
- npm error request to https://registry.example.com/lodash failed, reason: self-signed certificate in certificate chain
npm 10 и новее выводят «npm error code SELF_SIGNED_CERT_IN_CHAIN», npm 9 и более ранние версии — «npm ERR! code SELF_SIGNED_CERT_IN_CHAIN». В следующих строках код повторяется как errno и указывается URL с «reason: self-signed certificate in certificate chain».
npm (Node.js) — registry request over HTTPS
Что это означает
npm подключился к реестру и получил цепочку сертификатов, которая заканчивается самоподписанным корневым сертификатом, неизвестным Node.js. Для registry.npmjs.org это означает, что трафик перехватывают и переподписывают — почти всегда это делает корпоративный прокси или антивирус со сканированием HTTPS, корневому сертификату которого браузер доверяет, а npm — нет.
Почему это происходит
Корпоративный прокси с инспекцией TLS
частоZscaler, Netskope, Palo Alto, Fortinet и подобные продукты стоят между вашей машиной и реестром и предъявляют в цепочке собственный корневой сертификат.
Антивирус или средство защиты конечных точек со сканированием HTTPS
иногдаНекоторые средства защиты конечных точек перехватывают TLS прямо на машине и добавляют свой корневой сертификат только в хранилище ОС.
Частный реестр отправляет собственный корневой сертификат
иногдаЕсли внутренний реестр с сертификатом от корпоративного CA отдаёт корневой сертификат в своей цепочке, Node.js всё равно должен доверять этому корневому сертификату.
Как исправить
- 1.
Передайте npm корневой сертификат прокси через cafile
Экспортируйте корневой сертификат в формате PEM (его можно получить у ИТ-отдела или из хранилища доверенных сертификатов ОС) и укажите этот файл как cafile в npm. После этого npm доверяет только CA из этого файла, поэтому на ноутбуках, которые работают и вне корпоративной сети, добавьте в тот же файл публичные корневые сертификаты или лучше используйте NODE_EXTRA_CA_CERTS.
bash npm config set cafile /etc/ssl/private-ca/corp-proxy-root.pem npm install - 2.
Или задайте NODE_EXTRA_CA_CERTS
Переменная добавляет корневой сертификат для npm и всех остальных инструментов на Node.js, не заменяя публичные корневые сертификаты Node.js. В Windows задайте её как пользовательскую переменную окружения и откройте новый терминал.
bash # Windows (PowerShell): setx NODE_EXTRA_CA_CERTS C:\certs\corp-proxy-root.pem export NODE_EXTRA_CA_CERTS=/etc/ssl/private-ca/corp-proxy-root.pem npm install - 3.
Или разрешите Node.js использовать хранилище ОС
С NODE_USE_SYSTEM_CA=1 Node.js (и npm) доверяет тому же, чему доверяет операционная система, а на управляемых машинах сюда входит и корневой сертификат прокси.
bash # Managed machines already trust the proxy root in the OS store NODE_USE_SYSTEM_CA=1 npm install - 4.
Временная диагностика: --strict-ssl=false
Только чтобы убедиться, что проблема в доверии. Пакеты запускают скрипты установки, поэтому приём непроверенных загрузок — именно тот путь, которым атаки на цепочку поставок попадают на машины разработчиков; никогда не прописывайте strict-ssl=false в .npmrc.
bash # Temporary diagnostic for one command only npm install --strict-ssl=false
Связанные ошибки
self-signed certificate in certificate chainNode.js tls / https / fetchnpm error code UNABLE_TO_GET_ISSUER_CERT_LOCALLYnpm (Node.js)error Error: self-signed certificate in certificate chainYarn Classic (1.x)Error: ERR_PNPM_RESOLVING_NPM_RESOLVER_NETWORK_ERRORpnpm 12 (native binary, rustls)fatal: unable to access 'https://git.example.com/team/app.git/': SSL certificat…git over HTTPS with libcurl + OpenSSL (Git for Windows default, macOS Homebrew, Alpine, RHEL)