Mensaje de error
The JWKS endpoint did not contain any signing keys
También se muestra como
- The JWKS endpoint did not contain any keys
jwks-rsa (Node.js) — JwksError from getSigningKey()
Qué significa
El endpoint JWKS respondió con claves, pero, tras el filtrado, ninguna puede verificar firmas. jwks-rsa conserva solo las claves cuyo `use` es `"sig"` o no existe, cuyo `kty` es RSA, EC u OKP y que se importan correctamente como claves públicas. Todo lo demás —claves de cifrado, claves simétricas, JWK mal formadas o privadas— se descarta. El mensaje hermano «did not contain any keys» significa que el propio array `keys` estaba vacío o no existía.
Por qué ocurre
Solo se publican claves de cifrado
frecuenteAlgunos proveedores exponen endpoints separados para las claves de cifrado (para JWE) y las claves de firma. Si configuras la URL de las claves de cifrado, obtienes claves marcadas con `use: "enc"`, que nunca deben verificar firmas.
Tipos de clave simétricos o desconocidos
ocasionalUn conjunto de claves `kty: "oct"` (secretos HMAC, que nunca deberían publicarse) o de tipos de clave que jwks-rsa no maneja se descarta por completo.
JWK privadas o mal formadas
ocasionalLas claves que no se pueden importar (falta `n`/`e`, base64url incorrecto, curva no admitida) se omiten en silencio, igual que las claves que se importan como claves privadas porque incluyen `d`. Una clave privada publicada es, además, un incidente de compromiso de la clave.
La URL devuelve otro JSON
ocasionalUn documento de descubrimiento de OpenID o un objeto de error no tienen array `keys`; jwks-rsa informa entonces de que el endpoint no contenía ninguna clave.
Cómo solucionarlo
- 1.
Revisar kty, use y alg de cada clave
Una línea de jq muestra por qué se descarta cada clave. Una fila con `has_private: true` significa que el conjunto de claves expone una clave privada: elimínala y rota esa clave.
bash curl -s "$JWKS_URI" | jq '.keys[] | {kid, kty, use, alg, crv, has_private: has("d")}' - 2.
Publicar al menos una clave de firma
Si gestionas el endpoint, incluye cada clave de firma activa con `use: "sig"`, un `kid` único y su `alg`. Las claves de cifrado pueden estar en el mismo conjunto siempre que lleven la marca `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" } ] }