Mensagem de erro
The JWKS endpoint did not contain any signing keys
Também aparece como
- The JWKS endpoint did not contain any keys
jwks-rsa (Node.js) — JwksError from getSigningKey()
O que significa
O endpoint JWKS respondeu com chaves, mas, depois da filtragem, nenhuma delas consegue verificar assinaturas. O jwks-rsa mantém apenas as chaves cujo `use` é `"sig"` ou está ausente, cujo `kty` é RSA, EC ou OKP e que são importadas com sucesso como chaves públicas. Todo o resto — chaves de criptografia, chaves simétricas, JWKs malformadas ou privadas — é descartado. A mensagem irmã “did not contain any keys” significa que o próprio array `keys` estava vazio ou ausente.
Por que acontece
Só há chaves de criptografia publicadas
comumAlguns provedores expõem endpoints separados para chaves de criptografia (para JWE) e chaves de assinatura. Configurar a URL das chaves de criptografia traz chaves marcadas com `use: "enc"`, que nunca devem verificar assinaturas.
Tipos de chave simétricos ou desconhecidos
ocasionalUm conjunto de chaves `kty: "oct"` (segredos de HMAC — que nunca deveriam ser publicados) ou de tipos de chave que o jwks-rsa não trata é filtrado por inteiro.
JWKs privadas ou malformadas
ocasionalChaves que não podem ser importadas (sem `n`/`e`, base64url inválido, curva sem suporte) são ignoradas silenciosamente, assim como chaves que são importadas como chaves privadas por incluírem `d`. Uma chave privada publicada também é um incidente de comprometimento da chave.
A URL retorna outro JSON
ocasionalUm documento de descoberta do OpenID ou um objeto de erro não tem o array `keys`; o jwks-rsa então informa que o endpoint não continha chave nenhuma.
Como corrigir
- 1.
Ver kty, use e alg de cada chave
Uma única linha de jq mostra por que cada chave é filtrada. Uma linha de saída com `has_private: true` significa que o conjunto de chaves vaza uma chave privada: remova-a e rotacione essa chave.
bash curl -s "$JWKS_URI" | jq '.keys[] | {kid, kty, use, alg, crv, has_private: has("d")}' - 2.
Publicar pelo menos uma chave de assinatura
Se o endpoint for seu, inclua cada chave de assinatura ativa com `use: "sig"`, um `kid` único e o `alg` dela. Chaves de criptografia podem ficar no mesmo conjunto, desde que estejam marcadas com `use: "enc"`.
json { "keys": [ { "kty": "RSA", "kid": "sig-2026-10", "use": "sig", "alg": "RS256", "n": "…", "e": "AQAB" }, { "kty": "RSA", "kid": "enc-2026", "use": "enc", "alg": "RSA-OAEP-256", "n": "…", "e": "AQAB" } ] }