Сообщение об ошибке
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:».
Почему это происходит
Ротация ключей и закешированный набор ключей
частоПровайдер начал подписывать токены новым ключом. Встретив неизвестный `kid`, jwks-rsa загружает набор заново, но только если это позволяют кеширование и ограничение частоты запросов; клиент, созданный с очень долгим кешированием, или вручную скопированные ключи продолжают выдавать ошибку до перезапуска.
URL JWKS принадлежит другому тенанту или окружению
частоУ каждого тенанта Auth0, пула пользователей Cognito, тенанта Entra ID и realm в Keycloak свой набор ключей. `jwksUri` из staging-окружения в рабочей среде даёт ключи с правдоподобными, но другими значениями `kid`.
Подходящий ключ отброшен при фильтрации
иногдаjwks-rsa рассматривает только ключи, у которых `use` отсутствует или равен `"sig"`, `kty` — RSA, EC или OKP и которые удаётся импортировать как открытые ключи. Ключ, опубликованный с `use: "enc"`, или некорректный JWK молча пропускается, даже если его `kid` совпадает.
Токен выпущен другим провайдером
иногдаТокены от другого поставщика удостоверений (или токен, который вы сами выпустили локально для тестов) ссылаются на ключи, которых этот провайдер никогда не публиковал. Прежде чем разбираться с ключами, проверьте `iss` в полезной нагрузке.
Как исправить
- 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.
Создайте один клиент с кешированием и ограничением частоты запросов
Клиент на уровне модуля с включённым кешированием заново загружает набор, когда появляется новый `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, });
Связанные ошибки
no applicable key found in the JSON Web Key Setjose (JavaScript)Unable to find a signing key that matches: "2026-10"PyJWT (Python)IDX10503: Signature validation failed. The token's kid is: '2026-10', but did n…Microsoft.IdentityModel.JsonWebTokens / System.IdentityModel.Tokens.Jwt (.NET)Jwks doesn't have key to match kid or alg from JwtEnvoy / Istio