Política VerifyJWS

Esta página aplica-se ao Apigee e ao Apigee Hybrid.

Veja a documentação do Apigee Edge.

Ícone de política

O quê

Valida a assinatura num JWS recebido de clientes ou outros sistemas. Esta política também extrai cabeçalhos para variáveis de contexto para que as políticas ou as condições subsequentes possam examinar esses valores para tomar decisões de autorização ou encaminhamento. Consulte a vista geral das políticas de JWS e JWT para uma introdução detalhada.

Se o JWS for validado e for válido, o pedido pode prosseguir. Se não for possível validar a assinatura JWS ou se o JWS for inválido devido a algum tipo de erro, todo o processamento é interrompido e é devolvido um erro na resposta.

Esta política é uma política extensível e a utilização desta política pode ter implicações de custo ou utilização, consoante a sua licença do Apigee. Para ver informações sobre os tipos de políticas e as implicações de utilização, consulte Tipos de políticas.

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

Vídeo

Veja um vídeo curto para saber como validar a assinatura num JWS. Embora este vídeo seja específico para a validação de um JWT, muitos dos conceitos são os mesmos para JWS.

Exemplos

Valide um JWS anexado assinado com o algoritmo HS256

Esta política de exemplo valida um JWS anexado que foi assinado com o algoritmo de encriptação HS256, HMAC usando uma soma de verificação SHA-256. O JWS é transmitido no pedido de proxy através de um parâmetro de formulário denominado JWS. A chave está contida numa variável denominada private.secretkey.

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

header.payload.signature

A configuração da política inclui as informações de que o Apigee precisa para descodificar e avaliar o JWS, como onde encontrar o JWS (numa variável de fluxo especificada no elemento <Source>), o algoritmo de assinatura necessário e onde encontrar a chave secreta (armazenada numa variável de fluxo do Apigee, que pode ter sido obtida, por exemplo, a partir do KVM do Apigee).

<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 escreve o respetivo resultado em variáveis de contexto para que as políticas ou as condições subsequentes no proxy de API possam examinar esses valores. Consulte o artigo Variáveis de fluxo para ver uma lista das variáveis definidas por esta política.

Valide um JWS separado assinado com o algoritmo RS256

Esta política de exemplo valida um JWS separado que foi assinado com o algoritmo RS256. Para validar, tem de indicar a chave pública. O JWS é transmitido no pedido de proxy através de um parâmetro de formulário denominado JWS. A chave pública está contida numa variável denominada public.publickey.

Um JWS separado omite a carga útil do JWS:

header..signature

É da sua responsabilidade transmitir a carga útil à política VerifyJWS especificando o nome da variável que contém a carga útil no elemento <DetachedContent>. O conteúdo especificado em <DetachedContent> tem de estar no formato original não codificado em que se encontrava quando a assinatura 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 escreve o respetivo resultado em variáveis de contexto para que as políticas ou as condições subsequentes no proxy de API possam examinar esses valores. Consulte o artigo Variáveis de fluxo para ver uma lista das variáveis definidas por esta política.

Definir os elementos principais

Os elementos que usa para especificar a chave usada para validar o JWS dependem do algoritmo escolhido, conforme mostrado na tabela seguinte:

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 chaves, consulte o artigo Acerca dos algoritmos de encriptação de assinaturas.

Referência do elemento

A referência da política descreve os elementos e os atributos da política Verify JWS.

Nota: a configuração varia ligeiramente consoante o algoritmo de encriptação que usa. Consulte as amostras para ver exemplos que demonstram configurações para exemplos de utilização específicos.

S

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 principais da política.

Atributo Descrição Predefinição Presença
nome O nome interno da política. Os carateres que pode usar no nome estão restritos a: A-Z0-9._\-$ %. No entanto, a IU do Apigee aplica restrições adicionais, como a remoção automática de carateres que não sejam alfanuméricos.

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

N/A Obrigatória
continueOnError Definido como false para devolver um erro quando uma política falha. Este comportamento é o esperado para a maioria das políticas.

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

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

Defina como false para "desativar" a política. A política não é aplicada, mesmo que permaneça associada a um fluxo.

verdadeiro Opcional
assíncrono Este atributo foi descontinuado. falso Descontinuado

<DisplayName>

<DisplayName>Policy Display Name</DisplayName>

Use em conjunto com o atributo name para etiquetar a política no editor de proxy da IU do Apigee com um nome diferente em linguagem natural.

Predefinição Se omitir este elemento, é usado o valor do atributo name da política.
Presença Opcional
Tipo String

<Algorithm>

<Algorithm>HS256</Algorithm>

