Mensagem de erro
The specified key is an asymmetric key or x509 certificate and should not be used as an HMAC secret.
Também aparece como
- 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
O que significa
Pediram ao PyJWT que usasse uma chave pública PEM, uma chave privada ou um certificado como segredo de um algoritmo HMAC (HS256/384/512), e ele se recusou. Essa proteção existe por causa de uma classe bem conhecida de bugs de JWT: se um verificador aceita algoritmos RS/ES e HS com o mesmo argumento de chave, qualquer pessoa que conheça a chave pública poderia calcular um HMAC válido sobre um token forjado. Aqui, o cabeçalho do token indicou um algoritmo HMAC que sua lista de algoritmos permitidos aceita.
Por que acontece
A lista de algoritmos permitidos mistura HMAC e algoritmos assimétricos
comum`algorithms=["RS256", "HS256"]` com uma chave pública significa que um token HS256 tenta usar essa chave pública como segredo HMAC. Aceitá-lo deixaria passar um token forjado; o PyJWT impede isso.
O serviço está configurado para HS256, mas tem um PEM como chave
ocasionalUma configuração que diz `JWT_ALGORITHM=HS256` enquanto `JWT_KEY` contém um arquivo PEM. Decida qual esquema o emissor realmente usa e faça os dois valores concordarem.
Alguém está testando o verificador
ocasionalTokens com `alg: "HS256"` chegando a uma API cujo emissor assina com RSA ou ECDSA são uma sondagem clássica da falha de confusão de algoritmo. Registre a origem no log; o erro significa que a sondagem falhou.
Como corrigir
- 1.
Permitir uma única família de algoritmos por chave
Passe, junto com a chave pública do emissor, apenas os algoritmos assimétricos que ele usa, e mantenha a verificação HMAC (se é que você precisa dela) em um caminho de código separado, com o próprio segredo aleatório.
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")