Fehlermeldung
The specified key is an asymmetric key or x509 certificate and should not be used as an HMAC secret.
Auch ausgegeben als
- jwt.exceptions.InvalidKeyError: The specified key is an asymmetric key or x509 certificate and should not be used as an HMAC secret.
PyJWT (Python) — jwt.exceptions.InvalidKeyError from HMACAlgorithm.prepare_key
Was der Fehler bedeutet
PyJWT sollte einen öffentlichen Schlüssel, einen privaten Schlüssel oder ein Zertifikat im PEM-Format als Secret für einen HMAC-Algorithmus (HS256/384/512) verwenden und hat das abgelehnt. Diese Sperre gibt es wegen einer bekannten Klasse von JWT-Bugs: Akzeptiert eine prüfende Seite RS/ES- und HS-Algorithmen mit demselben Schlüsselargument, könnte jeder, der den öffentlichen Schlüssel kennt, einen gültigen HMAC über ein gefälschtes Token berechnen. Hier hat der Header des Tokens einen HMAC-Algorithmus genannt, den deine Allowlist erlaubt.
Warum der Fehler auftritt
Die Allowlist mischt HMAC- und asymmetrische Algorithmen
häufig`algorithms=["RS256", "HS256"]` zusammen mit einem öffentlichen Schlüssel bedeutet, dass ein HS256-Token versucht, diesen öffentlichen Schlüssel als HMAC-Secret zu verwenden. Würde PyJWT das akzeptieren, käme ein gefälschtes Token durch; PyJWT unterbindet das.
Der Dienst ist auf HS256 konfiguriert, hat aber ein PEM
gelegentlichEine Konfiguration mit `JWT_ALGORITHM=HS256`, während `JWT_KEY` eine PEM-Datei enthält. Kläre, welches Verfahren der Aussteller wirklich verwendet, und bring beide Werte in Einklang.
Jemand testet die prüfende Seite
gelegentlichTokens mit `alg: "HS256"`, die bei einer API ankommen, deren Aussteller mit RSA oder ECDSA signiert, sind ein klassischer Test auf die Schwachstelle Algorithm Confusion. Protokolliere die Quelle; der Fehler bedeutet, dass der Test gescheitert ist.
So behebst du den Fehler
- 1.
Eine Algorithmenfamilie pro Schlüssel zulassen
Übergib zusammen mit dem öffentlichen Schlüssel deines Ausstellers nur die asymmetrischen Algorithmen, die er verwendet, und halte die HMAC-Prüfung (falls du sie überhaupt brauchst) in einem separaten Codepfad mit eigenem zufälligem Secret.
python # Asymmetric issuer: allow only asymmetric algorithms with the public key. claims = jwt.decode(token, public_key, algorithms=["ES256"], audience="https://api.example.com") # Shared-secret tokens: a random secret, never a PEM, and only HMAC algorithms. claims = jwt.decode(token, HMAC_SECRET, algorithms=["HS256"], audience="internal")