Especifica o algoritmo de encriptação para assinar o token. Os algoritmos RS*/PS*/ES* usam um par de chaves pública/secreta, enquanto os algoritmos HS* usam um segredo partilhado. Consulte também Acerca dos algoritmos de encriptação de assinatura.

Pode especificar vários valores separados por vírgulas. Por exemplo, "HS256, HS512" ou "RS256, PS256". No entanto, não pode combinar algoritmos HS* com outros nem algoritmos ES* com outros, porque requerem um tipo de chave específico. Pode combinar algoritmos RS* e PS*.

Predefinição N/A
Presença Obrigatória
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 reivindicação adicionais especificados e se os valores de reivindicação afirmados correspondem.

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

Predefinição N/A
Presença Opcional
Tipo

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

O tipo é predefinido como String se não for especificado nenhum tipo.

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

O elemento <Claim> aceita os seguintes atributos:

  • name: (obrigatório) o nome da reivindicação.
  • ref: (opcional) o nome de uma variável de fluxo. Se estiver presente, a política usa o valor desta variável como a reivindicação. Se forem especificados um atributo ref e um valor de reivindicação explícito, o valor explícito é o predefinido e é usado se a variável de fluxo referenciada não for resolvida.
  • type: (opcional) um dos seguintes: string (predefinição), number, boolean ou map
  • array: (opcional) defina como verdadeiro para indicar se o valor é uma matriz de tipos. Predefinição: false.

<DetachedContent>

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

Um JWS gerado com uma carga útil de conteúdo tem o seguinte formato:

header.payload.signature

Se usar a política GenerateJWS para criar uma carga útil separada, o JWS gerado omite a carga útil e tem o seguinte formato:

header..signature

Para uma carga útil separada, cabe-lhe a si transmitir a carga útil para a política VerifyJWS através do elemento <DetachedContent>. A carga útil de conteúdo especificada tem de estar no formato original não codificado em que se encontrava 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 de falha é steps.jws.ContentIsNotDetached).
  • <DetachedContent> é omitido e o JWS tem uma carga útil de conteúdo desanexada (o código de falha é steps.jws.InvalidSignature).
Predefinição N/A
Presença Opcional
Tipo Referência de variável

<IgnoreCriticalHeaders>

<IgnoreCriticalHeaders>true|false</IgnoreCriticalHeaders>

Definido como falso se quiser que a política apresente 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.

Um dos motivos para definir este elemento como verdadeiro é se estiver num ambiente de teste e não quiser que a política falhe devido a um cabeçalho em falta.

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

<IgnoreUnresolvedVariables>

<IgnoreUnresolvedVariables>true|false</IgnoreUnresolvedVariables>

Defina como falso se quiser que a política apresente um erro quando qualquer variável referenciada especificada na política não for resolúvel. Defina como verdadeiro para tratar qualquer variável não resolúvel como uma string vazia (nula).

Predefiniçã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 num token. Por exemplo:

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

A política VerifyJWS examina o cabeçalho crit no JWS, se existir, e, para cada item listado, 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 indicados em crit estejam indicados no elemento <KnownHeaders>. Qualquer cabeçalho que a política encontre em crit que também não esteja listado em <KnownHeaders> faz com que a política VerifyJWS falhe.

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

Predefiniçã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) que contém um conjunto de chaves públicas. Use apenas quando o algoritmo for um de RS256/RS384/RS512, PS256/PS384/PS512 ou ES256/ES384/ES512.

Se o JWS de entrada tiver um ID da chave presente no conjunto de JWKS, a política usa a chave pública correta para validar a assinatura JWS. Para ver detalhes acerca desta funcionalidade, consulte Usar um conjunto de chaves Web JSON (JWKS) para validar uma JWS.

Se obtiver o valor de um URL público, o Apigee armazena em cache o JWKS durante um período de 300 segundos. Quando a cache expira, o Apigee obtém novamente o JWKS.

Predefinição N/A
Presença Para validar um JWS através de um algoritmo RSA, tem de usar o elemento JWKS ou Value.
Tipo String
Valores válidos Uma variável de fluxo, um valor de string ou um 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 validar a assinatura no JWS. Use o atributo ref para transmitir a chave numa variável de fluxo ou especificar a chave codificada em PEM diretamente. Use apenas quando o algoritmo for um de RS256/RS384/RS512, PS256/PS384/PS512 ou ES256/ES384/ES512.

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

<SecretKey>

<SecretKey encoding="base16|hex|base64|base64url" >
  <Value ref="private.your-variable-name"/>
</SecretKey>
  

