Layer 8Ehrlicher Tech-Support
SoftwareSchweregrad: LästigUNABLE_TO_VERIFY_LEAF_SIGNATURE

Node.js: UNABLE_TO_VERIFY_LEAF_SIGNATURE trotz Firmen-CA

Node bricht mit UNABLE_TO_VERIFY_LEAF_SIGNATURE ab, obwohl die Firmen-CA im System liegt. Warum das passiert und was --use-system-ca dagegen tut.

Aufwand:
ca. 20 Min.
Gilt für:
Node.js 26

Das Symptom

npm install läuft nicht. Ein fetch gegen eine interne API läuft nicht. Node bricht mit UNABLE_TO_VERIFY_LEAF_SIGNATURE ab, manchmal auch mit DEPTH_ZERO_SELF_SIGNED_CERT oder UNABLE_TO_GET_ISSUER_CERT. Der Browser auf demselben Rechner, im selben Netz, mit derselben URL: völlig zufrieden, grünes Schloss, keine Warnung.

Die IT sagt, das Wurzelzertifikat der Firma sei ausgerollt und liege im Zertifikatsspeicher des Systems. Sie hat recht. Node interessiert das trotzdem nicht.

Die „Layer 8“-Wahrheit

Das ist kein Fehler in deinem Netz und kein Fehler in deinem Code, sondern eine Differenz darüber, wer eigentlich festlegt, wem zu trauen ist. Der Browser fragt den Vertrauensspeicher des Betriebssystems – und findet dort das Zertifikat, das eure IT ausgerollt hat. Node fragt ihn nicht automatisch. Deshalb sieht Node eine Kette, die bei einem unbekannten Aussteller endet, und tut das einzig Richtige: Es bricht ab.

Bemerkenswert ist, wie offen die Node-Doku diesen Stolperstein inzwischen behandelt. Bei Fehlern wie UNABLE_TO_VERIFY_LEAF_SIGNATURE, DEPTH_ZERO_SELF_SIGNED_CERT oder UNABLE_TO_GET_ISSUER_CERT hängt Node von sich aus einen Hinweis an, „suggesting that if the root CA is installed locally, try running with the --use-system-ca flag“. Und die Begründung dafür steht gleich dahinter: „to direct developers towards a secure solution, to prevent unsafe workarounds“. Das ist eine ungewöhnlich ehrliche Zeile in einer API-Doku – sie sagt im Klartext, dass hier reihenweise Leute die Zertifikatsprüfung abschalten, und versucht, sie vorher abzufangen.

Denn genau das ist der Layer-8-Anteil: Die erste Suchanfrage zu diesem Fehler führt zuverlässig zu einer Umgebungsvariable, die die Prüfung komplett ausknipst. Sie funktioniert sofort, sie ist eine Zeile, und sie verwandelt eine TLS-Verbindung in ein verschlüsseltes Gespräch mit einem beliebigen Unbekannten. Der Unterschied zwischen „Node kennt diese CA nicht“ und „Node prüft nicht mehr“ ist derselbe wie zwischen einem verschlossenen Türschloss und einem abmontierten. Die Ursache hier ist harmlos und die richtige Antwort ist genauso kurz wie die falsche.

Die echte, verifizierte Lösung

1000 % faktenbasiert. Jeder Befehl ist real, jeder Pfad existiert. Schritt für Schritt:

  1. 1.

    Die Fehlermeldung vollständig lesen

    Node hängt bei Zertifikatsfehlern von sich aus einen Hinweis an. Genau dieser Zusatz sagt dir, dass ein lokal installiertes Wurzelzertifikat die Erklärung sein könnte – er ist die Diagnose, nicht Beiwerk.

  2. 2.

    Prüfen, ob es überhaupt die Firmen-CA ist

    In Firmennetzen bricht ein TLS-abfangender Proxy die Verbindung auf und stellt ein eigenes Zertifikat aus. Die Kette einmal ansehen, um den Aussteller zu identifizieren, statt zu raten:

    openssl s_client -connect registry.npmjs.org:443 -showcerts
    
  3. 3.

    Node den System-Vertrauensspeicher benutzen lassen

    Ist das Wurzelzertifikat lokal bereits installiert, ist das der vorgesehene Weg. Node nennt den Schalter in der Fehlermeldung selbst, weil er zu einer sicheren Lösung führt statt an der Prüfung vorbei:

    node --use-system-ca app.js
    
  4. 4.

    Den Schalter dauerhaft setzen, wenn es passt

    Für alle Node-Aufrufe einer Sitzung lässt sich der Schalter über die Umgebung mitgeben, statt ihn an jedes Kommando zu hängen:

    export NODE_OPTIONS=--use-system-ca
    
  5. 5.

    Die Prüfung nicht abschalten

    Wer stattdessen die Zertifikatsprüfung deaktiviert, akzeptiert jedes beliebige Gegenüber. Der Hinweis in der Fehlermeldung existiert laut Doku ausdrücklich, um solche unsicheren Behelfslösungen zu verhindern – das ist eine Empfehlung, die man nicht überstimmen sollte.

Häufige Fragen (FAQ)

?Der Browser auf demselben Rechner zeigt keinen Fehler – warum Node schon?

Weil beide unterschiedliche Vorstellungen davon haben, welchen Wurzelzertifikaten zu trauen ist. Dass Node bei diesen Fehlern ausdrücklich auf --use-system-ca hinweist, sagt es deutlich: Ein lokal installiertes Wurzelzertifikat wird eben nicht automatisch von Node herangezogen.

?Was ist mit NODE_TLS_REJECT_UNAUTHORIZED=0?

Das ist genau der unsichere Umweg, gegen den der Hinweis in der Fehlermeldung gebaut wurde: Die Doku beschreibt den Hinweis als Weg zu einer sicheren Lösung, um unsichere Behelfslösungen zu verhindern. Wer die Prüfung abschaltet, hat kein TLS mehr, sondern nur noch Verschlüsselung ohne Gegenüberprüfung.

Belege

Diese Seite ist gegen die folgenden Primärquellen geprüft – Hersteller, Standard oder Gesetzestext. Wer es nicht glaubt, muss es nicht: Da steht, wo es nachzulesen ist.

Zuletzt geprüft am . Dokumentation altert – ein Datum daneben ist der einzige ehrliche Umgang damit.

Auch zu finden unter

Verwandte Fehler