Zum Inhalt springen
ecdsa.com
npm (Node.js)Paketmanager

Fehlermeldung

npm error code UNABLE_TO_VERIFY_LEAF_SIGNATURE

Auch ausgegeben als

  • npm ERR! code UNABLE_TO_VERIFY_LEAF_SIGNATURE
  • npm error request to https://registry.example.com/lodash failed, reason: unable to verify the first certificate

npm 10 und neuer geben „npm error code UNABLE_TO_VERIFY_LEAF_SIGNATURE“ aus, npm 9 und älter „npm ERR! code UNABLE_TO_VERIFY_LEAF_SIGNATURE“. Neuere Node.js-Versionen hängen „; if the root CA is installed locally, try running Node.js with --use-system-ca“ an die reason-Zeile an.

npm (Node.js) — registry request over HTTPS

Was der Fehler bedeutet

Die Registry (oder ein vorgeschalteter Proxy) hat nur das eigene Zertifikat gesendet, und Node.js konnte das Zertifikat nicht finden, das es ausgestellt hat. Ohne den Aussteller lässt sich die Signatur des Leaf-Zertifikats überhaupt nicht prüfen. Das ist ein Konfigurationsproblem des Servers: Im Handshake fehlt das Zwischenzertifikat, und Node.js behebt das nicht, indem es dieses Zertifikat herunterlädt.

Warum der Fehler auftritt

So behebst du den Fehler

  1. 1.

    Zertifikate im Handshake zählen

    Erscheint nur das Zertifikat auf Tiefe 0, mit einem Zwischenzertifikat als Aussteller, ist bestätigt, dass das Zwischenzertifikat fehlt.

    bash
    openssl s_client -connect registry.example.com:443 -servername registry.example.com -showcerts </dev/null 2>/dev/null \
      | grep -E '^ *[0-9]+ s:|^ *i:'
  2. 2.

    Vollständige Kette auf der Registry ausliefern

    Konfiguriere den TLS-Terminator vor der Registry mit dem Leaf-Zertifikat und den Zwischenzertifikaten. Das behebt das Problem für npm, yarn, pnpm, Docker und jeden anderen Client auf einmal.

    text
    # Registry behind nginx: serve leaf + intermediate(s)
    ssl_certificate     /etc/nginx/tls/registry.example.com.fullchain.pem;
    ssl_certificate_key /etc/nginx/tls/registry.example.com.key;
  3. 3.

    Übergangslösung: dem Zwischenzertifikat auf dem Client vertrauen

    Setzt du cafile auf eine Datei mit dem Zwischenzertifikat und seinem Root-Zertifikat, kann npm das Leaf-Zertifikat prüfen, bis der Server korrigiert ist; cafile ersetzt die Standard-Root-Zertifikate für npm, nimm also auch öffentliche Root-Zertifikate auf, wenn dasselbe npm auch registry.npmjs.org nutzt.

    bash
    # Until the registry is fixed: trust the intermediate (plus its root) on the client
    cat issuing-ca.pem corp-root-ca.pem > /etc/ssl/private-ca/registry-ca.pem
    npm config set cafile /etc/ssl/private-ca/registry-ca.pem

Verwandte Fehler

Gesamte Signaturfehler-Datenbank durchsuchen