Вы просматриваете документацию Apigee Edge .
Перейдите в документацию Apigee X.info
В этом разделе представлена общая информация о JWT (JSON Web Token) и JWS (JSON Web Signature), а также о политиках Apigee JWS/JWT, которая может представлять интерес для разработчиков прокси-серверов Apigee.
Введение
И JWS, и JWT широко используются для обмена утверждениями или заявлениями между подключенными приложениями. Политики JWS/JWT позволяют прокси-серверам Edge API:
- Сгенерируйте подписанный JWT или JWS .
- Проверьте подписанный JWT или JWS и заявления, содержащиеся в JWS/JWT.
- Расшифровать подписанный JWT или JWS без проверки подписи.
В последних двух случаях политика также устанавливает переменные, которые позволяют дополнительным политикам или самим серверным службам проверять подтвержденные утверждения и принимать решения на их основе.
При использовании политики «Проверка JWS/JWT» недействительный JWS/JWT будет отклонен, что приведет к ошибке. Аналогично, при использовании политики «Декодирование JWS/JWT» некорректный JWS/JWT также приведет к ошибке.
Видео
Посмотрите короткое видео, чтобы быстро ознакомиться с JWT. Хотя это видео посвящено именно созданию JWT, многие из рассматриваемых концепций применимы и к JWS.
Это короткое видео позволит вам узнать больше о структуре JWT.
Варианты использования
Политики JWS/JWT можно использовать для:
- Создайте новый JWS/JWT либо на стороне прокси-сервера, либо на стороне целевой конечной точки пограничного прокси-сервера. Например, вы можете создать поток запросов прокси-сервера, который генерирует JWS/JWT и возвращает его клиенту. Или вы можете настроить прокси-сервер таким образом, чтобы он генерировал JWS/JWT в потоке запросов целевой точки и прикреплял его к запросу, отправленному на целевую точку. Затем эти утверждения будут доступны для того, чтобы бэкэнд-сервисы могли применять дальнейшую обработку безопасности.
- Проверка и извлечение утверждений из JWS/JWT, полученных из входящих запросов клиентов, ответов целевых служб, ответов политик вызовов служб или из других источников. Edge проверит подпись JWS/JWT, независимо от того, был ли JWS/JWT сгенерирован третьей стороной или самой Edge, используя алгоритмы RSA или HMAC.
- Расшифровка JWS/JWT. Расшифровка наиболее полезна при использовании совместно с политикой проверки JWS/JWT, когда значение утверждения (JWT) или заголовка (JWS/JWT) внутри JWS/JWT должно быть известно до проверки JWS/JWT.
Части JWS/JWT
Подписанный JWS/JWT кодирует информацию в трех частях, разделенных точками: заголовок, полезная нагрузка и подпись.
header.payload.signature
- Политика Generate JWS/JWT создает все три части.
- Политика проверки JWS/JWT рассматривает все три части.
- Политика декодирования JWS/JWT проверяет только заголовок и полезную нагрузку.
JWS также поддерживает отсоединенный формат, в котором полезная нагрузка из JWS отсутствует:
header..signature
При использовании отсоединенного JWS полезная нагрузка отправляется отдельно от JWS. Для указания необработанной, незакодированной полезной нагрузки JWS используется элемент <DetachedContent> политики проверки JWS. Затем политика проверки JWS проверяет JWS, используя заголовок и подпись в JWS, а также полезную нагрузку, указанную элементом <DetachedContent> .
Чтобы узнать больше о токенах, а также о том, как они кодируются и подписываются, см.:
- JWT : IETF RFC7519
- JWS : IETF RFC7515
Различия между JWS и JWT
Для обмена утверждениями или заявлениями между подключенными приложениями можно использовать либо JWT, либо JWS. Основное различие между ними заключается в способе представления полезной нагрузки:
- JWT
- Полезная нагрузка всегда представляет собой объект JSON.
- Полезная нагрузка всегда прикреплена к JWT.
- В заголовке
typтокена всегда устанавливается значениеJWT
- JWS
- Полезная нагрузка может быть представлена в любом формате, например, в виде объекта JSON, потока байтов, потока октетов и других.
- Полезную нагрузку не обязательно прикреплять к JWS.
Поскольку формат JWT всегда использует объект JSON для представления полезной нагрузки, политики Edge Generate JWT и Verify JWT имеют встроенную поддержку для обработки распространенных зарегистрированных имен утверждений, таких как aud , iss , sub и другие. Это означает, что вы можете использовать элементы политики Generate JWT для установки этих утверждений в полезной нагрузке, а элементы политики Verify JWT — для проверки их значений. Дополнительную информацию см. в разделе «Зарегистрированные имена утверждений» спецификации JWT.
Помимо поддержки определенных зарегистрированных имен утверждений, политика генерации JWT напрямую поддерживает добавление в JWT утверждений с произвольными именами. Каждое утверждение представляет собой простую пару «имя/значение», где значение может быть типа число, логическое значение, строка, карта или массив.
Поскольку JWS может использовать любое представление данных для полезной нагрузки, вы не можете добавлять утверждения в полезную нагрузку. Политика Generate JWS поддерживает добавление утверждений с произвольными именами в заголовок JWS. Кроме того, политики JWS поддерживают отдельную полезную нагрузку, когда JWS не содержит полезной нагрузки. Отдельная полезная нагрузка позволяет отправлять JWS и полезную нагрузку отдельно и требуется в соответствии с рядом стандартов безопасности.
Предотвращение внедрения шаблона при использовании JWS и JWT
Чтобы предотвратить несанкционированное разглашение данных, следуйте этим рекомендациям при использовании политик GenerateJWT или GenerateJWS:
- Избегайте прямых ссылок на пользовательский ввод: никогда не используйте ненадежные входные данные (например,
request.queryparam.*илиrequest.header.*) напрямую в атрибутеref, поддерживающем шаблонизацию. - Очистка входных данных: Если вам необходимо использовать внешние данные в утверждении JWT/JWS, сначала используйте политику AssignMessage для удаления фигурных скобок (
{ }) или других символов шаблона из входных данных перед тем, как ссылаться на них. - Используйте явные утверждения для строк: для простых строковых утверждений избегайте использования
type="map". Использованиеtype="string"по умолчанию предотвращает неявное шаблонирование ссылочного значения. - Обратите внимание на несоответствие в поведении политик проверки и генерации: политики генерации JWS и JWT ведут себя иначе, чем политики проверки, в отношении шаблонизации.
Об алгоритмах подписи
Политики проверки и генерации JWS/JWT поддерживают алгоритмы RSA, RSASSA-PSS, ECDSA и HMAC, используя контрольные суммы SHA2 с битовой стойкостью 256, 384 или 512. Политика декодирования JWS/JWT работает независимо от алгоритма, использованного для подписи JWS/JWT.
алгоритм HMAC
Алгоритм HMAC основан на использовании общего секрета, известного как секретный ключ, для создания подписи (также известной как подписание JWS/JWT) и для проверки подписи.
Минимальная длина секретного ключа зависит от битовой стойкости алгоритма:
- HS256: минимальная длина ключа 32 байта.
- HS386: минимальная длина ключа 48 байт.
- HS512: минимальная длина ключа 64 байта.
алгоритм RSA
Алгоритм RSA использует пару открытого и закрытого ключей для криптографической подписи. При использовании подписей RSA подписывающая сторона использует закрытый ключ RSA для подписи JWS/JWT, а проверяющая сторона использует соответствующий открытый ключ RSA для проверки подписи JWS/JWT. Ограничений по размеру ключей нет.
алгоритм RSASSA-PSS
Алгоритм RSASSA-PSS является обновленной версией алгоритма RSA. Как и RSS, RSASSA-PSS использует пару открытого/закрытого ключей RSA для криптографической подписи. Формат ключа такой же, как и для RSS. Подписывающая сторона использует закрытый ключ для подписи JWS/JWT, а проверяющая сторона использует соответствующий открытый ключ для проверки подписи JWS/JWT. Ограничений по размеру ключей нет.
алгоритм ECDSA
Алгоритм цифровой подписи на эллиптических кривых (ECDSA) — это алгоритм криптографии на эллиптических кривых с кривыми P-256, P-384 и P-521. При использовании алгоритма ECDSA определяется тип открытого и закрытого ключа, который необходимо указать:
| Алгоритм | Изгиб | Ключевое требование |
|---|---|---|
| ES256 | П-256 | Ключ, сгенерированный на основе кривой P-256 (также известной как secp256r1 или prime256v1). |
| ES384 | П-384 | Ключ, сгенерированный на основе кривой P-384 (также известной как secp384r1). |
| ES512 | П-521 | Ключ, сгенерированный на основе кривой P-521 (также известной как secp521r1). |
Алгоритмы шифрования ключей
Политики JWS/JWT поддерживают все алгоритмы шифрования ключей, поддерживаемые OpenSSL .
Использование набора веб-ключей JSON (JWKS) для проверки JWS/JWT
При проверке подписанного JWS/JWT необходимо предоставить открытый ключ, связанный с закрытым ключом, использованным для подписи токена. Для проверки JWS/JWT можно использовать два варианта предоставления открытого ключа:
- использовать фактическое значение открытого ключа (обычно предоставляемое в переменной потока) или
- Используйте открытый ключ, заключенный в JWKS-файл.
О JWKS
JWKS — это структура JSON, представляющая набор веб-ключей JSON (JWK). JWK — это структура данных JSON, представляющая криптографический ключ. JWK и JWKS описаны в RFC7517 . Примеры JKWS см. в Приложении A. Примеры наборов веб-ключей JSON.
Структура JWKS
В RFC7517 описаны ключевые элементы JWKS для каждого типа ключа, например, "RSA" или "EC". Например, в зависимости от типа ключа эти параметры могут включать:
- kty - Тип ключа, например, "RSA" или "EC".
- kid (идентификатор ключа) — может принимать любое произвольное значение (без дубликатов в наборе ключей). Если входящий JWT имеет идентификатор ключа, присутствующий в наборе JWKS, то политика будет использовать правильный открытый ключ для проверки подписи JWS/JWT.
Ниже приведены примеры необязательных элементов и их значений:
- alg — ключевой алгоритм. Он должен совпадать с алгоритмом подписи в JWS/JWT.
- использование - Если присутствует, должно быть sig.
Приведенный ниже JWKS-файл содержит необходимые элементы и значения и будет действителен в Edge (из https://www.googleapis.com/oauth2/v3/certs ):
{
"keys":[
{
"kty":"RSA",
"alg":"RS256",
"use":"sig",
"kid":"ca04df587b5a7cead80abee9ea8dcf7586a78e01",
"n":"iXn-WmrwLLBa-QDiToBozpu4Y4ThKdwORWFXQa9I75pKOvPUjUjE2Bk05TUSt7-V7KDjCq0_Nkd-X9rMRV5LKgCa0_F8YgI30QS3bUm9orFryrdOc65PUIVFVxIwMZuGDY1hj6HEJVWIr0CZdcgNIll06BasclckkUK4O-Eh7MaQrqb646ghFlG3zlgk9b2duHbDOq3s39ICPinRQWC6NqTYfqg7E8GN_NLY9srUCc_MswuUfMJ2cKT6edrhLuIwIj_74YGkpOwilr2VswKsvJ7dcoiJxheKYvKDKtZFkbKrWETTJSGX2Xeh0DFB0lqbKLVvqkM2lFU2Qx1OgtTnrw",
"e":"AQAB"
},
{
"kty":"EC",
"alg":"ES256",
"use":"enc",
"kid":"k05TUSt7-V7KDjCq0_N"
"crv":"P-256",
"x":"Xej56MungXuFZwmk_xccvsMpCtXmqhvEEMCmHyAmKF0",
"y":"Bozpu4Y4ThKdwORWFXQa9I75pKOvPUjUjE2Bk05TUSt",
}
]
}Разработка прокси-сервера для использования JWKS
Когда JWS/JWT получают от эмитента, часто эмитент вставляет в заголовок JWS/JWT идентификатор ключа (или kid). Этот ключ сообщает получателю JWS/JWT, как найти открытый или секретный ключ, необходимый для проверки подписи подписанного JWS/JWT.
В качестве примера предположим, что эмитент подписывает JWT закрытым ключом. "Идентификатор ключа" определяет соответствующий открытый ключ, используемый для проверки JWT. Список открытых ключей обычно доступен по какой-либо известной конечной точке, например: https://www.googleapis.com/oauth2/v3/certs .
Это основная последовательность действий, которую Edge (или любая другая платформа, работающая с JWKS) должна выполнить для работы с JWS/JWT, содержащим JWKS-файл:
- Изучите заголовок JWS/JWT, чтобы найти идентификатор ключа (kid).
- Изучите заголовок JWS/JWT, чтобы найти алгоритм подписи (alg), например, RS256.
- Получите список ключей и идентификаторов из JWKS-файла известной конечной точки для заданного эмитента.
- Извлеките открытый ключ из списка ключей, используя идентификатор ключа, указанный в заголовке JWS/JWT, и соответствующий алгоритм, если алгоритм указан в ключе JWKS.
- Используйте этот открытый ключ для проверки подписи JWS/JWT.
Разработчику прокси-серверов Edge API необходимо выполнить следующие действия для проверки JWS/JWT:
- Получите список ключей и идентификаторов из общеизвестной конечной точки для заданного эмитента. Для этого шага можно использовать политику вызова сервиса.
- В политике проверки JWS/JWT укажите местоположение JWS/JWT в элементе
<Source>, а полезную нагрузку JWKS — в элементе<PublicKey/JWKS>. Например, для политики проверки JWT:<VerifyJWT name="JWT-Verify-RS256"> <Algorithm>RS256</Algorithm> <Source>json.jwt</Source> <IgnoreUnresolvedVariables>false</IgnoreUnresolvedVariables> <PublicKey> <JWKS ref="public.jwks"/> </PublicKey> <Subject>apigee-seattle-hatrack-montage</Subject> <Issuer>urn://apigee-edge-JWT-policy-test</Issuer> <Audience>urn://c60511c0-12a2-473c-80fd-42528eb65a6a</Audience> <AdditionalClaims> <Claim name="show">And now for something completely different.</Claim> </AdditionalClaims> </VerifyJWT>
Политика проверки JWT выполняет все остальные действия:
- Если в JWKS не найден ключ с идентификатором, совпадающим с идентификатором ключа (kid), указанным в JWT, то политика проверки JWT выдает ошибку и не проверяет JWT.
- Если входящий JWT не содержит идентификатор ключа (kid) в заголовке, то сопоставление keyid с verification-key невозможно.
Как разработчик прокси-сервера, вы отвечаете за определение используемого ключа; в некоторых случаях это может быть фиксированный, жестко закодированный ключ.
, Вы просматриваете документацию Apigee Edge .
Перейдите в документацию Apigee X.info
В этом разделе представлена общая информация о JWT (JSON Web Token) и JWS (JSON Web Signature), а также о политиках Apigee JWS/JWT, которая может представлять интерес для разработчиков прокси-серверов Apigee.
Введение
И JWS, и JWT широко используются для обмена утверждениями или заявлениями между подключенными приложениями. Политики JWS/JWT позволяют прокси-серверам Edge API:
- Сгенерируйте подписанный JWT или JWS .
- Проверьте подписанный JWT или JWS и заявления, содержащиеся в JWS/JWT.
- Расшифровать подписанный JWT или JWS без проверки подписи.
В последних двух случаях политика также устанавливает переменные, которые позволяют дополнительным политикам или самим серверным службам проверять подтвержденные утверждения и принимать решения на их основе.
При использовании политики «Проверка JWS/JWT» недействительный JWS/JWT будет отклонен, что приведет к ошибке. Аналогично, при использовании политики «Декодирование JWS/JWT» некорректный JWS/JWT также приведет к ошибке.
Видео
Посмотрите короткое видео, чтобы быстро ознакомиться с JWT. Хотя это видео посвящено именно созданию JWT, многие из рассматриваемых концепций применимы и к JWS.
Это короткое видео позволит вам узнать больше о структуре JWT.
Варианты использования
Политики JWS/JWT можно использовать для:
- Создайте новый JWS/JWT либо на стороне прокси-сервера, либо на стороне целевой конечной точки пограничного прокси-сервера. Например, вы можете создать поток запросов прокси-сервера, который генерирует JWS/JWT и возвращает его клиенту. Или вы можете настроить прокси-сервер таким образом, чтобы он генерировал JWS/JWT в потоке запросов целевой точки и прикреплял его к запросу, отправленному на целевую точку. Затем эти утверждения будут доступны для того, чтобы бэкэнд-сервисы могли применять дальнейшую обработку безопасности.
- Проверка и извлечение утверждений из JWS/JWT, полученных из входящих запросов клиентов, ответов целевых служб, ответов политик вызовов служб или из других источников. Edge проверит подпись JWS/JWT, независимо от того, был ли JWS/JWT сгенерирован третьей стороной или самой Edge, используя алгоритмы RSA или HMAC.
- Расшифровка JWS/JWT. Расшифровка наиболее полезна при использовании совместно с политикой проверки JWS/JWT, когда значение утверждения (JWT) или заголовка (JWS/JWT) внутри JWS/JWT должно быть известно до проверки JWS/JWT.
Части JWS/JWT
Подписанный JWS/JWT кодирует информацию в трех частях, разделенных точками: заголовок, полезная нагрузка и подпись.
header.payload.signature
- Политика Generate JWS/JWT создает все три части.
- Политика проверки JWS/JWT рассматривает все три части.
- Политика декодирования JWS/JWT проверяет только заголовок и полезную нагрузку.
JWS также поддерживает отсоединенный формат, в котором полезная нагрузка из JWS отсутствует:
header..signature
При использовании отсоединенного JWS полезная нагрузка отправляется отдельно от JWS. Для указания необработанной, незакодированной полезной нагрузки JWS используется элемент <DetachedContent> политики проверки JWS. Затем политика проверки JWS проверяет JWS, используя заголовок и подпись в JWS, а также полезную нагрузку, указанную элементом <DetachedContent> .
Чтобы узнать больше о токенах, а также о том, как они кодируются и подписываются, см.:
- JWT : IETF RFC7519
- JWS : IETF RFC7515
Различия между JWS и JWT
Для обмена утверждениями или заявлениями между подключенными приложениями можно использовать либо JWT, либо JWS. Основное различие между ними заключается в способе представления полезной нагрузки:
- JWT
- Полезная нагрузка всегда представляет собой объект JSON.
- Полезная нагрузка всегда прикреплена к JWT.
- В заголовке
typтокена всегда устанавливается значениеJWT
- JWS
- Полезная нагрузка может быть представлена в любом формате, например, в виде объекта JSON, потока байтов, потока октетов и других.
- Полезную нагрузку не обязательно прикреплять к JWS.
Поскольку формат JWT всегда использует объект JSON для представления полезной нагрузки, политики Edge Generate JWT и Verify JWT имеют встроенную поддержку для обработки распространенных зарегистрированных имен утверждений, таких как aud , iss , sub и другие. Это означает, что вы можете использовать элементы политики Generate JWT для установки этих утверждений в полезной нагрузке, а элементы политики Verify JWT — для проверки их значений. Дополнительную информацию см. в разделе «Зарегистрированные имена утверждений» спецификации JWT.
Помимо поддержки определенных зарегистрированных имен утверждений, политика генерации JWT напрямую поддерживает добавление в JWT утверждений с произвольными именами. Каждое утверждение представляет собой простую пару «имя/значение», где значение может быть типа число, логическое значение, строка, карта или массив.
Поскольку JWS может использовать любое представление данных для полезной нагрузки, вы не можете добавлять утверждения в полезную нагрузку. Политика Generate JWS поддерживает добавление утверждений с произвольными именами в заголовок JWS. Кроме того, политики JWS поддерживают отдельную полезную нагрузку, когда JWS не содержит полезной нагрузки. Отдельная полезная нагрузка позволяет отправлять JWS и полезную нагрузку отдельно и требуется в соответствии с рядом стандартов безопасности.
Предотвращение внедрения шаблона при использовании JWS и JWT
Чтобы предотвратить несанкционированное разглашение данных, следуйте этим рекомендациям при использовании политик GenerateJWT или GenerateJWS:
- Избегайте прямых ссылок на пользовательский ввод: никогда не используйте ненадежные входные данные (например,
request.queryparam.*илиrequest.header.*) напрямую в атрибутеref, поддерживающем шаблонизацию. - Очистка входных данных: Если вам необходимо использовать внешние данные в утверждении JWT/JWS, сначала используйте политику AssignMessage для удаления фигурных скобок (
{ }) или других символов шаблона из входных данных перед тем, как ссылаться на них. - Используйте явные утверждения для строк: для простых строковых утверждений избегайте использования
type="map". Использованиеtype="string"по умолчанию предотвращает неявное шаблонирование ссылочного значения. - Обратите внимание на несоответствие в поведении политик проверки и генерации: политики генерации JWS и JWT ведут себя иначе, чем политики проверки, в отношении шаблонизации.
Об алгоритмах подписи
Политики проверки и генерации JWS/JWT поддерживают алгоритмы RSA, RSASSA-PSS, ECDSA и HMAC, используя контрольные суммы SHA2 с битовой стойкостью 256, 384 или 512. Политика декодирования JWS/JWT работает независимо от алгоритма, использованного для подписи JWS/JWT.
алгоритм HMAC
Алгоритм HMAC основан на использовании общего секрета, известного как секретный ключ, для создания подписи (также известной как подписание JWS/JWT) и для проверки подписи.
Минимальная длина секретного ключа зависит от битовой стойкости алгоритма:
- HS256: минимальная длина ключа 32 байта.
- HS386: минимальная длина ключа 48 байт.
- HS512: минимальная длина ключа 64 байта.
алгоритм RSA
Алгоритм RSA использует пару открытого и закрытого ключей для криптографической подписи. При использовании подписей RSA подписывающая сторона использует закрытый ключ RSA для подписи JWS/JWT, а проверяющая сторона использует соответствующий открытый ключ RSA для проверки подписи JWS/JWT. Ограничений по размеру ключей нет.
алгоритм RSASSA-PSS
Алгоритм RSASSA-PSS является обновленной версией алгоритма RSA. Как и RSS, RSASSA-PSS использует пару открытого/закрытого ключей RSA для криптографической подписи. Формат ключа такой же, как и для RSS. Подписывающая сторона использует закрытый ключ для подписи JWS/JWT, а проверяющая сторона использует соответствующий открытый ключ для проверки подписи JWS/JWT. Ограничений по размеру ключей нет.
алгоритм ECDSA
Алгоритм цифровой подписи на эллиптических кривых (ECDSA) — это алгоритм криптографии на эллиптических кривых с кривыми P-256, P-384 и P-521. При использовании алгоритма ECDSA определяется тип открытого и закрытого ключа, который необходимо указать:
| Алгоритм | Изгиб | Ключевое требование |
|---|---|---|
| ES256 | П-256 | Ключ, сгенерированный на основе кривой P-256 (также известной как secp256r1 или prime256v1). |
| ES384 | П-384 | Ключ, сгенерированный на основе кривой P-384 (также известной как secp384r1). |
| ES512 | П-521 | Ключ, сгенерированный на основе кривой P-521 (также известной как secp521r1). |
Алгоритмы шифрования ключей
Политики JWS/JWT поддерживают все алгоритмы шифрования ключей, поддерживаемые OpenSSL .
Использование набора веб-ключей JSON (JWKS) для проверки JWS/JWT
При проверке подписанного JWS/JWT необходимо предоставить открытый ключ, связанный с закрытым ключом, использованным для подписи токена. Для проверки JWS/JWT можно использовать два варианта предоставления открытого ключа:
- использовать фактическое значение открытого ключа (обычно предоставляемое в переменной потока) или
- Используйте открытый ключ, заключенный в JWKS-файл.
О JWKS
JWKS — это структура JSON, представляющая набор веб-ключей JSON (JWK). JWK — это структура данных JSON, представляющая криптографический ключ. JWK и JWKS описаны в RFC7517 . Примеры JKWS см. в Приложении A. Примеры наборов веб-ключей JSON.
Структура JWKS
В RFC7517 описаны ключевые элементы JWKS для каждого типа ключа, например, "RSA" или "EC". Например, в зависимости от типа ключа эти параметры могут включать:
- kty - Тип ключа, например, "RSA" или "EC".
- kid (идентификатор ключа) — может принимать любое произвольное значение (без дубликатов в наборе ключей). Если входящий JWT имеет идентификатор ключа, присутствующий в наборе JWKS, то политика будет использовать правильный открытый ключ для проверки подписи JWS/JWT.
Ниже приведены примеры необязательных элементов и их значений:
- alg — ключевой алгоритм. Он должен совпадать с алгоритмом подписи в JWS/JWT.
- использование - Если присутствует, должно быть sig.
Приведенный ниже JWKS-файл содержит необходимые элементы и значения и будет действителен в Edge (из https://www.googleapis.com/oauth2/v3/certs ):
{
"keys":[
{
"kty":"RSA",
"alg":"RS256",
"use":"sig",
"kid":"ca04df587b5a7cead80abee9ea8dcf7586a78e01",
"n":"iXn-WmrwLLBa-QDiToBozpu4Y4ThKdwORWFXQa9I75pKOvPUjUjE2Bk05TUSt7-V7KDjCq0_Nkd-X9rMRV5LKgCa0_F8YgI30QS3bUm9orFryrdOc65PUIVFVxIwMZuGDY1hj6HEJVWIr0CZdcgNIll06BasclckkUK4O-Eh7MaQrqb646ghFlG3zlgk9b2duHbDOq3s39ICPinRQWC6NqTYfqg7E8GN_NLY9srUCc_MswuUfMJ2cKT6edrhLuIwIj_74YGkpOwilr2VswKsvJ7dcoiJxheKYvKDKtZFkbKrWETTJSGX2Xeh0DFB0lqbKLVvqkM2lFU2Qx1OgtTnrw",
"e":"AQAB"
},
{
"kty":"EC",
"alg":"ES256",
"use":"enc",
"kid":"k05TUSt7-V7KDjCq0_N"
"crv":"P-256",
"x":"Xej56MungXuFZwmk_xccvsMpCtXmqhvEEMCmHyAmKF0",
"y":"Bozpu4Y4ThKdwORWFXQa9I75pKOvPUjUjE2Bk05TUSt",
}
]
}Разработка прокси-сервера для использования JWKS
Когда JWS/JWT получают от эмитента, часто эмитент вставляет в заголовок JWS/JWT идентификатор ключа (или kid). Этот ключ сообщает получателю JWS/JWT, как найти открытый или секретный ключ, необходимый для проверки подписи подписанного JWS/JWT.
В качестве примера предположим, что эмитент подписывает JWT закрытым ключом. "Идентификатор ключа" определяет соответствующий открытый ключ, используемый для проверки JWT. Список открытых ключей обычно доступен по какой-либо известной конечной точке, например: https://www.googleapis.com/oauth2/v3/certs .
Это основная последовательность действий, которую Edge (или любая другая платформа, работающая с JWKS) должна выполнить для работы с JWS/JWT, содержащим JWKS-файл:
- Изучите заголовок JWS/JWT, чтобы найти идентификатор ключа (kid).
- Изучите заголовок JWS/JWT, чтобы найти алгоритм подписи (alg), например, RS256.
- Получите список ключей и идентификаторов из JWKS-файла известной конечной точки для заданного эмитента.
- Извлеките открытый ключ из списка ключей, используя идентификатор ключа, указанный в заголовке JWS/JWT, и соответствующий алгоритм, если алгоритм указан в ключе JWKS.
- Используйте этот открытый ключ для проверки подписи JWS/JWT.
Разработчику прокси-серверов Edge API необходимо выполнить следующие действия для проверки JWS/JWT:
- Получите список ключей и идентификаторов из общеизвестной конечной точки для заданного эмитента. Для этого шага можно использовать политику вызова сервиса.
- В политике проверки JWS/JWT укажите местоположение JWS/JWT в элементе
<Source>, а полезную нагрузку JWKS — в элементе<PublicKey/JWKS>. Например, для политики проверки JWT:<VerifyJWT name="JWT-Verify-RS256"> <Algorithm>RS256</Algorithm> <Source>json.jwt</Source> <IgnoreUnresolvedVariables>false</IgnoreUnresolvedVariables> <PublicKey> <JWKS ref="public.jwks"/> </PublicKey> <Subject>apigee-seattle-hatrack-montage</Subject> <Issuer>urn://apigee-edge-JWT-policy-test</Issuer> <Audience>urn://c60511c0-12a2-473c-80fd-42528eb65a6a</Audience> <AdditionalClaims> <Claim name="show">And now for something completely different.</Claim> </AdditionalClaims> </VerifyJWT>
Политика проверки JWT выполняет все остальные действия:
- Если в JWKS не найден ключ с идентификатором, совпадающим с идентификатором ключа (kid), указанным в JWT, то политика проверки JWT выдает ошибку и не проверяет JWT.
- Если входящий JWT не содержит идентификатор ключа (kid) в заголовке, то сопоставление keyid с verification-key невозможно.
Как разработчик прокси-сервера, вы отвечаете за определение используемого ключа; в некоторых случаях это может быть фиксированный, жестко закодированный ключ.