Esta página aplica-se ao Apigee e ao Apigee Hybrid.
Veja a documentação do
Apigee Edge.
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
- Valide um JWS separado assinado com o algoritmo RS256
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.
SAtributos 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 |
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 |
falso | Opcional |
ativada |
Defina como true para aplicar a política.
Defina como |
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
<SecretKey encoding="base64" > <Value ref="private.secretkey"/> </SecretKey> No exemplo acima, uma vez que a codificação é |
Valor (elemento) | Obrigatória | Uma chave secreta codificada. Especifica a chave secreta que vai ser usada
para validar a carga útil. Use o atributo <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 . |
|
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>