Вы просматриваете документацию по Apigee Edge.
Перейдите к документации по Apigee X. Информация
Что
Создает подписанный 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/JWT…
Используйте элемент <Payload>, чтобы указать необработанную полезную нагрузку 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 полезная нагрузка отсутствует:
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> Элементы |
|
| *Подробнее об алгоритмах шифрования подписи… | ||
Справочник по элементам для функции Generate JWS
В справочнике по правилам описаны элементы и атрибуты правила Generate JWS.
Примечание. Настройки будут немного отличаться в зависимости от используемого алгоритма шифрования. В разделе Примеры приведены конфигурации для разных случаев использования.
Атрибуты, которые применяются к элементу верхнего уровня
<GenerateJWS name="JWS" continueOnError="false" enabled="true" async="false">
Следующие атрибуты являются общими для всех родительских элементов правил.
| Атрибут | Описание | По умолчанию | Присутствие |
|---|---|---|---|
| name |
Внутреннее название правила. В названии можно использовать только следующие символы:
A-Z0-9._\-$ %. Однако в интерфейсе управления Edge действуют дополнительные ограничения, например автоматически удаляются символы, не являющиеся буквенно-цифровыми.
При необходимости используйте элемент |
Н/Д | Обязательно |
| continueOnError |
Если задано значение false, при сбое правила возвращается ошибка. Это ожидаемое поведение для большинства правил.
Установите значение |
false | Необязательно |
| включено |
Чтобы применить правило, задайте значение true.
Установите значение |
true | Необязательно |
| асинхронный | Этот атрибут больше не поддерживается. | false | Поддержка прекращена |
<DisplayName>
<DisplayName>Policy Display Name</DisplayName>
Используйте этот атрибут вместе с атрибутом name, чтобы присвоить правилу в редакторе прокси-сервера в интерфейсе управления другое название на естественном языке.
| По умолчанию | Если вы не укажете этот элемент, будет использовано значение атрибута name правила. |
| Присутствие | Необязательно |
| Тип | Строка |
<Algorithm>
<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> принимает следующие атрибуты:
- name – (обязательный) название заявки.
- ref – название переменной потока (необязательный параметр). Если она присутствует, правило будет использовать значение этой переменной в качестве утверждения. Если указаны и атрибут ref, и явное значение утверждения, то по умолчанию используется явное значение. Оно также будет использоваться, если не удастся разрешить переменную потока, на которую ссылается атрибут ref.
- type – (необязательно) один из следующих вариантов: string (строка, по умолчанию), number (число), boolean (логическое значение) или map (карта).
- array – (необязательный параметр) установите значение true, чтобы указать, является ли значение массивом типов. Значение по умолчанию – false.
<CriticalHeaders>
<CriticalHeaders>a,b,c</CriticalHeaders> or: <CriticalHeaders ref=’variable_containing_headers’/>
Добавляет в JWS критический заголовок crit. Заголовок crit представляет собой массив названий заголовков, которые должны быть известны и распознаны получателем JWS. Пример:
{
“typ: “...”,
“alg” : “...”,
“crit” : [ “a”, “b”, “c” ],
}Во время выполнения правило VerifyJWS проверяет заголовок crit.
Для каждого заголовка, указанного в заголовке crit, проверяется, указан ли этот заголовок в элементе <KnownHeaders> правила VerifyJWS. Если в заголовке, который политика VerifyJWS находит в crit, есть что-то, чего нет в <KnownHeaders>, политика VerifyJWS завершается с ошибкой.
| По умолчанию | Н/Д |
| Присутствие | Необязательно |
| Тип | Массив строк, разделенных запятыми |
| Допустимые значения | Массив или название переменной, содержащей массив. |
<DetachContent>
<DetachContent>true|false</DetachContent>
Указывает, нужно ли создавать JWS с отделенной полезной нагрузкой (<DetachContent>true</DetachContent>) или без нее (<DetachContent>false</DetachContent>).
Если указать значение false (по умолчанию), сгенерированный JWS будет иметь следующий вид:
header.payload.signature
Если вы укажете значение true, чтобы создать отдельную полезную нагрузку, то сгенерированный JWS будет без полезной нагрузки и будет иметь следующий вид:
header..signature
При использовании отсоединенной полезной нагрузки вы должны передать исходную незакодированную полезную нагрузку в правило VerifyJWS, используя элемент <DetachedContent> правила VerifyJWS.
| По умолчанию | false |
| Присутствие | Необязательно |
| Тип | Логическое значение |
| Допустимые значения | true или false |
<IgnoreUnresolvedVariables>
<IgnoreUnresolvedVariables>true|false</IgnoreUnresolvedVariables>
Установите значение false, если вы хотите, чтобы при невозможности разрешить любую переменную, указанную в правиле, возникала ошибка. Если задано значение true, все переменные, которые не удается разрешить, будут считаться пустыми строками (null).
| По умолчанию | false |
| Присутствие | Необязательно |
| Тип | Логическое значение |
| Допустимые значения | true или false |
<OutputVariable>
<OutputVariable>JWS-variable</OutputVariable>
Указывает, куда поместить JWS, сгенерированный этим правилом. По умолчанию он помещается в переменную потока jws.POLICYNAME.generated_jws.
| По умолчанию | jws.POLICYNAME.generated_jws |
| Присутствие | Необязательно |
| Тип | Строка (название переменной процесса) |
<Payload>
<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>
<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, подписанного с помощью алгоритма HMAC. Используйте только в том случае, если алгоритм – HS256, HS384 или HS512.
| По умолчанию | Н/Д |
| Присутствие | Необязательно |
| Тип | Строка |
| Допустимые значения | Переменная потока или строка |
<SecretKey/Value>
<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>