Правило VerifyJWS

Вы просматриваете документацию по Apigee Edge.
Перейдите к документации по Apigee X.
Информация

Что

Проверяет подпись в JWS, полученном от клиентов или других систем. Это правило также извлекает заголовки в контекстные переменные, чтобы последующие правила или условия могли проверять эти значения для принятия решений об авторизации или маршрутизации. Подробную информацию можно найти в статье Общие сведения о правилах JWS и JWT.

Если JWS проверен и действителен, запрос будет обработан. Если подпись JWS не удается проверить или если JWS недействителен из-за какой-либо ошибки, вся обработка останавливается и в ответе возвращается ошибка.

Чтобы узнать больше о частях JWS и о том, как они шифруются и подписываются, ознакомьтесь с RFC7515.

Видео

Посмотрите короткое видео о том, как проверить подпись в JWS. Хотя в этом видео рассказывается о проверке JWT, многие принципы применимы и к JWS.

Примеры

Как проверить прикрепленную подпись JWS, созданную с помощью алгоритма HS256

В этом примере правило проверяет прикрепленную подпись JWS, созданную с помощью алгоритма шифрования HS256, HMAC с использованием контрольной суммы SHA-256. JWS передается в запросе прокси-сервера с помощью параметра формы JWS. Ключ содержится в переменной private.secretkey.

Прикрепленный JWS содержит закодированный заголовок, полезную нагрузку и подпись:

header.payload.signature

Конфигурация правила содержит информацию, необходимую Edge для декодирования и оценки JWS, например местоположение JWS (в переменной потока, указанной в элементе <Source>), требуемый алгоритм подписи и местоположение секретного ключа (хранится в переменной потока Edge, которая могла быть получена, например, из хранилища пар "ключ-значение" Edge).

<VerifyJWS name="JWS-Verify-HS256">
    <DisplayName>JWS Verify HS256</DisplayName>
    <Algorithm>HS256</Algorithm>
    <Source>request.formparam.JWS</Source>
    <IgnoreUnresolvedVariables>false</IgnoreUnresolvedVariables>
    <SecretKey>
        <Value ref="private.secretkey"/>
    </SecretKey>
</VerifyJWS>

Правило записывает выходные данные в переменные контекста, чтобы последующие правила или условия в прокси-сервере API могли проверять эти значения. Список переменных, заданных этими правилами, приведен в разделе Переменные потока.

Как проверить отсоединенную подпись JWS, созданную с помощью алгоритма RS256

В этом примере правило проверяет отделенную подпись JWS, созданную с помощью алгоритма RS256. Чтобы подтвердить право собственности, вам нужно предоставить открытый ключ. JWS передается в запросе прокси-сервера с помощью параметра формы JWS. Открытый ключ содержится в переменной public.publickey.

В отсоединенной подписи JWS полезная нагрузка отсутствует:

header..signature

Вы должны передать полезную нагрузку в правило VerifyJWS, указав название переменной, содержащей полезную нагрузку, в элементе <DetachedContent>. Указанный в <DetachedContent> контент должен быть в исходном незакодированном виде, в котором он был, когда создавалась подпись JWS.

<VerifyJWS name="JWS-Verify-RS256">
    <DisplayName>JWS Verify RS256</DisplayName>
    <Algorithm>RS256</Algorithm>
    <Source>request.formparam.JWS</Source>
    <IgnoreUnresolvedVariables>false</IgnoreUnresolvedVariables>
    <PublicKey>
        <Value ref="public.publickey"/>
    </PublicKey>
    <DetachedContent>private.payload</DetachedContent>
</VerifyJWS>

Правило записывает выходные данные в переменные контекста, чтобы последующие правила или условия в прокси-сервере API могли проверять эти значения. Список переменных, заданных этими правилами, приведен в разделе Переменные потока.

Как задать ключевые элементы

Элементы, которые вы используете для указания ключа, применяемого для проверки JWS, зависят от выбранного алгоритма, как показано в таблице ниже.

Алгоритм ключевые элементы;
HS*
<SecretKey>
  <Value ref="private.secretkey"/>
</SecretKey>
RS*, ES*, PS*
<PublicKey>
  <Value ref="rsa_public_key"/>
</PublicKey>

Или:

