Інспектувати JWKS та витягти публічні ключі PEM

інспектує JWK Set (JSON Web Key Set) та витягує кожен публічний ключ у форматі PEM, готовий для перевірки підписів JWT постачальника ідентифікації (OIDC, Auth0, Keycloak…)
Вставте повний вміст документа JWKS, наприклад той, що розміщений на /.well-known/jwks.json.

Що таке JWKS?

JWKS (JSON Web Key Set, RFC 7517) — JSON-документ, що групує список публічних ключів у структурованій формі. Він слугує для публікації ключів, які емітент JWT використовує для підпису своїх токенів, щоб будь-який споживач міг їх отримати і перевірити підпис токенів, що він отримує. Формат завжди виглядає так:

{
  "keys": [
    { "kty": "RSA", "kid": "abc123", "use": "sig", "alg": "RS256", "n": "...", "e": "AQAB" },
    { "kty": "EC",  "kid": "def456", "use": "sig", "alg": "ES256", "crv": "P-256", "x": "...", "y": "..." }
  ]
}

Кожен запис масиву keys є JWK (JSON Web Key), що описує публічний ключ: тип ключа (kty), ідентифікатор (kid), призначення (use), цільовий алгоритм (alg) і криптографічні компоненти.

Коли використовується JWKS?

JWKS є хребтом сучасних архітектур OAuth2 і OpenID Connect. Ви зустрінете його в кількох контекстах:

  • Виявлення OIDC: кожен постачальник OpenID Connect публікує документ конфігурації за адресою /.well-known/openid-configuration, що містить поле jwks_uri. За цією URL знаходиться JWKS з переліком активних публічних ключів.
  • Перевірка JWT: коли ваш API отримує токен, підписаний RS256 або ES256, він читає kid з заголовка, завантажує JWKS від емітента, знаходить відповідний ключ, отримує з нього публічний ключ у форматі PEM і перевіряє підпис.
  • Ротація ключів: емітент може публікувати кілька ключів одночасно, що дозволяє ввести новий ключ для підпису нових токенів, зберігаючи старий до закінчення терміну дії токенів в обороті.
  • Федерації: SAML, SCIM, взаємопов'язані сервіси — публікація JWKS дозволяє уникнути ручного обміну сертифікатами X.509 між партнерами.

Основні поля JWK

Деякі поля систематично зустрічаються в JWK. Цей інструмент витягує та відображає їх для кожного ключа проаналізованого JWKS:

  • kid (key ID): унікальний ідентифікатор ключа. Це значення, яке заголовок JWT ставить у власне поле kid, щоб вказати, який ключ JWKS слід використовувати для перевірки.
  • kty (key type): криптографічна сім'я. Два домінуючих значення — RSA (класичні RSA-ключі, які використовуються з RS256, RS384, RS512) і EC (еліптичні криві, що використовуються з ES256, ES384, ES512).
  • alg (algorithm): алгоритм підпису, для якого призначений цей ключ. Необов'язкове поле, але часто вказується. Дозволяє швидко відфільтрувати ключі, що використовуються для даного JWT.
  • use: призначення ключа. sig для підпису (звичайний випадок), enc для шифрування (рідкісний, використовується з JWE).

Навіщо конвертувати JWK у PEM?

Більшість класичних криптографічних бібліотек (OpenSSL, openssl_verify у PHP, crypto у Node.js, JCA у Java) приймають публічні ключі у форматі PEM (Base64 з рамкою -----BEGIN PUBLIC KEY-----), а не безпосередньо у форматі JWK. Конвертація JWK у PEM є необхідною для:

  • Ручної перевірки підпису JWT зі скрипту або інструменту командного рядка (jwt, jose, step crypto).
  • Імпорту ключа в інструмент налагодження, як JWT Verifier, що очікує PEM-ключ у полі "публічний ключ".
  • Зберігання ключа в локальному кеші або файлі конфігурації у універсальній та читабельній формі.
  • Швидкого порівняння двох ключів (формат PEM спрощує візуальний diff).

Обмеження та застереження

