Aller au contenu
ecdsa.com
Node.js tls / https / fetchNode.js crypto

Message d’erreur

self-signed certificate in certificate chain

Également affiché sous la forme

  • code: 'SELF_SIGNED_CERT_IN_CHAIN'
  • SELF_SIGNED_CERT_IN_CHAIN

Node.js 16 et les versions antérieures (OpenSSL 1.1.1) l’écrivaient « self signed certificate in certificate chain ». Avec fetch(), il s’agit de la cause de « TypeError: fetch failed » ; npm l’affiche sous la forme « 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)

Ce que cela signifie

La chaîne envoyée par le serveur se termine par un certificat racine auto-signé qui ne figure pas parmi les racines auxquelles Node.js fait confiance. Sur un réseau d’entreprise, c’est la signature typique d’un proxy d’inspection TLS : il re-signe chaque site avec sa propre racine et inclut cette racine dans la chaîne. Node.js utilise la liste de racines Mozilla qu’il embarque, et non le magasin de certificats du système d’exploitation où le service informatique a installé la racine du proxy.

Pourquoi cela se produit

Comment corriger l’erreur

  1. 1.

    Voir qui a émis la chaîne

    Parcourez la chaîne de certificats présentée par un site public. Si le certificat du sommet porte le nom de votre entreprise ou d’un éditeur de solutions de sécurité, faites confiance à cette racine ; s’il est inconnu, enquêtez avant d’accorder votre confiance à quoi que ce soit.

    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.

    Ajouter la racine avec NODE_EXTRA_CA_CERTS

    Les certificats du fichier s’ajoutent aux racines intégrées pour chaque connexion TLS du processus, y compris npm, yarn et fetch. Définissez la variable avant le démarrage du processus.

    bash
    export NODE_EXTRA_CA_CERTS=/etc/ssl/private-ca/corp-proxy-root.pem
    node app.js
  3. 3.

    Utiliser le magasin du système d’exploitation

    --use-system-ca ou NODE_USE_SYSTEM_CA=1 fait accepter à Node.js les racines approuvées par le système d’exploitation : la racine du proxy déployée par le service informatique fonctionne donc sans copie de fichiers.

    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.

    Diagnostic temporaire : NODE_TLS_REJECT_UNAUTHORIZED=0

    Désactive la vérification des certificats pour tout le processus. Ne l’utilisez que le temps d’une exécution, pour confirmer la cause ; derrière un proxy d’interception, cela masque aussi tout attaquant qui n’est pas le proxy.

    bash
    # Temporary diagnostic only: confirms trust is the only problem, then remove it
    NODE_TLS_REJECT_UNAUTHORIZED=0 node app.js

Erreurs associées

Parcourir toute la base de données des erreurs de signature