Pular para o conteúdo
ecdsa.com
jwks-rsa (Node.js)JWKS e descoberta de chaves

Mensagem de erro

Unable to find a signing key that matches '2026-10-rotated'

Também aparece como

  • error in secret or public key callback: Unable to find a signing key that matches '2026-10-rotated'
  • SigningKeyNotFoundError: Unable to find a signing key that matches
  • No KID specified and JWKS endpoint returned more than 1 key

O valor entre aspas é o `kid` do token (`'undefined'` se o cabeçalho não tiver um). Via `jwt.verify()` com callback, o texto ganha o prefixo “error in secret or public key callback: ”. Um token sem `kid` diante de um conjunto com várias chaves falha com “No KID specified and JWKS endpoint returned more than 1 key”.

jwks-rsa (Node.js) — SigningKeyNotFoundError, often wrapped by jsonwebtoken or express-jwt

O que significa

O jwks-rsa baixou o conjunto de chaves e nenhuma das chaves de assinatura utilizáveis tem o `kid` do cabeçalho do token (o valor entre aspas). O token pode ser perfeitamente válido — o verificador simplesmente não tem a chave que o assinou. Quando o jwks-rsa é usado pelo callback de chave do jsonwebtoken, a mensagem ganha o prefixo “error in secret or public key callback:”.

Por que acontece

Como corrigir

  1. 1.

    Listar os valores de kid publicados

    Decodifique o cabeçalho do token e compare o `kid` dele com as chaves do seu `jwksUri`. Se o `kid` estiver na lista, mas o erro continuar, a chave está sendo descartada pelo filtro — confira o `use` e o `kty` dela.

    bash
    # kids the provider publishes (jwks-rsa ignores keys with use "enc" and non RSA/EC/OKP keys)
    curl -s https://tenant.example.com/.well-known/jwks.json | jq '.keys[] | {kid, kty, use, alg}'
  2. 2.

    Criar um único cliente com cache e limite de taxa

    Um cliente criado no nível do módulo, com cache, busca o conjunto de novo quando surge um `kid` novo e protege o provedor de uma enxurrada de requisições quando atacantes enviam valores de `kid` aleatórios.

    js
    import jwksRsa from "jwks-rsa";
    
    // One client per process; unknown kids trigger a refetch, bounded by the rate limit.
    export const jwksClient = jwksRsa({
      jwksUri: "https://tenant.example.com/.well-known/jwks.json",
      cache: true,
      cacheMaxAge: 10 * 60 * 1000,
      rateLimit: true,
      jwksRequestsPerMinute: 10,
    });

Erros relacionados

Ver toda a base de erros de assinatura