Política VerifyJWS

Esta é a documentação do Apigee Edge.
Acesse Documentação da Apigee X.
informações

O que

Verifica a assinatura em um JWS recebido de clientes ou outros sistemas. Essa política também extrai cabeçalhos em variáveis de contexto para que políticas ou condições subsequentes possam examinar esses valores para tomar decisões de autorização ou roteamento. Consulte a visão geral das políticas do JWS e do JWT para uma introdução detalhada.

Se o JWS foi verificado e é válido, a solicitação pode continuar. Se a assinatura JWS não puder ser verificada ou se o JWS for inválido devido a algum tipo de erro, todo o processamento será interrompido e um erro será retornado na resposta.

Para saber mais sobre as partes de um JWS e como elas são criptografadas e assinadas, consulte RFC7515.

Vídeo

Assista a um vídeo curto para saber como verificar a assinatura em um JWS. Embora esse vídeo seja específico para verificar um JWT, muitos dos conceitos são iguais para o JWS.

Amostras

Verificar um JWS anexado assinado com o algoritmo HS256

Essa política de exemplo verifica um JWS anexado que foi assinado com o algoritmo de criptografia HS256 HMAC usando uma soma de verificação SHA-256. O JWS é transmitido na solicitação de proxy usando um parâmetro de formulário chamado JWS. A chave está contida em uma variável chamada private.secretkey.

Um JWS anexado contém o cabeçalho, o payload e a assinatura codificados:

header.payload.signature

A configuração da política inclui as informações que o Edge precisa para decodificar e avaliar o JWS, como onde encontrar a JWS (em uma variável de fluxo especificada no elemento <Source>), o algoritmo de assinatura necessário e onde encontrar a chave secreta, armazenada em uma variável de fluxo do Edge, que pode foram recuperados da KVM do Edge, por exemplo).

<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>

A política grava a saída em variáveis de contexto para que as políticas ou condições subsequentes no proxy de API possam examinar esses valores. Consulte Variáveis de fluxo para ver uma lista das variáveis definidas por essa política.

Verificar um JWS separado assinado com o algoritmo RS256

Esta política de exemplo verifica um JWS separado que foi assinado com o algoritmo RS256. Para verificar, você precisa fornecer a chave pública. O JWS é transmitido na solicitação de proxy usando um parâmetro de formulário chamado JWS. A chave pública está contida em uma variável chamada public.publickey.

Uma JWS separada omite a carga do JWS:

header..signature

Cabe a você transmitir o payload para a política VerifyJWS especificando o nome da variável que contém o payload para o elemento <DetachedContent>. O conteúdo especificado em <DetachedContent> precisa estar no formato não codificado original quando a assinatura do JWS foi criada.

<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>

A política grava a saída em variáveis de contexto para que as políticas ou condições subsequentes no proxy de API possam examinar esses valores. Consulte Variáveis de fluxo para ver uma lista das variáveis definidas por essa política.

Como definir os elementos principais

Os elementos usados para especificar a chave usada para verificar o JWS dependem do algoritmo escolhido, conforme mostrado na tabela a seguir:

Algoritmo elementos-chave
HS*
<SecretKey>
  <Value ref="private.secretkey"/>
</SecretKey>
RS*, ES*, PS*
<PublicKey>
  <Value ref="rsa_public_key"/>
</PublicKey>

ou

<PublicKey>
  <JWKS ref="jwks_val_ref_or_url"/>
</PublicKey>
*Para mais informações sobre os requisitos de chave, consulte Sobre algoritmos de criptografia de assinatura.

Referência de elemento

A referência de política descreve os elementos e atributos da política de verificação de JWS.

Observação: a configuração varia um pouco dependendo do algoritmo de criptografia utilizado. Consulte os Amostras para ver exemplos que demonstram configurações para casos de uso específicos.

Atributos que se aplicam ao elemento de nível superior

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

Os seguintes atributos são comuns a todos os elementos pai de política.

Atributo Descrição Padrão Presença
nome O nome interno da política. Os caracteres que podem ser usados no nome são restritos a: A-Z0-9._\-$ %. No entanto, a interface de gerenciamento de borda aplica restrições, como a remoção automática de caracteres que não são alfanuméricos.

Opcionalmente, use o elemento <displayname></displayname> para rotular a política no editor de proxy da IU de gerenciamento com um nome de linguagem natural diferente.

