Параметры JWK: kty, use, key_ops, alg, kid, x5c, x5t

JWK (JSON Web Key) представляет собой стандартизированное JSON-представление криптографического ключа, используемое в экосистеме JOSE (JSON Object Signing and Encryption). В контексте JavaScript-библиотеки jose работа с JWK является базовым механизмом для описания, хранения и передачи ключей, применяемых в операциях подписи, шифрования и верификации.

Структура JWK строго определена спецификацией и включает набор обязательных и опциональных параметров, определяющих тип ключа, его назначение, алгоритмические ограничения и метаданные.


kty — тип ключа (Key Type)

Поле kty определяет криптографическую природу ключа и является обязательным.

Основные значения:

  • RSA — RSA ключи (широко используются в JWT подписи и TLS)
  • EC — эллиптические кривые (ECDSA, ECDH)
  • oct — симметричные ключи (HMAC, AES)
  • OKP — кривые Ed25519 / X25519

Роль kty в jose

Библиотека jose использует kty для выбора алгоритмической стратегии обработки ключа. Например:

  • RSA → RS256, PS256
  • EC → ES256, ES384
  • OKP → EdDSA
  • oct → HS256

Пример

{
  "kty": "RSA"
}

use — назначение ключа

Поле use определяет предполагаемое использование ключа на высоком уровне.

Основные значения:

  • sig — подпись (signature)
  • enc — шифрование (encryption)

Семантика

use не является строгим ограничением, но служит декларативным маркером для систем, проверяющих соответствие ключа операции.

Пример:

  • ключ с use: "sig" применяется для JWT подписи
  • ключ с use: "enc" применяется для JWE шифрования

Пример

{
  "use": "sig"
}

key_ops — допустимые операции с ключом

Поле key_ops задаёт детализированный список операций, которые разрешены для конкретного ключа. В отличие от use, оно более строгое и функционально ориентированное.

Возможные значения

  • sign — создание подписи
  • verify — проверка подписи
  • encrypt — шифрование
  • decrypt — расшифрование
  • wrapKey — обёртка ключа
  • unwrapKey — развёртка ключа
  • deriveKey — вывод ключа
  • deriveBits — вывод битового материала

Отличие от use

  • use — общее назначение
  • key_ops — конкретные разрешённые действия

В jose библиотеке key_ops часто используется для строгого контроля безопасности, особенно в мультиключевых системах.

Пример

{
  "key_ops": ["sign", "verify"]
}

alg — алгоритм, ассоциированный с ключом

Поле alg фиксирует алгоритм, для которого предназначен ключ. Это ограничивает использование ключа только указанным криптографическим алгоритмом.

Примеры алгоритмов

  • RS256 — RSA + SHA-256
  • ES256 — ECDSA P-256 + SHA-256
  • HS256 — HMAC + SHA-256
  • EdDSA — Ed25519

Поведение в jose

При наличии alg библиотека jose может:

  • отклонять использование ключа в несовместимом алгоритме
  • автоматически выбирать алгоритм при операциях подписи/проверки

Пример

{
  "alg": "RS256"
}

kid — идентификатор ключа

Поле kid (Key ID) используется для идентификации ключа в наборе ключей (JWKS — JSON Web Key Set).

Назначение

  • выбор правильного ключа при проверке JWT
  • ротация ключей без нарушения совместимости
  • сопоставление ключей в распределённых системах

Поведение в jose

При верификации токена библиотека jose использует kid из заголовка JWT для выбора соответствующего ключа из JWKS.

Пример

{
  "kid": "2026-01-signing-key"
}

x5c — цепочка сертификатов X.509

Поле x5c содержит массив сертификатов X.509, соответствующих ключу.

Формат

  • массив строк
  • каждая строка — Base64-encoded DER сертификат
  • первый элемент — сертификат публичного ключа
  • последующие — цепочка до корневого CA

Назначение

  • валидация доверия через PKI
  • привязка JWK к инфраструктуре сертификатов
  • интеграция с TLS и корпоративными CA

Использование в jose

Библиотека jose может извлекать публичный ключ из x5c, если он отсутствует в явном виде.

Пример

{
  "x5c": [
    "MIID...AB",
    "MIIF...CD"
  ]
}

x5t — отпечаток сертификата (SHA-1 Thumbprint)

Поле x5t содержит SHA-1 хеш (отпечаток) сертификата X.509.

Назначение

  • быстрая идентификация сертификата
  • сопоставление с локальным хранилищем сертификатов
  • сокращённый индекс вместо полного x5c

Особенности

  • значение кодируется в Base64URL
  • устаревший формат SHA-1, используется для обратной совместимости

Пример

{
  "x5t": "dBjftJeZ4CVP-mB92K27uhbUJU1p1r_wW1gFWFOEjXk"
}

Взаимодействие параметров внутри JWK

В реальных системах параметры JWK не используются изолированно. Их комбинации формируют строгую модель безопасности:

Типичная RSA подпись

{
  "kty": "RSA",
  "use": "sig",
  "alg": "RS256",
  "kid": "key-1",
  "key_ops": ["sign", "verify"]
}

JWK с сертификатной цепочкой

{
  "kty": "RSA",
  "use": "sig",
  "alg": "RS256",
  "kid": "cert-key",
  "x5c": [
    "MIID..."
  ],
  "x5t": "abc123..."
}

Роль JWK в библиотеке jose

В экосистеме jose JWK является центральной структурой, через которую проходят:

  • импорт ключей (importJWK)
  • экспорт ключей (exportJWK)
  • верификация JWT (jwtVerify)
  • подпись JWT (SignJWT)
  • работа с JWKS (createRemoteJWKSet)

Каждое поле JWK участвует в принятии решений о:

  • допустимости алгоритма
  • выборе ключа
  • проверке доверия
  • ограничении операций

Типовые ошибки при работе с параметрами JWK

Несоответствие alg и kty

RSA ключ с alg: ES256 приведёт к ошибке несовместимости.

Игнорирование key_ops

Отсутствие key_ops приводит к неявному разрешению всех операций, что снижает контроль безопасности.

Дублирование kid

Одинаковые kid в разных ключах создают неоднозначность при выборе ключа.

Использование устаревшего x5t

SHA-1 отпечатки считаются криптографически устаревшими и могут быть отключены в современных политиках безопасности.


Значение структуры JWK в архитектуре безопасности

JWK представляет не просто контейнер для ключа, а декларативную модель ограничений и контекста:

  • криптографическая идентичность (kty)
  • назначение (use)
  • операционные ограничения (key_ops)
  • алгоритмическая привязка (alg)
  • идентификация (kid)
  • доверенная цепочка (x5c, x5t)

Библиотека jose опирается на эти поля для построения строгой, предсказуемой и проверяемой модели криптографических операций в JavaScript-среде.