Mensaje de error
no applicable key found in the JSON Web Key Set
jose (JavaScript) — JWKSNoMatchingKey, code ERR_JWKS_NO_MATCHING_KEY
Qué significa
jose revisó el conjunto de claves JSON Web Key que le pasaste y no encontró ninguna clave que pueda verificar este token. Una clave solo es apta si se cumplen todas estas condiciones: su `kid` es igual al `kid` del encabezado del token (cuando el token lo tiene), su `kty` encaja con el `alg` del token, su `alg` (si existe) es igual al `alg` del token, su `crv` coincide (P-256 para ES256), `use` no existe o es `"sig"` y `key_ops` (si existe) incluye `"verify"`. No se ejecutó ninguna operación criptográfica: el fallo está en la selección de la clave.
Por qué ocurre
El emisor rotó su clave de firma
frecuenteLos tokens nuevos llevan un `kid` nuevo que el conjunto de claves en caché o fijado en el código aún no contiene. Es la causa más frecuente y suele empezar en el minuto exacto de una rotación: los servicios reiniciados después funcionan y los que arrancaron antes fallan.
El conjunto de claves pertenece a otro emisor o a otro entorno
frecuenteUna URL de JWKS de preproducción en producción, el JWKS de otro inquilino o un conjunto de claves copiado de la documentación. Todos los `kid` parecen plausibles, pero ninguno coincide.
Los metadatos de la clave contradicen el token
ocasionalLa JWK tiene `alg: "RS256"` mientras que el token es ES256, o la clave EC está en P-384 mientras que el token usa ES256 (que requiere P-256). jose omite esas claves aunque el `kid` coincida, porque los metadatos de una JWK existen precisamente para evitar que una clave se use con otro algoritmo.
La clave está marcada para cifrado
ocasionalUna clave publicada con `use: "enc"` o con un `key_ops` que no incluye `"verify"` no es una clave de verificación de firmas. Algunos proveedores publican ambos tipos en un mismo conjunto; solo las claves `sig` pueden verificar tokens.
Una copia local del JWKS nunca se actualizó
ocasional`createLocalJWKSet` usa las claves que le pasas, para siempre. Si el conjunto salió de un archivo o de una variable de entorno en el momento del despliegue, queda desactualizado sin avisar con la siguiente rotación.
Cómo solucionarlo
- 1.
Comparar el kid del token con las claves publicadas
Decodifica el encabezado protegido y enumera las claves publicadas con sus `kid`, `alg`, `kty`, `crv` y `use`. Si el `kid` no está en el conjunto, se trata de una rotación o de un conjunto de claves equivocado; si está, revisa los campos de metadatos.
bash # kid and alg the token asks for python3 -c 'import base64,json,sys; h=sys.argv[1].split(".")[0]; print(json.loads(base64.urlsafe_b64decode(h + "=" * (-len(h) % 4))))' "$TOKEN" # kid, alg, kty, crv, use of every key the issuer publishes curl -s https://issuer.example.com/.well-known/jwks.json | jq '.keys[] | {kid, alg, kty, crv, use}' - 2.
Obtener el JWKS del emisor en lugar de fijar las claves
`createRemoteJWKSet` guarda las claves en caché y vuelve a descargar el conjunto cuando un token indica un `kid` que todavía no conoce, así que las rotaciones se recogen automáticamente sin aceptar claves arbitrarias.
js import { createRemoteJWKSet, jwtVerify } from "jose"; // Fetches the JWKS, caches it, and refetches when a token names an unknown kid // (at most once per cooldownDuration, 30 s by default). const jwks = createRemoteJWKSet(new URL("https://issuer.example.com/.well-known/jwks.json")); const { payload } = await jwtVerify(token, jwks, { algorithms: ["ES256"], issuer: "https://issuer.example.com", }); - 3.
Publicar las claves con metadatos coherentes
Si gestionas el emisor, asegúrate de que cada clave de firma tenga un `kid` único, `use: "sig"` y un `alg` y un `crv` que coincidan con los tokens que firma. Publica la clave nueva antes de empezar a firmar con ella.
json { "keys": [ { "kty": "EC", "crv": "P-256", "kid": "2026-10", "use": "sig", "alg": "ES256", "x": "…", "y": "…" } ] }
Errores relacionados
multiple matching keys found in the JSON Web Key Setjose (JavaScript)Unable to find a signing key that matches '2026-10-rotated'jwks-rsa (Node.js)IDX10503: Signature validation failed. The token's kid is: '2026-10', but did n…Microsoft.IdentityModel.JsonWebTokens / System.IdentityModel.Tokens.Jwt (.NET)signature verification failedjose (JavaScript)