N/A Obrigatório
continueOnError Defina como false para retornar um erro quando uma política falhar. Esse é o comportamento esperado na maioria das políticas.

Defina como true para que a execução do fluxo continue, mesmo depois que uma política falhar.

falso Opcional
ativado Defina como true para aplicar a política.

Defina como false para "desativar" a política. A política não será aplicada mesmo se permanecer anexada a um fluxo.

verdadeiro Opcional
async Esse atributo está obsoleto. falso Suspenso

<DisplayName>

<DisplayName>Policy Display Name</DisplayName>

Use além do atributo name para rotular a política no editor de proxy da IU de gerenciamento com um nome de linguagem natural diferente.

Padrão Se você omitir esse elemento, o valor do atributo name da política será usado.
Presença Opcional
Tipo String

<Algoritmo>S

<Algorithm>HS256</Algorithm>

Especifica o algoritmo de criptografia para assinar o token. Os algoritmos RS*/PS*/ES* empregam um par de chaves públicas/secretas, enquanto os algoritmos HS* empregam um secret compartilhado. Consulte também Sobre algoritmos de criptografia de assinatura.

É possível especificar vários valores separados por vírgulas. Por exemplo, "HS256, HS512" ou "RS256, PS256". No entanto, não é possível combinar algoritmos HS* e ES* com nenhum outro porque eles exigem um tipo de chave específico. É possível combinar algoritmos RS* e PS*.

Padrão N/A
Presença Obrigatório
Tipo String de valores separados por vírgulas
Valores válidos 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>

Valida se o cabeçalho JWS contém os pares de nome/valor de declaração adicionais especificados e se os valores declarados correspondem.

Uma declaração adicional usa um nome que não é um dos nomes de declaração padrão do JWS registrados. O valor de uma declaração adicional pode ser uma string, um número, um booleano, um mapa ou uma matriz. Um mapa é simplesmente um conjunto de pares de nome/valor. O valor de uma declaração de qualquer um desses tipos pode ser especificado explicitamente na configuração da política ou indiretamente por meio de uma referência a uma variável de fluxo.

Padrão N/A
Presença Opcional
Tipo

String (padrão), número, booleano ou mapa.

O tipo padrão será String se nenhum tipo for especificado.

Array Defina como true para indicar se o valor é uma matriz de tipos. Padrão: false
Valores válidos Qualquer valor que você queira usar para uma reivindicação adicional.

O elemento <Claim> usa estes atributos:

  • name: obrigatório. O nome da declaração.
  • ref: (opcional) o nome de uma variável de fluxo. Se presente, a política usará o valor dessa variável como a declaração. Se um atributo ref e um valor de declaração explícito forem especificados, o valor explícito será o padrão e será usado se a variável de fluxo referenciada não for resolvida.
  • type: (opcional) uma das seguintes opções: string (padrão), número, booleano ou mapa.
  • array: (opcional) defina como true para indicar se o valor é uma matriz de tipos. Padrão: false

<DetachedContent>

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

Um JWS gerado com um payload de conteúdo está no formato:

header.payload.signature

Se você usar a política GenerateJWS para criar um payload separado, o JWS gerado omitirá o payload e estará no formato:

header..signature

Para um payload separado, você precisa transmitir o payload à política VerifyJWS usando o elemento <DetachedContent>. O payload de conteúdo especificado precisa estar no formato não codificado original de quando a assinatura JWS foi criada.

A política gera um erro quando:

  • <DetachedContent> é especificado quando o JWS não contém um payload de conteúdo separado (o código da falha é steps.jws.ContentIsNotDetached).
  • <DetachedContent> é omitido e o JWS tem um payload de conteúdo separado (o código da falha é steps.jws.InvalidSignature).
Padrão N/A
Presença Opcional
Tipo Referência da variável

<IgnoreCriticalHeaders>

<IgnoreCriticalHeaders>true|false</IgnoreCriticalHeaders>

Defina como falso se você quiser que a política gere um erro quando qualquer cabeçalho listado no cabeçalho crit do JWS não estiver listado no elemento <KnownHeaders>. Defina como verdadeiro para fazer com que a política VerifyJWS ignore o cabeçalho crit.

Uma razão para definir esse elemento como verdadeiro é se você estiver em um ambiente de teste e não quiser que a política falhe devido a um cabeçalho ausente.

Padrão falso
Presença Opcional
Tipo Booleano
Valores válidos verdadeiro ou falso

<IgnoreUnresolvedVariables>

