Pular para o conteúdo
ecdsa.com
jose (JavaScript)JWKS e descoberta de chaves

Mensagem de erro

no applicable key found in the JSON Web Key Set

jose (JavaScript) — JWKSNoMatchingKey, code ERR_JWKS_NO_MATCHING_KEY

O que significa

O jose percorreu o conjunto de chaves (JSON Web Key Set) que você passou e não encontrou nenhuma chave que possa verificar este token. Uma chave só se qualifica se todas estas condições forem atendidas: o `kid` dela é igual ao `kid` do cabeçalho do token (quando o token tem um), o `kty` combina com o `alg` do token, o `alg` dela (se presente) é igual ao `alg` do token, o `crv` corresponde (P-256 para ES256), `use` está ausente ou é `"sig"`, e `key_ops` (se presente) inclui `"verify"`. Nenhuma operação criptográfica foi executada — a falha está na seleção da chave.

Por que acontece

Como corrigir

  1. 1.

    Comparar o kid do token com as chaves publicadas

    Decodifique o cabeçalho protegido e liste as chaves publicadas com `kid`, `alg`, `kty`, `crv` e `use`. Se o `kid` não estiver no conjunto, trata-se de uma rotação ou do conjunto de chaves errado; se estiver, examine os campos de metadados.

    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.

    Buscar o JWKS do emissor em vez de fixar chaves

    O `createRemoteJWKSet` guarda as chaves em cache e busca o conjunto de novo quando um token cita um `kid` que ele ainda não viu; assim, as rotações são incorporadas automaticamente, sem aceitar chaves arbitrárias.

    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 chaves com metadados consistentes

    Se o emissor for seu, garanta que cada chave de assinatura tenha um `kid` único, `use: "sig"` e um `alg` e um `crv` que correspondam aos tokens que ela assina. Publique a chave nova antes de começar a assinar com ela.

    json
    {
      "keys": [
        { "kty": "EC", "crv": "P-256", "kid": "2026-10", "use": "sig", "alg": "ES256",
          "x": "…", "y": "…" }
      ]
    }

Erros relacionados

Ver toda a base de erros de assinatura