Проверка политики JWS

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

Что

Проверяет подпись 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 KVM).

<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 не включает полезную нагрузку из модуля 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>
* Более подробную информацию об основных требованиях см. в разделе «Об алгоритмах шифрования подписи» .

Ссылка на элемент

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

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

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

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

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

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

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

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

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

ЛОЖЬ Необязательный
включено Установите значение true , чтобы обеспечить соблюдение политики.

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

истинный Необязательный
асинхронный Этот атрибут устарел. ЛОЖЬ Устаревший

<DisplayName>

<DisplayName>Policy Display Name</DisplayName>

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

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

<Алгоритм>

<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. Значение дополнительного утверждения может быть строкой, числом, логическим значением, картой или массивом. Карта — это просто набор пар «имя/значение». Значение для утверждения любого из этих типов может быть указано явно в конфигурации политики или косвенно через ссылку на переменную потока.

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

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

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

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

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

  • Название - (Обязательно) Название претензии.
  • ref - (Необязательно) Имя переменной потока. Если присутствует, политика будет использовать значение этой переменной в качестве утверждения. Если указаны и атрибут ref , и явное значение утверждения, по умолчанию используется явное значение, если ссылочная переменная потока не определена.
  • тип - (Необязательно) Один из следующих вариантов: строка (по умолчанию), число, логическое значение или карта
  • array - (Необязательно) Установите значение true , чтобы указать, является ли значение массивом типов. По умолчанию: false.

<Отделенный контент>

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

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

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

<IgnoreUnresolvedVariables>

<IgnoreUnresolvedVariables>true|false</IgnoreUnresolvedVariables>

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

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

<KnownHeaders>

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

or:

<KnownHeaders ref=variable_containing_headers/>

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

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

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

При желании вы можете настроить политику VerifyJWS таким образом, чтобы она игнорировала критический заголовок, установив для элемента <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 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 ref="private.your-variable-name"/>
</SecretKey>

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

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

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

<Источник>

<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 Алгоритм, указанный в заголовке политики «Создать», не соответствует ожидаемому в политике «Проверка». Указанные алгоритмы должны совпадать.
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>