Mensagem de erro
npm error code SELF_SIGNED_CERT_IN_CHAIN
Também aparece como
- 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
O npm 10 e posteriores imprimem “npm error code SELF_SIGNED_CERT_IN_CHAIN”; o npm 9 e anteriores, “npm ERR! code SELF_SIGNED_CERT_IN_CHAIN”. As linhas seguintes repetem o código como errno e citam a URL com “reason: self-signed certificate in certificate chain”.
npm (Node.js) — registry request over HTTPS
O que significa
A conexão com o registro apresentou uma cadeia de certificados que termina em uma raiz autoassinada que o Node.js não conhece. No caso do registry.npmjs.org, isso significa que o tráfego está sendo interceptado e reassinado, quase sempre por um proxy da empresa ou por um antivírus com inspeção de HTTPS, em cuja raiz o navegador confia, mas o npm não.
Por que acontece
Um proxy corporativo com inspeção de TLS
comumZscaler, Netskope, Palo Alto, Fortinet e produtos semelhantes ficam entre a sua máquina e o registro e apresentam a própria raiz na cadeia.
Antivírus ou proteção de endpoint com inspeção de HTTPS
ocasionalAlguns produtos de endpoint interceptam o TLS localmente na máquina e injetam a raiz deles só no repositório do sistema operacional.
Um registro privado que envia a própria raiz
ocasionalRegistros internos cujo certificado foi assinado por uma CA da empresa e que servem a raiz na cadeia ainda precisam que o Node.js confie nessa raiz.
Como corrigir
- 1.
Passar a raiz do proxy ao npm com cafile
Exporte o certificado raiz (obtido com a equipe de TI ou a partir do trust store do sistema operacional) como PEM e defina-o como o cafile do npm. A partir daí, o npm confia só nas CAs desse arquivo; por isso, em notebooks que também são usados fora da rede da empresa, adicione as raízes públicas ao mesmo arquivo ou prefira NODE_EXTRA_CA_CERTS.
bash npm config set cafile /etc/ssl/private-ca/corp-proxy-root.pem npm install - 2.
Ou definir NODE_EXTRA_CA_CERTS
Adiciona a raiz para o npm e para todas as outras ferramentas Node.js sem substituir as raízes públicas do Node.js. No Windows, defina-a como variável de ambiente do usuário e abra um novo terminal.
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.
Ou deixar o Node.js usar o repositório do sistema operacional
Com NODE_USE_SYSTEM_CA=1, o Node.js (e o npm) passa a confiar no que o sistema operacional considera confiável, e em máquinas gerenciadas isso inclui a raiz do proxy.
bash # Managed machines already trust the proxy root in the OS store NODE_USE_SYSTEM_CA=1 npm install - 4.
Diagnóstico temporário: --strict-ssl=false
Só para confirmar que o problema é de confiança. Pacotes executam scripts de instalação, então aceitar downloads não verificados é o caminho pelo qual ataques à cadeia de suprimentos chegam às máquinas dos desenvolvedores; nunca coloque strict-ssl=false no .npmrc.
bash # Temporary diagnostic for one command only npm install --strict-ssl=false
Erros relacionados
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)