Zum Inhalt springen
ecdsa.com
PyJWT (Python)JWT-Bibliotheken

Fehlermeldung

Signature verification failed

PyJWT (Python) — jwt.exceptions.InvalidSignatureError

Was der Fehler bedeutet

PyJWT hat die Struktur des Tokens dekodiert und die Signaturprüfung ausgeführt, und diese ist fehlgeschlagen: Die Signatur passt nicht zu Schlüssel und Payload. InvalidSignatureError ist eine Unterklasse von DecodeError, deshalb kann ein zu breit gefasstes except DecodeError den Fehler fälschlich als Parsing-Problem einordnen – tatsächlich passen Schlüssel und Inhalt nicht zusammen. Bei ES256-Tokens kommt eine Feinheit hinzu: Die JWS-Signatur muss in der rohen 64-Byte-Form r‖s vorliegen, deshalb scheitern hier Tokens von selbst gebauten Signierern, die ASN.1 DER ausgegeben haben, selbst wenn der Schlüssel stimmt.

Warum der Fehler auftritt

So behebst du den Fehler

  1. 1.

    Fingerabdruck des Schlüssels auf beiden Seiten bilden

    Gib einen SHA-256-Fingerabdruck des öffentlichen Schlüssels aus, den die prüfende Seite geladen hat, und vergleiche ihn mit dem des Ausstellers. Ein Unterschied beendet die Suche; stimmen beide überein, liegt das Problem stattdessen in den Bytes des Tokens.

    python
    import hashlib
    from cryptography.hazmat.primitives import serialization
    
    public_key = serialization.load_pem_public_key(pem_bytes)  # the key the verifier uses
    spki = public_key.public_bytes(serialization.Encoding.DER, serialization.PublicFormat.SubjectPublicKeyInfo)
    print(hashlib.sha256(spki).hexdigest())  # compare with the issuer's
  2. 2.

    kid prüfen, bevor du eine Beschädigung vermutest

    Lies den ungeprüften Header und stelle sicher, dass du mit dem Schlüssel prüfst, den das Token nennt. Hat der Aussteller mehrere Schlüssel, ermittle den passenden über den kid mit PyJWKClient.

    python
    import jwt
    
    header = jwt.get_unverified_header(token)
    print(header)  # {'alg': 'ES256', 'kid': '...'}
    
    from jwt import PyJWKClient
    key = PyJWKClient("https://issuer.example/.well-known/jwks.json") \
        .get_signing_key_from_jwt(token).key
    payload = jwt.decode(token, key, algorithms=["ES256"], audience="api://orders")

Verwandte Fehler

Gesamte Signaturfehler-Datenbank durchsuchen