Вы просматриваете документацию Apigee Edge .
Перейдите в документацию Apigee X.info
Что
Генерирует подписанный JWS с настраиваемым набором утверждений. Затем JWS может быть возвращен клиентам, передан на целевые серверы или использован другими способами. Подробное описание см. в разделе «Обзор политик JWS и JWT» .
Чтобы узнать о компонентах JWS, а также о том, как они шифруются и подписываются, обратитесь к RFC7515 .
Видео
Посмотрите короткое видео, чтобы узнать, как сгенерировать подписанный JWT. Хотя это видео посвящено именно генерации JWT, многие из рассматриваемых принципов применимы и к JWS.
Образцы
- Сгенерируйте прикрепленный JWS-файл, подписанный с использованием алгоритма HS256.
- Сгенерируйте отсоединенный JWS, подписанный с использованием алгоритма RS256.
Сгенерируйте прикрепленный JWS-файл, подписанный с использованием алгоритма HS256.
В этом примере политики генерируется прикрепленный JWS-файл и подписывается с использованием алгоритма HS256. Алгоритм HS256 использует общий секретный ключ как для подписания, так и для проверки подписи.
Прикрепленный файл JWS содержит закодированный заголовок, полезную нагрузку и подпись:
header.payload.signature
Установите значение <DetachContent> в true, чтобы сгенерировать отсоединенное содержимое. Дополнительную информацию о структуре и формате JWS см. в разделе «Части JWS/JWT» .
Используйте элемент <Payload> для указания необработанного, незакодированного содержимого JWS. В этом примере содержимое JWS содержится в переменной. При срабатывании этого действия политики Edge кодирует заголовок и содержимое JWS, а затем добавляет закодированную подпись для цифровой подписи JWS.
Приведенная ниже конфигурация политики создает JWS из полезной нагрузки, содержащейся в переменной private.payload .
<GenerateJWS name="JWS-Generate-HS256"> <DisplayName>JWS Generate HS256</DisplayName> <Algorithm>HS256</Algorithm> <IgnoreUnresolvedVariables>false</IgnoreUnresolvedVariables> <SecretKey> <Value ref="private.secretkey"/> <Id>1918290</Id> </SecretKey> <Payload ref="private.payload" /> <OutputVariable>jws-variable</OutputVariable> </GenerateJWS>
Сгенерируйте отсоединенный JWS, подписанный с использованием алгоритма RS256.
В этом примере политики генерируется отсоединенный JWS-файл и подписывается с использованием алгоритма RS256. Генерация подписи RS256 основана на закрытом ключе RSA, который должен быть предоставлен в формате PEM.
Отделенный модуль JWS не включает полезную нагрузку из модуля JWS:
header..signature
Используйте элемент <Payload> для указания необработанной, незакодированной полезной нагрузки JWS. При срабатывании этой политики Edge кодирует заголовок и полезную нагрузку JWS, а затем использует их для генерации закодированной подписи. Однако сгенерированная JWS не содержит полезной нагрузки. Вам необходимо передать полезную нагрузку в политику VerifyJWS, используя элемент <DetachedContent> политики VerifyJWS.
<GenerateJWS name="JWS-Generate-RS256"> <DisplayName>JWS Generate RS256</DisplayName> <Algorithm>RS256</Algorithm> <IgnoreUnresolvedVariables>false</IgnoreUnresolvedVariables> <PrivateKey> <Value ref="private.privatekey"/> <Password ref="private.privatekey-password"/> <Id ref="private.privatekey-id"/> </PrivateKey> <Payload ref="private.payload" /> <DetachContent>true</DetachContent> <OutputVariable>jws-variable</OutputVariable> </GenerateJWS>
Определение ключевых элементов
Элементы, используемые для указания ключа, применяемого для генерации JWS, зависят от выбранного алгоритма, как показано в следующей таблице:
| Алгоритм | Ключевые элементы | |
|---|---|---|
| HS{256/384/512} * | <SecretKey> <Value ref="private.secretkey"/> <Id>1918290</Id> </SecretKey> | |
| RS/PS/ES{256/384/512} * | <PrivateKey> <Value ref="private.privatekey"/> <Password ref="private.privatekey-password"/> <Id ref="private.privatekey-id"/> </PrivateKey> Элементы | |
| * Более подробную информацию об основных требованиях см. в разделе «Об алгоритмах шифрования подписи» . | ||
Справочник элементов для генерации JWS
В справочном документе по политике описаны элементы и атрибуты политики «Создать JWS».
Примечание: Настройки могут несколько отличаться в зависимости от используемого алгоритма шифрования. Примеры настроек для конкретных сценариев использования см. в разделе «Примеры» .
Атрибуты, применяемые к элементу верхнего уровня.
<GenerateJWS name="JWS" continueOnError="false" enabled="true" async="false">
Следующие атрибуты являются общими для всех родительских элементов политики.
| Атрибут | Описание | По умолчанию | Присутствие |
|---|---|---|---|
| имя | Внутреннее имя политики. В имени можно использовать только следующие символы: A-Z0-9._\-$ % . Однако пользовательский интерфейс управления Edge применяет дополнительные ограничения, например, автоматически удаляет небуквенно-цифровые символы. При желании используйте элемент | Н/Д | Необходимый |
| continueOnError | Установите значение false , чтобы при сбое политики возвращалась ошибка. Это ожидаемое поведение для большинства политик. Установите значение | ЛОЖЬ | Необязательный |
| включено | Установите значение true , чтобы обеспечить соблюдение политики. Установите значение | истинный | Необязательный |
| асинхронный | Этот атрибут устарел. | ЛОЖЬ | Устаревший |
<DisplayName>
<DisplayName>Policy Display Name</DisplayName>
Используйте этот параметр в дополнение к атрибуту name, чтобы присвоить политике в редакторе прокси-сервера пользовательского интерфейса управления другое имя, понятное на естественном языке.
| По умолчанию | Если этот элемент опустить, будет использовано значение атрибута name политики. |
| Присутствие | Необязательный |
| Тип | Нить |
<Алгоритм>
<Algorithm>algorithm-here</Algorithm>
Указывает алгоритм шифрования для подписи токена.
| По умолчанию | Н/Д |
| Присутствие | Необходимый |
| Тип | Нить |
| Допустимые значения | HS256, HS384, HS512, RS256, RS384, RS512, ES256, ES384, ES512, PS256, PS384, PS512 |
<AdditionalHeaders/Claim>
<AdditionalHeaders> <Claim name='claim1'>explicit-value-of-claim-here</Claim> <Claim name='claim2' ref='variable-name-here'/> <Claim name='claim3' ref='variable-name-here' type='boolean'/> <Claim name='claim4' ref='variable-name' type='string' array='true'/> </AdditionalHeaders>
Добавляет пару(и) дополнительное(ые) имя/значение утверждения в заголовок JWS.
| По умолчанию | Н/Д |
| Присутствие | Необязательный |
| Допустимые значения | Любое значение, которое вы хотите использовать в качестве дополнительного параметра. Вы можете указать параметр явно в виде строки, числа, логического значения, карты или массива. |
Элемент <Claim> имеет следующие атрибуты:
- Название - (Обязательно) Название претензии.
- ref - (Необязательно) Имя переменной потока. Если присутствует, политика будет использовать значение этой переменной в качестве утверждения. Если указаны и атрибут ref , и явное значение утверждения, по умолчанию используется явное значение, если ссылочная переменная потока не определена.
- тип - (Необязательно) Один из следующих вариантов: строка (по умолчанию), число, логическое значение или карта
- array - (Необязательно) Установите значение true , чтобы указать, является ли значение массивом типов. По умолчанию: false.
<Критические заголовки>
<CriticalHeaders>a,b,c</CriticalHeaders> or: <CriticalHeaders ref=’variable_containing_headers’/>
Добавляет критически важный заголовок crit в JWS. Заголовок crit представляет собой массив имен заголовков, которые должны быть известны и распознаны получателем JWS. Например:
{
“typ: “...”,
“alg” : “...”,
“crit” : [ “a”, “b”, “c” ],
}Во время выполнения политика VerifyJWS проверяет заголовок crit . Для каждого заголовка, указанного в заголовке crit , она проверяет, содержит ли элемент <KnownHeaders> политики VerifyJWS этот заголовок. Любой заголовок, обнаруженный политикой VerifyJWS в заголовке crit , который не указан в элементе <KnownHeaders> приводит к сбою политики VerifyJWS.
| По умолчанию | Н/Д |
| Присутствие | Необязательный |
| Тип | Разделённый запятыми массив строк |
| Допустимые значения | Либо массив, либо имя переменной, содержащей массив. |
<ОтсоединитьСодержимое>
<DetachContent>true|false</DetachContent>
Указывает, следует ли генерировать JWS с отсоединенной полезной нагрузкой, <DetachContent>true</DetachContent> , или нет, <DetachContent>false</DetachContent> .
Если указать значение false (по умолчанию), сгенерированный JWS-файл будет иметь следующий вид:
header.payload.signature
Если указать значение true для создания отсоединенной полезной нагрузки, сгенерированный JWS-файл будет содержать полезную нагрузку и иметь следующий вид:
header..signature
При использовании отсоединенной полезной нагрузки вам необходимо передать исходную незакодированную полезную нагрузку в политику VerifyJWS, используя элемент <DetachedContent> политики VerifyJWS.
| По умолчанию | ЛОЖЬ |
| Присутствие | Необязательный |
| Тип | Логический |
| Допустимые значения | верно или неверно |
<IgnoreUnresolvedVariables>
<IgnoreUnresolvedVariables>true|false</IgnoreUnresolvedVariables>
Установите значение false, если хотите, чтобы политика выдавала ошибку, если какая-либо указанная в политике переменная не может быть разрешена. Установите значение true, чтобы рассматривать любую неразрешимую переменную как пустую строку (null).
| По умолчанию | ЛОЖЬ |
| Присутствие | Необязательный |
| Тип | Логический |
| Допустимые значения | верно или неверно |
<OutputVariable>
<OutputVariable>JWS-variable</OutputVariable>
Указывает, куда следует поместить JWS-файл, сгенерированный данной политикой. По умолчанию он помещается в переменную потока jws. POLICYNAME .generated_jws .
| По умолчанию | jws. POLICYNAME .generated_jws |
| Присутствие | Необязательный |
| Тип | Строка (имя переменной потока) |
<Полезная нагрузка>
<Payload ref="flow-variable-name-here" /> or <Payload>payload-value</Payload>
Указывает исходный, незакодированный JWS-код. Укажите переменную, содержащую код, или строку.
| По умолчанию | Н/Д |
| Присутствие | Необходимый |
| Тип | Строка, массив байтов, поток или любое другое представление незакодированной полезной нагрузки JWS. |
<PrivateKey/Id>
<PrivateKey> <Id ref="flow-variable-name-here"/> </PrivateKey> or <PrivateKey> <Id>your-id-value-here</Id> </PrivateKey>
Указывает идентификатор ключа (kid), который следует включить в заголовок JWS. Используйте только в том случае, если алгоритм является одним из RS256/RS384/RS512, PS256/PS384/PS512 или ES256/ES384/ES512.
| По умолчанию | Н/Д |
| Присутствие | Необязательный |
| Тип | Нить |
| Допустимые значения | Переменная потока или строка |
<Закрытый ключ/Пароль>
<PrivateKey> <Password ref="private.privatekey-password"/> </PrivateKey>
При необходимости укажите пароль, который политика должна использовать для расшифровки закрытого ключа. Используйте атрибут `ref` для передачи ключа в переменной потока. Используйте только в том случае, если алгоритм является одним из RS256/RS384/RS512, PS256/PS384/PS512 или ES256/ES384/ES512.
| По умолчанию | Н/Д |
| Присутствие | Необязательный |
| Тип | Нить |
| Допустимые значения | Справочный номер переменной потока. Примечание: Необходимо указать переменную потока. Edge отклонит как недействительную конфигурацию политики, в которой пароль указан в открытом виде. Переменная потока должна иметь префикс "private". Например, |
<PrivateKey/Value>
<PrivateKey> <Value ref="private.variable-name-here"/> </PrivateKey>
Указывает закрытый ключ в формате PEM, используемый для подписи JWS. Используйте атрибут ref для передачи ключа в переменной потока. Используйте только в том случае, если алгоритм является одним из RS256/RS384/RS512, PS256/PS384/PS512 или ES256/ES384/ES512.
| По умолчанию | Н/Д |
| Присутствие | Необходимо для генерации JWS с использованием алгоритма RS256. |
| Тип | Нить |
| Допустимые значения | Переменная потока, содержащая строку, представляющую значение закрытого ключа RSA в формате PEM. Примечание: переменная потока должна иметь префикс "private". Например, |
<SecretKey/Id>
<SecretKey> <Id ref="flow-variable-name-here"/> </SecretKey> or <SecretKey> <Id>your-id-value-here</Id> </SecretKey>
Указывает идентификатор ключа (kid), который следует включить в заголовок JWS JWS, подписанного с использованием алгоритма HMAC. Используйте только в том случае, если используется один из алгоритмов HS256/HS384/HS512.
| По умолчанию | Н/Д |
| Присутствие | Необязательный |
| Тип | Нить |
| Допустимые значения | Переменная потока или строка |
<Секретный ключ/Значение>
<SecretKey> <Value ref="private.your-variable-name"/> </SecretKey>
Предоставляет секретный ключ, используемый для проверки или подписи токенов с помощью алгоритма HMAC. Используйте только в том случае, если используется один из алгоритмов HS256/HS384/HS512. Используйте атрибут ref для передачи ключа в переменной потока.
Edge устанавливает минимальную стойкость ключа для алгоритмов HS256/HS384/HS512. Минимальная длина ключа для HS256 составляет 32 байта, для HS384 — 48 байт, а для HS512 — 64 байта. Использование ключа меньшей стойкости приводит к ошибке во время выполнения.
| По умолчанию | Н/Д |
| Присутствие | Необходимо для алгоритмов HMAC. |
| Тип | Нить |
| Допустимые значения | Переменная потока, ссылающаяся на строку. Примечание: Если это переменная потока, она должна иметь префикс "private". Например, |
Переменные потока
Политика Generate JWS не устанавливает переменные потока.
Ссылка на ошибку
В этом разделе описаны коды ошибок и сообщения об ошибках, которые возвращаются, а также переменные ошибок, которые устанавливаются Edge, когда эта политика вызывает ошибку. Эту информацию важно знать, если вы разрабатываете правила обработки ошибок. Дополнительные сведения см. в разделах Что нужно знать об ошибках политики и Обработка ошибок .
Ошибки выполнения
Эти ошибки могут возникнуть при выполнении политики.
| Код неисправности | Статус HTTP | Происходит, когда |
|---|---|---|
steps.jws.GenerationFailed | 401 | Политике не удалось создать JWS. |
steps.jws.InsufficientKeyLength | 401 | Для ключа менее 32 байт для алгоритма HS256 |
steps.jws.InvalidClaim | 401 | В случае отсутствия утверждения или несоответствия утверждения, а также отсутствия заголовка или несоответствия заголовка. |
steps.jws.InvalidCurve | 401 | Кривая, заданная ключом, недопустима для алгоритма эллиптической кривой. |
steps.jws.InvalidJsonFormat | 401 | В заголовке JWS обнаружен недопустимый JSON. |
steps.jws.InvalidPayload | 401 | Полезная нагрузка JWS недействительна. |
steps.jws.InvalidSignature | 401 | <DetachedContent> опущен, и JWS имеет отсоединенную полезную нагрузку контента. |
steps.jws.KeyIdMissing | 401 | Политика Verify использует JWKS в качестве источника открытых ключей, но подписанный JWS не включает свойство kid в заголовок. |
steps.jws.KeyParsingFailed | 401 | Открытый ключ не удалось проанализировать из данной ключевой информации. |
steps.jws.MissingPayload | 401 | Полезная нагрузка JWS отсутствует. |
steps.jws.NoAlgorithmFoundInHeader | 401 | Происходит, когда JWS пропускает заголовок алгоритма. |
steps.jws.SigningFailed | 401 | В GenerateJWS для ключа размером меньше минимального для алгоритмов HS384 или HS512. |
steps.jws.UnknownException | 401 | Произошло неизвестное исключение. |
steps.jws.WrongKeyType | 401 | Указан неправильный тип ключа. Например, если вы укажете ключ RSA для алгоритма эллиптической кривой или ключ кривой для алгоритма RSA. |
Ошибки развертывания
Эти ошибки могут возникнуть при развертывании прокси-сервера, содержащего эту политику.
| Название ошибки | Происходит, когда |
|---|---|
InvalidAlgorithm | Единственные допустимые значения: RS256, RS384, RS512, PS256, PS384, PS512, ES256, ES384, ES512, HS256, HS384, HS512. |
| Другие возможные ошибки развертывания. |
Переменные неисправности
Эти переменные устанавливаются при возникновении ошибки во время выполнения. Дополнительные сведения см. в разделе Что нужно знать об ошибках политики .
| Переменные | Где | Пример |
|---|---|---|
fault.name=" fault_name " | fault_name — это имя ошибки, как указано в таблице ошибок времени выполнения выше. Имя неисправности — это последняя часть кода неисправности. | fault.name Matches "TokenExpired" |
JWS.failed | Все политики JWS устанавливают одну и ту же переменную в случае сбоя. | jws.JWS-Policy.failed = true |
Пример ответа об ошибке
Для обработки ошибок лучше всего перехватывать часть errorcode в ответе на ошибку. Не полагайтесь на текст в faultstring , поскольку он может измениться.
Пример правила неисправности
<FaultRules>
<FaultRule name="JWS Policy Errors">
<Step>
<Name>JavaScript-1</Name>
<Condition>(fault.name Matches "TokenExpired")</Condition>
</Step>
<Condition>JWS.failed=true</Condition>
</FaultRule>
</FaultRules>