<PublicKey>
  <JWKS ref="jwks_val_ref_or_url"/>
</PublicKey>
*Подробнее об алгоритмах шифрования подписи…

Сведения об элементах

В справочнике по правилам описаны элементы и атрибуты правила Verify JWS.

Примечание. Настройки будут немного отличаться в зависимости от используемого алгоритма шифрования. В разделе Примеры приведены конфигурации для разных случаев использования.

Атрибуты, которые применяются к элементу верхнего уровня

<VerifyJWS name="JWS" continueOnError="false" enabled="true" async="false">

Следующие атрибуты являются общими для всех родительских элементов правил.

Атрибут Описание По умолчанию Присутствие
name Внутреннее название правила. В названии можно использовать только следующие символы: A-Z0-9._\-$ %. Однако в интерфейсе управления Edge действуют дополнительные ограничения, например автоматически удаляются символы, не являющиеся буквенно-цифровыми.

При необходимости используйте элемент <displayname></displayname>, чтобы присвоить правилу в редакторе прокси-сервера управления другое название на естественном языке.

Н/Д Обязательно
continueOnError Если задано значение false, при сбое правила возвращается ошибка. Это ожидаемое поведение для большинства правил.

Установите значение true, чтобы выполнение потока продолжалось, даже если правило не сработало.

false Необязательно
включено Чтобы применить правило, задайте значение true.

Установите значение false, чтобы отключить правило. Правило не будет применяться, даже если оно прикреплено к потоку.

true Необязательно
асинхронный Этот атрибут больше не поддерживается. false Поддержка прекращена

<DisplayName>

<DisplayName>Policy Display Name</DisplayName>

Используйте этот атрибут вместе с атрибутом name, чтобы присвоить правилу в редакторе прокси-сервера в интерфейсе управления другое название на естественном языке.

По умолчанию Если вы не укажете этот элемент, будет использовано значение атрибута name правила.
Присутствие Необязательно
Тип Строка

<Algorithm>

<Algorithm>HS256</Algorithm>

Указывает алгоритм шифрования для подписи токена. В алгоритмах RS*/PS*/ES* используется пара открытого и закрытого ключей, а в алгоритмах HS* – общий секретный ключ. Также ознакомьтесь со статьей Об алгоритмах шифрования подписей.

Можно указать несколько значений, разделенных запятыми. Примеры: "HS256, HS512" или "RS256, PS256". Однако алгоритмы HS* нельзя сочетать с другими алгоритмами, а алгоритмы ES* – с другими алгоритмами, поскольку для них требуется определенный тип ключа. Алгоритмы RS* и PS* можно комбинировать.

По умолчанию Н/Д
Присутствие Обязательно
Тип Строка со значениями, разделенными запятыми
Допустимые значения 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 указанные дополнительные пары "заявление – значение" и совпадают ли заявленные значения.

Дополнительное утверждение использует имя, которое не является одним из стандартных зарегистрированных имен утверждений JWS. Значение дополнительного утверждения может быть строкой, числом, логическим значением, картой или массивом. Карта – это набор пар "имя-значение". Значение для утверждения любого из этих типов можно указать непосредственно в конфигурации правила или косвенно, сославшись на переменную потока.

По умолчанию Н/Д
Присутствие Необязательно
Тип

Строка (по умолчанию), число, логическое значение или карта.

Если тип не указан, по умолчанию используется строка.

Array Установите значение true, чтобы указать, является ли значение массивом типов. Значение по умолчанию: false.
Допустимые значения Любое значение, которое вы хотите использовать для дополнительного утверждения.

Элемент <Claim> принимает следующие атрибуты:

  • name – (обязательный) название заявки.
  • ref – название переменной потока (необязательный параметр). Если она присутствует, правило будет использовать значение этой переменной в качестве утверждения. Если указаны и атрибут ref, и явное значение утверждения, то по умолчанию используется явное значение. Оно также будет использоваться, если не удастся разрешить переменную потока, на которую ссылается атрибут ref.
  • type – (необязательно) один из следующих вариантов: string (строка, по умолчанию), number (число), boolean (логическое значение) или map (карта).
  • array – (необязательный параметр) установите значение true, чтобы указать, является ли значение массивом типов. Значение по умолчанию – false.

<DetachedContent>

