Сообщение об ошибке
npm error code UNABLE_TO_VERIFY_LEAF_SIGNATURE
Также выводится как
- npm ERR! code UNABLE_TO_VERIFY_LEAF_SIGNATURE
- npm error request to https://registry.example.com/lodash failed, reason: unable to verify the first certificate
npm 10 и новее выводят «npm error code UNABLE_TO_VERIFY_LEAF_SIGNATURE», npm 9 и более ранние версии — «npm ERR! code UNABLE_TO_VERIFY_LEAF_SIGNATURE». Последние версии Node.js добавляют к строке причины «; if the root CA is installed locally, try running Node.js with --use-system-ca».
npm (Node.js) — registry request over HTTPS
Что это означает
Реестр (или прокси перед ним) отправил только собственный сертификат, и Node.js не нашёл сертификат его издателя. Без издателя подпись конечного сертификата вообще невозможно проверить. Это проблема конфигурации сервера: в рукопожатии нет промежуточного сертификата, а Node.js не скачивает недостающий сертификат сам, чтобы это исправить.
Почему это происходит
Частный реестр отдаёт только конечный сертификат
частоNexus, Artifactory, Verdaccio или обратный прокси перед ними, в которых при установке указан cert.pem вместо полной цепочки.
Прокси предъявляет только свой конечный сертификат
иногдаНекоторые прокси с инспекцией TLS отправляют сертификат, выпущенный промежуточным CA, но не включают сам этот промежуточный сертификат.
Конечный сертификат от неизвестного частного CA
иногдаЕсли Node.js не знает ни одного сертификата выше конечного, появляется тот же код; ошибку устраняет доверие к этому CA (и к его промежуточному сертификату).
Как исправить
- 1.
Посчитайте сертификаты в рукопожатии
Отсутствие промежуточного сертификата подтверждает только такая картина: виден лишь сертификат глубины 0, а его издатель — промежуточный CA.
bash openssl s_client -connect registry.example.com:443 -servername registry.example.com -showcerts </dev/null 2>/dev/null \ | grep -E '^ *[0-9]+ s:|^ *i:' - 2.
Отдавайте из реестра полную цепочку
Передайте узлу, который терминирует TLS перед реестром, конечный сертификат вместе с промежуточными. Это сразу исправляет ошибку для npm, yarn, pnpm, Docker и всех остальных клиентов.
text # Registry behind nginx: serve leaf + intermediate(s) ssl_certificate /etc/nginx/tls/registry.example.com.fullchain.pem; ssl_certificate_key /etc/nginx/tls/registry.example.com.key; - 3.
Обходной путь: добавьте промежуточный сертификат в доверенные на клиенте
Файл cafile с промежуточным сертификатом и его корневым сертификатом позволяет npm проверять конечный сертификат, пока сервер не исправят; cafile заменяет для npm корневые сертификаты по умолчанию, поэтому, если этот же npm обращается и к registry.npmjs.org, добавьте в файл и публичные корневые сертификаты.
bash # Until the registry is fixed: trust the intermediate (plus its root) on the client cat issuing-ca.pem corp-root-ca.pem > /etc/ssl/private-ca/registry-ca.pem npm config set cafile /etc/ssl/private-ca/registry-ca.pem