Zum Inhalt springen
ecdsa.com
Node.js tls / https / fetchNode.js crypto

Fehlermeldung

self-signed certificate in certificate chain

Auch ausgegeben als

  • code: 'SELF_SIGNED_CERT_IN_CHAIN'
  • SELF_SIGNED_CERT_IN_CHAIN

Node.js 16 und älter (OpenSSL 1.1.1) schrieben „self signed certificate in certificate chain“. Bei fetch() ist die Meldung die Ursache von „TypeError: fetch failed“; npm gibt sie als „npm error code SELF_SIGNED_CERT_IN_CHAIN“ aus.

Node.js tls / https / fetch — code SELF_SIGNED_CERT_IN_CHAIN (OpenSSL X509_V_ERR_SELF_SIGNED_CERT_IN_CHAIN, 19)

Was der Fehler bedeutet

Die vom Server gesendete Kette endet bei einem selbstsignierten Root-Zertifikat, das nicht zu den Root-Zertifikaten gehört, denen Node.js vertraut. In einem Firmennetzwerk ist das die typische Handschrift eines Proxys mit TLS-Inspektion: Er signiert jede Website mit seinem eigenen Root-Zertifikat neu und nimmt dieses Root-Zertifikat in die Kette auf. Node.js verwendet seine mitgelieferte Root-Liste von Mozilla, nicht den Trust Store des Betriebssystems, in dem die IT das Root-Zertifikat des Proxys installiert hat.

Warum der Fehler auftritt

So behebst du den Fehler

  1. 1.

    Nachsehen, wer die Kette ausgestellt hat

    Geh die Zertifikatskette des Peers durch, die du beim Verbinden mit einer öffentlichen Website erhältst. Trägt das oberste Zertifikat den Namen deiner Firma oder eines Security-Anbieters, vertraue diesem Root-Zertifikat; ist es unbekannt, kläre die Herkunft, bevor du irgendeinem Zertifikat vertraust.

    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.

    Root-Zertifikat mit NODE_EXTRA_CA_CERTS hinzufügen

    Die Zertifikate aus der Datei werden für jede TLS-Verbindung des Prozesses zu den eingebauten Root-Zertifikaten hinzugefügt, auch für npm, yarn und fetch. Setze die Variable, bevor der Prozess startet.

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

    Trust Store des Betriebssystems verwenden

    --use-system-ca oder NODE_USE_SYSTEM_CA=1 lässt Node.js Root-Zertifikate akzeptieren, denen das Betriebssystem vertraut; so funktioniert das von der IT verteilte Root-Zertifikat des Proxys, ohne dass du Dateien kopieren musst.

    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.

    Vorübergehende Diagnose: NODE_TLS_REJECT_UNAUTHORIZED=0

    Schaltet die Zertifikatsprüfung für den gesamten Prozess ab. Nutze das nur für einen einzigen Lauf, um die Ursache zu bestätigen; hinter einem abfangenden Proxy verbirgt es zudem jeden Angreifer, der nicht der Proxy selbst ist.

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

Verwandte Fehler

Gesamte Signaturfehler-Datenbank durchsuchen