<DetachedContent>variable-name-here</DetachedContent>

Сгенерированный JWS с полезной нагрузкой контента имеет следующий вид:

header.payload.signature

Если вы используете правило GenerateJWS для создания отделенной полезной нагрузки, то сгенерированный JWS опускает полезную нагрузку и имеет следующий вид:

header..signature

Если полезная нагрузка отсоединена, вам нужно передать ее в правило VerifyJWS с помощью элемента <DetachedContent>. Указанная полезная нагрузка контента должна быть в исходном незакодированном виде, в котором она была при создании подписи JWS.

Правило вызывает ошибку, если:

  • <DetachedContent> указывается, когда JWS не содержит отсоединенную полезную нагрузку контента (код ошибки – steps.jws.ContentIsNotDetached).
  • <DetachedContent> отсутствует, а у JWS есть отделенная полезная нагрузка контента (код ошибки – steps.jws.InvalidSignature).
По умолчанию N/A
Присутствие Необязательно
Тип Ссылка на переменную

<IgnoreCriticalHeaders>

<IgnoreCriticalHeaders>true|false</IgnoreCriticalHeaders>

Установите значение false, если хотите, чтобы правило выдавало ошибку, когда какой-либо заголовок, указанный в заголовке crit JWS, не указан в элементе <KnownHeaders>. Если задано значение true, правило VerifyJWS игнорирует заголовок crit.

Установить для этого элемента значение true может потребоваться, например, в тестовой среде, чтобы правило не нарушалось из-за отсутствия заголовка.

По умолчанию false
Присутствие Необязательно
Тип Логическое значение
Допустимые значения true или false

<IgnoreUnresolvedVariables>

<IgnoreUnresolvedVariables>true|false</IgnoreUnresolvedVariables>

Установите значение false, если вы хотите, чтобы при невозможности разрешить любую переменную, указанную в правиле, возникала ошибка. Если задано значение true, все переменные, которые не удается разрешить, будут считаться пустыми строками (null).

По умолчанию false
Присутствие Необязательно
Тип Логическое значение
Допустимые значения true или false

<KnownHeaders>

<KnownHeaders>a,b,c</KnownHeaders>

or:

<KnownHeaders ref=’variable_containing_headers’/>

Правило GenerateJWS использует элемент <CriticalHeaders> для заполнения заголовка crit в токене. Пример:

{
  “typ: “...”,
  “alg” : “...”,
  “crit” : [ “a”, “b”, “c” ],
}

Правило VerifyJWS проверяет заголовок crit в JWS, если он существует, и для каждого элемента в списке проверяет, что элемент <KnownHeaders> также содержит этот заголовок. Элемент <KnownHeaders> может содержать надмножество элементов, перечисленных в crit. Важно, чтобы все заголовки, перечисленные в crit, были указаны в элементе <KnownHeaders>. Если в заголовке, который правило находит в crit, нет <KnownHeaders>, правило VerifyJWS завершается с ошибкой.

При необходимости вы можете настроить правило VerifyJWS так, чтобы оно игнорировало заголовок crit. Для этого задайте для элемента <IgnoreCriticalHeaders> значение true.

По умолчанию Н/Д
Присутствие Необязательно
Тип Массив строк, разделенных запятыми
Допустимые значения Массив или название переменной, содержащей массив.

<PublicKey/JWKS>

<!-- Specify the JWKS. -->
<PublicKey>
   <JWKS>jwks-value-here</JWKS>
</PublicKey>

or:

<!-- Specify a variable containing the JWKS. -->
<PublicKey>
   <JWKS ref="public.jwks"/>
</PublicKey>

or:

<!-- Specify a public URL that returns the JWKS.
The URL is static, meaning you cannot set it using a variable. -->
<PublicKey>
   <JWKS uri="jwks-url"/>
</PublicKey>

Указывает значение в формате JWKS (RFC 7517), содержащее набор открытых ключей. Используйте только в том случае, если алгоритм относится к одному из следующих типов: RS256/RS384/RS512, PS256/PS384/PS512 или ES256/ES384/ES512.

Если входящая подпись JWS содержит идентификатор ключа, который присутствует в наборе JWKS, правило будет использовать правильный открытый ключ для проверки подписи JWS. Подробнее о том, как использовать набор веб-ключей JSON (JWKS) для проверки JWS…

