Message d’erreur
The specified key is an asymmetric key or x509 certificate and should not be used as an HMAC secret.
Également affiché sous la forme
- 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
Ce que cela signifie
On a demandé à PyJWT d’utiliser une clé publique, une clé privée ou un certificat PEM comme secret d’un algorithme HMAC (HS256/384/512), et il a refusé. Ce garde-fou existe à cause d’une catégorie bien connue de bugs JWT : si un vérificateur accepte à la fois des algorithmes RS/ES et HS avec le même argument de clé, quiconque connaît la clé publique pourrait calculer un HMAC valide sur un jeton falsifié. Ici, l’en-tête du jeton indiquait un algorithme HMAC que votre liste d’autorisation permet.
Pourquoi cela se produit
La liste d’autorisation mélange des algorithmes HMAC et asymétriques
fréquente`algorithms=["RS256", "HS256"]` avec une clé publique signifie qu’un jeton HS256 tente d’utiliser cette clé publique comme secret HMAC. L’accepter laisserait passer un jeton falsifié ; PyJWT le bloque.
Le service est configuré pour HS256, mais détient un PEM
occasionnelleUne configuration qui indique `JWT_ALGORITHM=HS256` alors que `JWT_KEY` contient un fichier PEM. Déterminez quel schéma l’émetteur utilise réellement et mettez les deux valeurs en accord.
Quelqu’un teste le vérificateur
occasionnelleDes jetons avec `alg: "HS256"` qui arrivent sur une API dont l’émetteur signe avec RSA ou ECDSA sont une tentative classique de sonder la faiblesse de confusion d’algorithme. Journalisez la source ; l’erreur signifie que la tentative a échoué.
Comment corriger l’erreur
- 1.
Autoriser une seule famille d’algorithmes par clé
Passez uniquement les algorithmes asymétriques qu’utilise votre émetteur, avec sa clé publique, et gardez la vérification HMAC (si vous en avez vraiment besoin) sur un chemin de code distinct, avec son propre secret aléatoire.
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")