Перейти к содержимому
ecdsa.com
jwks-rsa (Node.js)JWKS и обнаружение ключей

Сообщение об ошибке

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

Также выводится как

  • 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

Значение в кавычках — это `kid` токена (`'undefined'`, если в заголовке его нет). При вызове `jwt.verify()` с функцией обратного вызова к тексту добавляется префикс «error in secret or public key callback: ». Токен без `kid` при наборе из нескольких ключей приводит к ошибке «No KID specified and JWKS endpoint returned more than 1 key».

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

Что это означает

jwks-rsa загрузила набор ключей, но ни у одного из пригодных ключей подписи нет `kid` из заголовка токена (это значение в кавычках). Сам токен при этом может быть вполне действительным — просто у проверяющей стороны нет ключа, которым он подписан. Если jwks-rsa используется через функцию обратного вызова для получения ключа в jsonwebtoken, к сообщению добавляется префикс «error in secret or public key callback:».

Почему это происходит

Как исправить

  1. 1.

    Выведите список опубликованных kid

    Декодируйте заголовок токена и сравните его `kid` с ключами по адресу `jwksUri`. Если `kid` там есть, а ошибка не исчезает, ключ отбрасывается при фильтрации — посмотрите на его `use` и `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.

    Создайте один клиент с кешированием и ограничением частоты запросов

    Клиент на уровне модуля с включённым кешированием заново загружает набор, когда появляется новый `kid`, и защищает провайдера от лавины запросов, когда злоумышленники присылают случайные значения `kid`.

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

Связанные ошибки

Открыть всю базу ошибок подписей