Если вы получаете значение из общедоступного URL, Edge кэширует JWKS на 300 секунд. Когда срок действия кеша истекает, Edge снова получает JWKS.

По умолчанию Н/Д
Присутствие Чтобы проверить JWS с помощью алгоритма RSA, необходимо использовать элемент JWKS или Value.
Тип Строка
Допустимые значения Переменная потока, строковое значение или URL.

<PublicKey/Value>

<PublicKey>
   <Value ref="public.publickey"/>
</PublicKey>
-or-
<PublicKey>
    <Value>
    -----BEGIN PUBLIC KEY-----
    MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAw2kPrRzcufvUNHvTH/WW
    Q0UrCw5c0+Y707KX3PpXkZGbtTT4nvU1jC0d1lHV8MfUyRXmpmnNxJHAC2F73IyN
    C5TBtXMORc+us7A2cTtC4gZV256bT4h3sIEMsDl0Joz9K9MPzVPFxa1i0RgNt06n
    Xn/Bs2UbbLlKP5Q1HPxewUDEh0gVMqz9wdIGwH1pPxKvd3NltYGfPsUQovlof3l2
    ALvO7i5Yrm96kknfFEWf1EjmCCKvz2vjVbBb6mp1ZpYfc9MOTZVpQcXSbzb/BWUo
    ZmkDb/DRW5onclGzxQITBFP3S6JXd4LNESJcTp705ec1cQ9Wp2Kl+nKrKyv1E5Xx
    DQIDAQAB
    -----END PUBLIC KEY-----
    </Value>
</PublicKey>

Указывает открытый ключ, используемый для проверки подписи в JWS. Используйте атрибут ref, чтобы передать ключ в переменной потока, или укажите ключ, закодированный в формате PEM, напрямую. Используйте только в том случае, если алгоритм относится к одному из следующих типов: RS256/RS384/RS512, PS256/PS384/PS512 или ES256/ES384/ES512.

По умолчанию Н/Д
Присутствие Чтобы проверить JWS, подписанный с помощью алгоритма RSA, необходимо использовать элементы JWKS или Value.
Тип Строка
Допустимые значения Переменная потока или строка.

<SecretKey/Value>

<SecretKey>
  <Value ref="private.your-variable-name"/>
</SecretKey>

Содержит секретный ключ, используемый для проверки или подписи токенов с помощью алгоритма HMAC. Используйте только в том случае, если алгоритм – HS256, HS384 или HS512. Используйте атрибут ref, чтобы передать ключ в переменную потока.

По умолчанию Н/Д
Присутствие Требуется для алгоритмов HMAC.
Тип Строка
Допустимые значения Переменная потока, ссылающаяся на строку.

Примечание. Если это переменная потока, она должна иметь префикс "private". Пример: private.mysecret

<Source>

<Source>JWS-variable</Source>

Если присутствует, указывает переменную потока, в которой правило ожидает найти JWS для проверки.

По умолчанию request.header.authorization (Важная информация о значении по умолчанию приведена в примечании выше).
Присутствие Необязательно
Тип Строка
Допустимые значения Название переменной потока Edge.

Переменные потока

В случае успеха политики Verify JWS и Decode JWS устанавливают переменные контекста в соответствии со следующим шаблоном:

jws.{policy_name}.{variable_name}

Например, если имя политики verify-jws , то политика сохранит алгоритм, указанный в JWS, в этой контекстной переменной: jws.verify-jws.header.algorithm

Имя переменной Описание
decoded.header. name Анализируемое в формате JSON значение заголовка в полезных данных. Одна переменная задается для каждого заголовка в полезных данных. Хотя вы также можете использовать header. name переменные потока header. name , это рекомендуемая переменная для доступа к заголовку.
header.algorithm Алгоритм подписи, используемый в JWS. Например, RS256, HS384 и т. д. Дополнительную информацию см. в разделе «Параметры заголовка (Алгоритм)» .
header.kid Идентификатор ключа, если он был добавлен при создании JWS. См. также раздел «Использование набора веб-ключей JSON (JWKS)» в обзоре политик JWT и JWS, чтобы проверить JWS. Дополнительную информацию см. в разделе «Параметр заголовка (Key ID)» .
header.type Значение типа заголовка. Дополнительную информацию см. в разделе «Параметры заголовка (Тип)» .
header. name Значение именованного заголовка (стандартное или дополнительное). Один из них будет установлен для каждого дополнительного заголовка в заголовке JWS.
header-json Заголовок в формате JSON.
payload Полезная нагрузка JWS, если у JWS есть прикрепленная полезная нагрузка. Для отсоединенных полезных данных эта переменная пуста.
valid В случае VerifyJWS эта переменная будет иметь значение true, если подпись проверена, а текущее время — до истечения срока действия токена и после значения токена notBefore, если они присутствуют. В противном случае ложь.

