Mensagem de erro
self-signed certificate in certificate chain
Também aparece como
- code: 'SELF_SIGNED_CERT_IN_CHAIN'
- SELF_SIGNED_CERT_IN_CHAIN
O Node.js 16 e versões anteriores (OpenSSL 1.1.1) grafavam a mensagem como “self signed certificate in certificate chain”. Com fetch(), ela aparece como a causa de “TypeError: fetch failed”; o npm a imprime como “npm error code SELF_SIGNED_CERT_IN_CHAIN”.
Node.js tls / https / fetch — code SELF_SIGNED_CERT_IN_CHAIN (OpenSSL X509_V_ERR_SELF_SIGNED_CERT_IN_CHAIN, 19)
O que significa
A cadeia enviada pelo servidor termina em um certificado raiz autoassinado que não está entre as raízes em que o Node.js confia. Em uma rede corporativa, esse é o sinal característico de um proxy com inspeção de TLS: ele reassina todos os sites com a própria raiz e inclui essa raiz na cadeia. O Node.js usa a lista de raízes da Mozilla embutida nele, e não o repositório do sistema operacional, onde a TI instalou a raiz do proxy.
Por que acontece
Um proxy ou antivírus com inspeção de TLS
comumZscaler, Netskope, Fortinet, Palo Alto e antivírus que inspecionam HTTPS apresentam a própria raiz. Os navegadores confiam nela pelo repositório do sistema operacional; o Node.js, por padrão, não.
Um serviço privado envia a própria raiz
comumServidores internos que incluem a raiz da empresa na cadeia ainda precisam que essa raiz seja confiável no cliente; enviá-la não prova nada.
A raiz está instalada no sistema operacional, mas o Node.js usa a própria lista
ocasionalO Node.js traz as raízes da Mozilla dentro do binário e ignora o repositório do sistema, a menos que --use-system-ca ou NODE_USE_SYSTEM_CA=1 esteja definido.
Como corrigir
- 1.
Ver quem emitiu a cadeia
Percorra a cadeia de certificados recebida de um site público. Se o certificado do topo tiver o nome da sua empresa ou de um fornecedor de segurança, confie nessa raiz; se for desconhecido, investigue antes de confiar em qualquer coisa.
bash openssl s_client -connect registry.npmjs.org:443 -servername registry.npmjs.org -showcerts </dev/null 2>/dev/null \ | grep -E '^ *[0-9]+ s:|^ *i:' # The last line pair shows the root the chain ends in (s: and i: identical) - 2.
Adicionar a raiz com NODE_EXTRA_CA_CERTS
Os certificados do arquivo são somados às raízes embutidas em todas as conexões TLS do processo, inclusive no npm, no yarn e no fetch. Defina a variável antes de o processo iniciar.
bash export NODE_EXTRA_CA_CERTS=/etc/ssl/private-ca/corp-proxy-root.pem node app.js - 3.
Usar o repositório do sistema operacional
Com --use-system-ca ou NODE_USE_SYSTEM_CA=1, o Node.js aceita as raízes em que o sistema operacional confia, então a raiz do proxy distribuída pela TI funciona sem copiar arquivos.
bash # Managed machines already trust the proxy root in the OS store node --use-system-ca app.js NODE_USE_SYSTEM_CA=1 npm run build - 4.
Diagnóstico temporário: NODE_TLS_REJECT_UNAUTHORIZED=0
Desativa a verificação de certificados no processo inteiro. Use apenas em uma execução, para confirmar a causa; atrás de um proxy que intercepta o tráfego, isso também esconde qualquer atacante que não seja o proxy.
bash # Temporary diagnostic only: confirms trust is the only problem, then remove it NODE_TLS_REJECT_UNAUTHORIZED=0 node app.js