Zum Inhalt springen
ecdsa.com
jose (JavaScript)JWT-Bibliotheken

Fehlermeldung

signature verification failed

jose (JavaScript) — JWSSignatureVerificationFailed, code ERR_JWS_SIGNATURE_VERIFICATION_FAILED

Was der Fehler bedeutet

jose hat die JWS erfolgreich geparst und die kryptografische Prüfung ausgeführt, aber die Signatur lässt sich mit dem ausgewählten Schlüssel nicht bestätigen. Struktur, Algorithmus und Schlüsseltyp waren alle in Ordnung – die Mathematik ging schlicht nicht auf, was auf den Schlüssel oder auf veränderte signierte Bytes hinweist.

Warum der Fehler auftritt

So behebst du den Fehler

  1. 1.

    Schlüssel per kid aus dem JWKS des Ausstellers ermitteln

    Lass jose für jedes Token den richtigen Schlüssel auswählen, statt per Pinning von Hand einen einzigen festzulegen; createRemoteJWKSet speichert Schlüssel zwischen und aktualisiert sie über Rotationen hinweg.

    js
    import { createRemoteJWKSet, jwtVerify } from "jose";
    
    const jwks = createRemoteJWKSet(new URL("https://issuer.example/.well-known/jwks.json"));
    const { payload } = await jwtVerify(token, jwks, {
      algorithms: ["ES256"],
      issuer: "https://issuer.example",
    });
  2. 2.

    Wenn du mit node:crypto signierst: rohes r‖s ausgeben

    Fordere bei eigenen Signierern eine Ausgabe nach IEEE P1363 an, damit die Signatur im 64-Byte-Format vorliegt, das JWS verlangt – oder prüfe anhand der Länge des dritten Segments, was dein Signierer erzeugt hat.

    js
    import { sign } from "node:crypto";
    
    const sig = sign("sha256", Buffer.from(signingInput), {
      key: privateKey,
      dsaEncoding: "ieee-p1363", // raw r||s, 64 bytes for P-256
    });
  3. 3.

    Form des Signatursegments prüfen

    Dekodiere das dritte Segment des Tokens: 64 Byte bedeuten rohes r‖s (korrekt für ES256), ~70 Byte mit 0x30 am Anfang bedeuten DER. Der Konverter DER ⇄ Raw unten zeigt die Werte r und s und wandelt zwischen beiden Formaten um.

Verwandte Fehler

Gesamte Signaturfehler-Datenbank durchsuchen