В случае DecodeJWS эта переменная не установлена.

Справочник по ошибкам

В этом разделе описаны коды ошибок и сообщения об ошибках, которые возвращаются, а также переменные ошибок, которые задаются Edge, когда это правило вызывает ошибку. Эта информация важна, если вы разрабатываете правила обработки ошибок. Подробнее о том, что нужно знать об ошибках в правилах и об обработке ошибок…

Ошибки времени выполнения

Эти ошибки могут возникать при выполнении правил.

Код ошибки Статус HTTP Когда возникает
steps.jws.AlgorithmInTokenNotPresentInConfiguration 401 Возникает, когда в правилах проверки указано несколько алгоритмов.
steps.jws.AlgorithmMismatch 401 Алгоритм, указанный в заголовке правилом Generate, не совпадает с алгоритмом, ожидаемым в правиле Verify. Указанные алгоритмы должны совпадать.
steps.jws.ContentIsNotDetached 401 <DetachedContent> указывается, когда JWS не содержит отсоединенную полезную нагрузку контента.
steps.jws.FailedToDecode 401 Правило не смогло декодировать JWS. Возможно, JWS поврежден.
steps.jws.InsufficientKeyLength 401 Для ключа длиной менее 32 байт для алгоритма HS256
steps.jws.InvalidClaim 401 Если отсутствует или не совпадает утверждение, заголовок или значение заголовка.
steps.jws.InvalidCurve 401 Кривая, указанная ключом, не подходит для алгоритма на основе эллиптических кривых.
steps.jws.InvalidJsonFormat 401 В заголовке JWS найден недопустимый JSON.
steps.jws.InvalidJws 401 Эта ошибка возникает, когда не удается проверить подпись JWS.
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.NoMatchingPublicKey 401 Правило Verify использует JWKS в качестве источника открытых ключей, но kid в подписанном JWS не указан в JWKS.
steps.jws.UnhandledCriticalHeader 401 Заголовок, найденный правилом Verify JWS в заголовке crit, не указан в KnownHeaders.
steps.jws.UnknownException 401 Произошло неизвестное исключение.
steps.jws.WrongKeyType 401 Указан ключ неправильного типа. Например, если вы укажете ключ RSA для алгоритма на эллиптических кривых или ключ на эллиптических кривых для алгоритма RSA.

Ошибки развертывания

Эти ошибки могут возникать при развертывании прокси-сервера, содержащего это правило.

Название ошибки Когда возникает
InvalidAlgorithm Допустимые значения: RS256, RS384, RS512, PS256, PS384, PS512, ES256, ES384, ES512, HS256, HS384, HS512.

EmptyElementForKeyConfiguration

FailedToResolveVariable

InvalidConfigurationForActionAndAlgorithmFamily

InvalidConfigurationForVerify

InvalidEmptyElement

InvalidFamiliesForAlgorithm

InvalidKeyConfiguration

InvalidNameForAdditionalClaim

InvalidNameForAdditionalHeader

InvalidPublicKeyId

InvalidPublicKeyValue

InvalidSecretInConfig

InvalidTypeForAdditionalClaim

InvalidTypeForAdditionalHeader

InvalidValueForElement

InvalidValueOfArrayAttribute

InvalidVariableNameForSecret

MissingConfigurationElement

MissingElementForKeyConfiguration

MissingNameForAdditionalClaim

MissingNameForAdditionalHeader

Другие возможные ошибки развертывания.

Переменные неисправности

Эти переменные устанавливаются при возникновении ошибки во время выполнения. Дополнительные сведения см. в разделе Что нужно знать об ошибках политики .

Переменные Где Пример
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>