Saltar al contenido
ecdsa.com
jose (JavaScript)JWKS y descubrimiento de claves

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

Cómo solucionarlo

  1. 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. 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. 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

Explorar toda la base de datos de errores de firma