Сообщение об ошибке
npm error code DEPTH_ZERO_SELF_SIGNED_CERT
Также выводится как
- npm ERR! code DEPTH_ZERO_SELF_SIGNED_CERT
npm 10 и новее выводят «npm error code DEPTH_ZERO_SELF_SIGNED_CERT», npm 9 и более ранние версии — «npm ERR! code DEPTH_ZERO_SELF_SIGNED_CERT». В строке причины написано «self-signed certificate», а в последних версиях Node.js к ней добавляется подсказка про --use-system-ca.
npm (Node.js) — registry request over HTTPS
Что это означает
Реестр, к которому подключился npm, предъявил единственный самоподписанный сертификат, которому Node.js не доверяет. Цепочки CA нет вообще, поэтому выхода только два: осознанно доверять именно этому сертификату или выдать реестру сертификат, выпущенный CA. Обычно это локальные или самостоятельно развёрнутые реестры, запущенные со сгенерированным сертификатом.
Почему это происходит
Локальный или самостоятельно развёрнутый реестр со сгенерированным сертификатом
частоVerdaccio, пробная версия Nexus или Artifactory либо контейнер с реестром, запущенный с самоподписанным сертификатом.
Устройство или прокси с заводским сертификатом
иногдаНекоторые кеширующие прокси и сетевые устройства предъявляют самоподписанный сертификат, пока не установлен нормальный.
Ingress в Kubernetes отвечает сертификатом по умолчанию
иногдаЕсли хост реестра не настроен в ingress, тот отдаёт самоподписанный сертификат по умолчанию (в ingress-nginx это «Kubernetes Ingress Controller Fake Certificate»).
Как исправить
- 1.
Доверяйте именно этому сертификату
Получите сертификат, сравните его отпечаток SHA-256 с тем, что показан на хосте реестра, затем добавьте его через NODE_EXTRA_CA_CERTS (или параметр cafile в npm).
bash # Save the registry's certificate, check its fingerprint, and trust exactly this file openssl s_client -connect registry.example.com:443 -servername registry.example.com </dev/null 2>/dev/null \ | openssl x509 -out registry.pem openssl x509 -in registry.pem -noout -fingerprint -sha256 NODE_EXTRA_CA_CERTS=$PWD/registry.pem npm install - 2.
Используйте частный реестр только для своего scope
Если направлять в частный реестр только scope вашей организации, все публичные пакеты по-прежнему загружаются с registry.npmjs.org, и проблема с сертификатом на частном хосте их не затронет.
ini ; .npmrc — only @acme packages come from the private registry; the rest from npmjs @acme:registry=https://registry.example.com/ - 3.
Выдайте реестру сертификат, выпущенный CA
Сертификат от публичного CA (ACME) или от корпоративного CA, которому ваши машины уже доверяют, избавляет от необходимости в исключениях для отдельных сертификатов.
bash # Give the registry a certificate from a CA your machines trust (public ACME or company CA) sudo certbot certonly --standalone -d registry.example.com