Pular para o conteúdo
ecdsa.com
Node.js tls / https / fetchMódulo crypto do Node.js

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

Como corrigir

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

Erros relacionados

Ver toda a base de erros de assinatura