Сообщение об ошибке
Error: ERR_PNPM_RESOLVING_NPM_RESOLVER_NETWORK_ERROR
Также выводится как
- Error: ERR_PNPM_PACKAGE_MANAGER_ADD_RESOLVE_LATEST
Код в первой строке зависит от команды: ERR_PNPM_RESOLVING_NPM_RESOLVER_NETWORK_ERROR для pnpm install, ERR_PNPM_PACKAGE_MANAGER_ADD_RESOLVE_LATEST для pnpm add. Цепочка причин под ним выглядит так: «Failed to fetch metadata from <url>: error sending request: client error (Connect): invalid peer certificate: UnknownIssuer»; строки переносятся по ширине 80 символов. pnpm 10 и более ранние версии работают на Node.js и вместо этого выдают коды Node.js, например SELF_SIGNED_CERT_IN_CHAIN или UNABLE_TO_GET_ISSUER_CERT_LOCALLY.
pnpm 12 (native binary, rustls) — registry request over HTTPS fails with "invalid peer certificate: UnknownIssuer"
Что это означает
pnpm 12 не смог получить метаданные пакета из реестра, и цепочка причин, которую он выводит, заканчивается строкой «invalid peer certificate: UnknownIssuer» — это ошибка проверки TLS. pnpm 12 — нативный исполняемый файл, HTTP-клиент которого проверяет сертификаты с помощью rustls, а «UnknownIssuer» — единый код rustls для любой ошибки построения цепочки: неизвестный частный CA, корневой сертификат прокси, отсутствующий промежуточный сертификат или самоподписанный сертификат.
Почему это происходит
Сначала посмотрите на последнюю строку: этот код выдаётся и при обычных сетевых ошибках
частоКод ERR_PNPM_RESOLVING_NPM_RESOLVER_NETWORK_ERROR выдаётся и при ошибках DNS, соединения и прокси. Проблема в сертификате, только если цепочка причин заканчивается на «invalid peer certificate».
Частный реестр с корпоративным сертификатом
частоВнутренние реестры с сертификатами, подписанными корпоративным CA, которого нет в списке доверенных CA у pnpm.
Прокси с инспекцией TLS
частоВ корпоративных сетях прокси переподписывает registry.npmjs.org своим корневым сертификатом.
Реестр отдаёт самоподписанный сертификат или только конечный сертификат
иногдаrustls не различает эти случаи: самоподписанный сертификат и отсутствующий промежуточный сертификат тоже приводят к UnknownIssuer.
Как исправить
- 1.
Задайте cafile в .npmrc
pnpm читает файлы конфигурации в формате npm; cafile (или параметр ca, в котором сертификат записан прямо в значении) добавляет CA для запросов к реестру.
ini ; .npmrc (project or ~/.npmrc) — read by pnpm as well as npm cafile=/etc/ssl/private-ca/corp-root-ca.pem - 2.
Установите корневой сертификат в хранилище операционной системы
В нашей проверке pnpm 12 принял корневой сертификат, добавленный через update-ca-certificates, так что корневые сертификаты, развёрнутые ИТ-отделом, работают без дополнительной настройки.
bash # pnpm 12 also trusts the operating system's store sudo cp corp-root-ca.pem /usr/local/share/ca-certificates/corp-root-ca.crt sudo update-ca-certificates - 3.
Или используйте NODE_EXTRA_CA_CERTS
pnpm 12 тоже учитывает эту переменную, так что для Node.js, npm и pnpm достаточно одной настройки.
bash # Honoured by pnpm 12 too, so one variable covers node, npm and pnpm export NODE_EXTRA_CA_CERTS=/etc/ssl/private-ca/corp-root-ca.pem pnpm install