Сообщение об ошибке
The JWKS endpoint did not contain any signing keys
Также выводится как
- The JWKS endpoint did not contain any keys
jwks-rsa (Node.js) — JwksError from getSigningKey()
Что это означает
Эндпоинт JWKS вернул ключи, но после фильтрации ни одним из них нельзя проверить подпись. jwks-rsa оставляет только ключи, у которых `use` равен `"sig"` или отсутствует, `kty` — RSA, EC или OKP и которые успешно импортируются как открытые ключи. Всё остальное (ключи шифрования, симметричные ключи, некорректные или закрытые JWK) отбрасывается. Родственное сообщение «did not contain any keys» означает, что пуст или отсутствует сам массив `keys`.
Почему это происходит
Опубликованы только ключи шифрования
частоНекоторые провайдеры публикуют ключи шифрования (для JWE) и ключи подписи на отдельных эндпоинтах. Если указать URL ключей шифрования, получатся ключи с пометкой `use: "enc"`, а ими никогда нельзя проверять подписи.
Симметричные или неизвестные типы ключей
иногдаНабор из ключей `kty: "oct"` (секретов HMAC, которые никогда не следует публиковать) или ключей тех типов, с которыми jwks-rsa не работает, отфильтровывается целиком.
Закрытые или некорректные JWK
иногдаКлючи, которые не удаётся импортировать (нет `n`/`e`, ошибка в base64url, неподдерживаемая кривая), молча пропускаются; так же пропускаются ключи, которые импортируются как закрытые, потому что содержат `d`. Опубликованный закрытый ключ к тому же означает инцидент компрометации ключа.
По URL возвращается другой JSON
иногдаВ документе обнаружения OpenID или объекте ошибки нет массива `keys`; тогда jwks-rsa сообщает, что на эндпоинте вообще нет ключей.
Как исправить
- 1.
Посмотрите kty, use и alg у каждого ключа
Одна строка jq показывает, почему отфильтрован каждый ключ. Строка с `has_private: true` означает, что набор ключей раскрывает закрытый ключ: уберите его из набора и проведите ротацию этого ключа.
bash curl -s "$JWKS_URI" | jq '.keys[] | {kid, kty, use, alg, crv, has_private: has("d")}' - 2.
Опубликуйте хотя бы один ключ подписи
Если эндпоинт ваш, включите в него каждый действующий ключ подписи с `use: "sig"`, уникальным `kid` и его `alg`. Ключи шифрования могут находиться в том же наборе, если они помечены `use: "enc"`.
json { "keys": [ { "kty": "RSA", "kid": "sig-2026-10", "use": "sig", "alg": "RS256", "n": "…", "e": "AQAB" }, { "kty": "RSA", "kid": "enc-2026", "use": "enc", "alg": "RSA-OAEP-256", "n": "…", "e": "AQAB" } ] }