Цей інструмент підтримує публічні ключі RSA (kty=RSA) і EC (kty=EC на кривих P-256, P-384, P-521). Інші типи (OKP для Ed25519, oct для симетричних ключів) не конвертуються: вони повідомляються з повідомленням про помилку для кожного запису, решта JWKS залишається читабельною.

  • Конвертація виконується лише в одному напрямку: JWKS у PEM. Реконструкція JWK з наявного PEM-ключа не покривається цією версією.
  • JWKS потрібно вставити як є у вигляді JSON-тексту. Автоматичне отримання з jwks_uri або OIDC-ендпоінту не виконується на стороні сервера, щоб уникнути непередбачуваних вихідних дзвінків.
  • Приватні ключі не повинні з'являтися в публічному JWKS, і цей інструмент витягує лише публічні компоненти, навіть якщо б приватний ключ був присутній.

Як використовувати

  1. Отримайте JWKS від емітента, якого хочете перевірити. Для OIDC-постачальника адреса зазвичай https://example.com/.well-known/jwks.json або https://example.com/oauth2/jwks.
  2. Скопіюйте весь JSON-документ (об'єкт, що містить ключ keys).
  3. Вставте його в поле введення інструменту і запустіть аналіз.
  4. Для кожного ключа JWKS інструмент відображає його kid, kty, alg, use і публічний ключ, конвертований у формат PEM.
  5. Натисніть "копіювати", щоб отримати PEM і використати його в скрипті перевірки, в нашому JWT Verifier або в будь-якому інструменті, сумісному з OpenSSL.

Часті запитання

Де знайти JWKS постачальника OIDC?

Переважна більшість постачальників OpenID Connect публікують документ виявлення за адресою https://example.com/.well-known/openid-configuration. Цей JSON містить поле jwks_uri, що вказує на фактичний JWKS. Деякі постачальники безпосередньо обслуговують JWKS на https://example.com/.well-known/jwks.json або на спеціальному OAuth2-ендпоінті. Завантажте вміст і вставте його тут як є.

Чому kid є важливим?

kid (key ID) — ідентифікатор, який заголовок JWT поміщає у власне поле kid, щоб вказати, який ключ JWKS слід використовувати для перевірки. Без цього ідентифікатора споживачу довелося б перебирати кожен ключ JWKS, що ускладнює діагностику у разі помилки. Наявність kid для кожного ключа вважається гарною практикою, і всі серйозні IdP публікують його.

Яка різниця між kty=RSA і kty=EC?

RSA — це історична сім'я асиметричних підписів, що використовується з RS256, RS384, RS512. Ключі описуються модулем n і показником e. EC (Elliptic Curve) є більш новим і дає коротші підписи для еквівалентного рівня безпеки. Ключі EC описуються кривою (crv = P-256, P-384 або P-521) і двома координатами x і y. Цей інструмент конвертує обидві сімейства в PEM.

Як використати витягнутий PEM для перевірки JWT?

Скопіюйте PEM, потім вставте його в поле "публічний ключ" нашого JWT Verifier з JWT для валідації. Також можна використовувати його з командного рядка через openssl dgst, з Node.js через crypto.verify, з Python через cryptography або PyJWT, з Java через JCA. Формат PEM є загальновизнаним.

Мій JWKS містить ключ Ed25519 (OKP), чому він не конвертується?

Конвертація ключів OKP (Ed25519, Ed448, X25519, X448) вимагає специфічної логіки і відрізняється DER-кодуванням від RSA та EC ключів. Ця версія інструменту підтримує лише RSA і EC. Непідтримувані ключі повідомляються окремо з повідомленням про помилку, не блокуючи аналіз інших записів JWKS.

Чи можна отримати JWKS за URL, а не вставляти його?

Не в цій версії. Інструмент не здійснює жодних вихідних HTTP-дзвінків, щоб залишатися швидким і уникнути дії як мимовільний проксі. Завантажте JWKS зі свого браузера або через curl https://example.com/.well-known/jwks.json, а потім вставте вміст у поле введення.

Приклад запиту

curl -X POST https://cdrn.fr/api/v1/tools/jwks-inspector/execute \
  -H "Content-Type: application/json" \
  -d '{"jwks":"..."}'

Схема вхідних даних

Поле Тип Обов'язкове За замовчуванням
jwks text

Точки доступу

  • GET https://cdrn.fr/api/v1/tools - перелічує всі доступні інструменти
  • GET https://cdrn.fr/api/v1/tools/jwks-inspector - отримує схему цього інструменту
  • POST https://cdrn.fr/api/v1/tools/jwks-inspector/execute - виконує цей інструмент з JSON-payload