<IgnoreUnresolvedVariables>true|false</IgnoreUnresolvedVariables>

Defina como falso se você quiser que a política gere um erro quando qualquer variável referenciada especificada na política não for resolvida. Defina como "true" para tratar qualquer variável não resolvida como uma string vazia (null).

Padrão falso
Presença Opcional
Tipo Booleano
Valores válidos verdadeiro ou falso

<KnownHeaders>

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

or:

<KnownHeaders ref=variable_containing_headers/>

A política GenerateJWS usa o elemento <CriticalHeaders> para preencher o cabeçalho crit em um token. Exemplo:

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

A política VerifyJWS examina o cabeçalho crit no JWS, se ele existir, e para cada item listado, ele verifica se o elemento <KnownHeaders> também lista esse cabeçalho. O elemento <KnownHeaders> pode conter um superconjunto dos itens listados em crit. Só é necessário que todos os cabeçalhos listados em crit estejam listados no elemento <KnownHeaders>. Qualquer cabeçalho que a política encontre em crit que também não esteja listado em <KnownHeaders> causará falha na política VerifyJWS.

Opcionalmente, você pode configurar a política VerifyJWS para ignorar o cabeçalho crit definindo o elemento <IgnoreCriticalHeaders> como true.

Padrão N/A
Presença Opcional
Tipo Matriz de strings separadas por vírgulas
Valores válidos Uma matriz ou o nome de uma variável que contém a matriz.

<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>

Especifica um valor no formato JWKS (RFC 7517, em inglês) que contém um conjunto de chaves públicas. Use somente quando o algoritmo for RS256/RS384/RS512, PS256/PS384/PS512 ou ES256/ES384/ES512.

Se o JWS de entrada tiver um ID de chave presente no conjunto de JWKS, a política usará a chave pública correta para verificar a assinatura do JWS. Para detalhes sobre esse recurso, consulte Como usar um conjunto de chaves da Web JSON (JWKS, na sigla em inglês) para verificar um JWS.

Se você buscar o valor de um URL público, o Edge armazenará o JWKS em cache por um período de 300 segundos. Quando o cache expirar, o Edge buscará o JWKS novamente.

Padrão N/A
Presença Para verificar um JWS usando um algoritmo RSA, use o elemento JWKS ou Value.
Tipo String
Valores válidos Uma variável de fluxo, valor de string ou 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>

Especifica a chave pública usada para verificar a assinatura no JWS. Use o atributo ref para passar a chave em uma variável de fluxo ou especifique a chave codificada em PEM diretamente. Use somente quando o algoritmo for um RS256/RS384/RS512, PS256/PS384/PS512 ou ES256/ES384/ES512.

Padrão N/A
Presença Para verificar um JWS assinado com um algoritmo RSA, use os elementos JWKS ou Value.
Tipo String
Valores válidos Uma variável de fluxo ou string.

<SecretKey/Value>

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

Fornece a chave secreta usada para verificar ou assinar tokens com um algoritmo HMAC. Use somente quando o algoritmo for HS256, HS384 ou HS512. Use o atributo ref para transmitir a chave em uma variável de fluxo.

Padrão N/A
Presença Obrigatório para algoritmos HMAC.
Tipo String
Valores válidos Uma variável de fluxo que se refere a uma string.

Observação: no caso de uma variável de fluxo, ela precisa ter o prefixo "particular". Por exemplo, private.mysecret

<Source>

<Source>JWS-variable</Source>

Se presente, especifica a variável de fluxo em que a política espera encontrar o JWS para verificar.

Padrão request.header.authorization. Consulte a observação acima para informações importantes sobre o padrão.
Presença Opcional
Tipo String
Valores válidos Nome de uma variável do fluxo de borda.

Variáveis de fluxo

Após o sucesso, as políticas Verificar JWS e Decodificar JWS definem variáveis de contexto de acordo com esse padrão:

jws.{policy_name}.{variable_name}

Por exemplo, se o nome da política for verify-jws, ela armazenará o algoritmo especificado no JWS para esta variável de contexto: jws.verify-jws.header.algorithm

