Перейти к содержимому
ecdsa.com
npm (Node.js)Менеджеры пакетов

Сообщение об ошибке

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 не скачивает недостающий сертификат сам, чтобы это исправить.

Почему это происходит

Как исправить

  1. 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. 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. 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

Связанные ошибки

Открыть всю базу ошибок подписей