Saltar al contenido
ecdsa.com
jwks-rsa (Node.js)JWKS y descubrimiento de claves

Mensaje de error

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

También se muestra 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

El valor entre comillas es el `kid` del token (`'undefined'` si el encabezado no lo tiene). A través de `jwt.verify()` con una devolución de llamada, el texto lleva delante «error in secret or public key callback: ». Un token sin `kid` frente a un conjunto con varias claves falla con «No KID specified and JWKS endpoint returned more than 1 key».

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

Qué significa

jwks-rsa descargó el conjunto de claves y ninguna de sus claves de firma utilizables tiene el `kid` del encabezado del token (el valor entre comillas). El token puede ser perfectamente válido: simplemente, el verificador no tiene la clave con la que se firmó. Cuando jwks-rsa se usa a través de la devolución de llamada de clave de jsonwebtoken, el mensaje lleva delante el prefijo «error in secret or public key callback:».

Por qué ocurre

Cómo solucionarlo

  1. 1.

    Enumerar los valores kid publicados

    Decodifica el encabezado del token y compara su `kid` con las claves de tu `jwksUri`. Si el `kid` figura ahí pero el error persiste, la clave se está descartando en el filtrado: revisa su `use` y su `kty`.

    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.

    Crear un único cliente con caché y límite de frecuencia

    Un cliente a nivel de módulo con caché vuelve a descargar el conjunto cuando aparece un `kid` nuevo y protege al proveedor de una avalancha de solicitudes cuando los atacantes envían valores de `kid` aleatorios.

    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,
    });

Errores relacionados

Explorar toda la base de datos de errores de firma