Nome da variável Descrição
decoded.header.name É o valor analisável pelo JSON de um cabeçalho no payload. Uma variável é definida para cada cabeçalho no payload. Ainda que você também possa usar as variáveis de fluxo header.name, essa é a variável recomendada para acessar um cabeçalho.
header.algorithm O algoritmo de assinatura usado no JWS. Por exemplo, RS256, HS384 e assim por diante. Consulte Parâmetro de cabeçalho (algoritmo) para saber mais.
header.kid O ID da chave, se adicionado quando a JWS foi gerada. Consulte também "Como usar um conjunto de chaves da Web JSON (JWKS)" na Visão geral das políticas JWT e JWS para verificar uma JWS. Consulte Parâmetro de cabeçalho (ID da chave) para mais informações.
header.type O valor do tipo de cabeçalho. Consulte Parâmetro de cabeçalho (tipo) para saber mais.
header.name O valor do cabeçalho nomeado (padrão ou adicional). Um deles será definido para cada cabeçalho adicional na parte principal da JWS.
header-json O cabeçalho no formato JSON.
payload O payload JWS se ele tiver um payload anexado. Para um payload desconectado, essa variável está vazia.
valid No caso de VerifyJWT, essa variável será verdadeira quando a assinatura for verificada e a hora atual for anterior à expiração do token e posterior ao valor notBefore, se estiverem presentes. Caso contrário, será falso.

No caso de DecodeJWS, essa variável não é definida.

Referência de erros

This section describes the fault codes and error messages that are returned and fault variables that are set by Edge when this policy triggers an error. This information is important to know if you are developing fault rules to handle faults. To learn more, see What you need to know about policy errors and Handling faults.

Runtime errors

These errors can occur when the policy executes.

Fault code HTTP status Occurs when
steps.jws.AlgorithmInTokenNotPresentInConfiguration 401 Occurs when the verification policy has multiple algorithms
steps.jws.AlgorithmMismatch 401 The algorithm specified in the header by the Generate policy did not match the one expected in the Verify policy. The algorithms specified must match.
steps.jws.ContentIsNotDetached 401 <DetachedContent> is specified when the JWS does not contain a detached content payload.
steps.jws.FailedToDecode 401 The policy was unable to decode the JWS. The JWS is possibly corrupted.
steps.jws.InsufficientKeyLength 401 For a key less than 32 bytes for the HS256 algorithm
steps.jws.InvalidClaim 401 For a missing claim or claim mismatch, or a missing header or header mismatch.
steps.jws.InvalidCurve 401 The curve specified by the key is not valid for the Elliptic Curve algorithm.
steps.jws.InvalidJsonFormat 401 Invalid JSON found in the JWS header.
steps.jws.InvalidJws 401 This error occurs when the JWS signature verification fails.
steps.jws.InvalidPayload 401 The JWS payload is invalid.
steps.jws.InvalidSignature 401 <DetachedContent> is omitted and the JWS has a detached content payload.
steps.jws.KeyIdMissing 401 The Verify policy uses a JWKS as a source for public keys, but the signed JWS does not include a kid property in the header.
steps.jws.KeyParsingFailed 401 The public key could not be parsed from the given key information.
steps.jws.MissingPayload 401 The JWS payload is missing.
steps.jws.NoAlgorithmFoundInHeader 401 Occurs when the JWS omits the algorithm header.
steps.jws.NoMatchingPublicKey 401 The Verify policy uses a JWKS as a source for public keys, but the kid in the signed JWS is not listed in the JWKS.
steps.jws.UnhandledCriticalHeader 401 A header found by the Verify JWS policy in the crit header is not listed in KnownHeaders.
steps.jws.UnknownException 401 An unknown exception occurred.
steps.jws.WrongKeyType 401 Wrong type of key specified. For example, if you specify an RSA key for an Elliptic Curve algorithm, or a curve key for an RSA algorithm.

Deployment errors

These errors can occur when you deploy a proxy containing this policy.

Error name Occurs when
InvalidAlgorithm The only valid values are: 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

Other possible deployment errors.

Variáveis de falha

Essas variáveis são definidas quando ocorre um erro de tempo de execução. Para mais informações, consulte O que você precisa saber sobre erros de política.

Variáveis Onde Exemplo
fault.name="fault_name" fault_name é o nome da falha, conforme listado na tabela Erros de ambiente de execução acima. O nome da falha é a última parte do código de falha. fault.name Matches "TokenExpired"
JWS.failed Todas as políticas de JWS definem a mesma variável em caso de falha. jws.JWS-Policy.failed = true

Exemplo de resposta de erro

Para gerenciar erros, a prática recomendada é interceptar a parte errorcode da resposta de erro. Não confie no texto em faultstring, porque ele pode mudar.

Exemplo de regra de falha

<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>