Especifica a chave secreta a usar quando validar um JWS que usa um algoritmo simétrico (HS*), um de HS256, HS384 ou HS512.

Este elemento é opcional. No entanto, tem de incluir exatamente um dos elementos <PublicKey> ou <SecretKey>. Use o elemento <PublicKey> quando validar um JWS para o qual o algoritmo é RS*, PS* ou ES* e use o elemento <SecretKey> quando validar um JWS para o qual o algoritmo é HS*.

Filhos de <SecretKey>

A tabela seguinte fornece uma descrição dos elementos e atributos secundários de <SecretKey>:

Filho Presença Descrição
codificação (atributo) Opcional

Especifica como a chave é codificada na variável referenciada. Por predefinição, quando não está presente o atributo encoding, a codificação da chave é tratada como UTF-8. Os valores válidos para o atributo são: hex, base16, base64 ou base64url. Os valores de codificação hex e base16 são sinónimos.

<SecretKey encoding="base64" >
  <Value ref="private.secretkey"/>
</SecretKey>

No exemplo acima, uma vez que a codificação é base64, se o conteúdo da variável private.secretkey for SUxvdmVBUElz, a chave é descodificada como um conjunto de 9 bytes, que em hexadecimal é 49 4c 6f 76 65 41 50 49 73.

Valor (elemento) Obrigatória

Uma chave secreta codificada. Especifica a chave secreta que vai ser usada para validar a carga útil. Use o atributo ref para fornecer a chave indiretamente através de uma variável, como private.secret-key .

<SecretKey>
  <Value ref="private.my-secret-variable"/>
</SecretKey>

O Apigee aplica uma intensidade mínima da chave para os algoritmos HS256/HS384/HS512. O comprimento mínimo da chave para HS256 é de 32 bytes, para HS384 é de 48 bytes e para HS512 é de 64 bytes. A utilização de uma chave de menor intensidade provoca um erro de tempo de execução.

<Source>

<Source>JWS-variable</Source>

Se presente, especifica a variável de fluxo na qual a política espera encontrar o JWS a verificar.

Predefinição request.header.authorization (Consulte a nota acima para ver informações importantes acerca da predefinição).
Presença Opcional
Tipo String
Valores válidos Um nome de variável de fluxo do Apigee.

<Type>

<Type>type-string-here</Type>

Elemento opcional cujo único valor permitido é Signed, que especifica que a política valida um JWS assinado. <Type> é fornecido apenas para corresponder ao elemento correspondente para as políticas GenerateJWT e VerifyJWT (onde pode assumir qualquer um dos valores Signed ou Encrypted).

Predefinição N/A
Presença Opcional
Tipo String
Valor válido Signed

Flow variables

Upon success, the Verify JWS and Decode JWS policies set context variables according to this pattern:

jws.{policy_name}.{variable_name}

For example, if the policy name is verify-jws, then the policy will store the algorithm specified in the JWS to this context variable: jws.verify-jws.header.algorithm

Variable name Description
decoded.header.name The JSON-parsable value of a header in the payload. One variable is set for every header in the payload. While you can also use the header.name flow variables, this is the recommended variable to use to access a header.
header.algorithm The signing algorithm used on the JWS. For example, RS256, HS384, and so on. See (Algorithm) Header Parameter for more.
header.kid The Key ID, if added when the JWS was generated. See also "Using a JSON Web Key Set (JWKS)" at JWT and JWS policies overview to verify a JWS. See (Key ID) Header Parameter for more.
header.type The header type value. See (Type) Header Parameter for more.
header.name The value of the named header (standard or additional). One of these will be set for every additional header in the header portion of the JWS.
header-json The header in JSON format.
payload The JWS payload if the JWS has an attached payload. For a detached paylod, this variable is empty.
valid In the case of VerifyJWS, this variable will be true when the signature is verified, and the current time is before the token expiry, and after the token notBefore value, if they are present. Otherwise false.

In the case of DecodeJWS, this variable is not set.

Referência de erro

This section describes the fault codes and error messages that are returned and fault variables that are set by Apigee 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.

Fault variables

These variables are set when a runtime error occurs. For more information, see What you need to know about policy errors.

Variables Where Example
fault.name="fault_name" fault_name is the name of the fault, as listed in the Runtime errors table above. The fault name is the last part of the fault code. fault.name Matches "TokenExpired"
JWS.failed All JWS policies set the same variable in the case of a failure. jws.JWS-Policy.failed = true

Example error response

For error handling, the best practice is to trap the errorcode part of the error response. Do not rely on the text in the faultstring, because it could change.

Example fault rule

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