Política GenerateJWS

Esta página se aplica a Apigee y Apigee Hybrid.

Consulta la documentación de Apigee Edge.

Icono de política

Qué

Genera un JWS firmado con un conjunto de reclamaciones configurable. El JWS se puede devolver a los clientes, transmitir a los destinos de backend o usar de otras formas. Consulta la información general sobre las políticas de JWS y JWT para obtener una introducción detallada.

Para obtener información sobre las partes de un JWS y cómo se cifran y firman, consulta el estándar RFC7515.

Esta política es una política extensible y su uso puede tener implicaciones en cuanto a costes o utilización, en función de tu licencia de Apigee. Para obtener información sobre los tipos de políticas y las implicaciones de uso, consulta Tipos de políticas.

Vídeo

Echa un vistazo a este breve vídeo para aprender a generar un JWT firmado. Aunque este vídeo se centra en la generación de un JWT, muchos de los conceptos son los mismos para JWS.

Ejemplos

Generar un JWS firmado con HS256

Esta política de ejemplo genera un JWS firmado con el algoritmo HS256. HS256 se basa en un secreto compartido para firmar y verificar la firma. Este JWS usa contenido "adjunto", lo que significa que el encabezado, la carga útil y la firma codificados se concatenan con puntos para generar el JWS final:

[header].[payload].[signature]

Use el elemento <Payload> para especificar la carga útil de JWS sin codificar. En este ejemplo, una variable contiene la carga útil. Cuando se activa esta acción de política, Apigee codifica el encabezado y la carga útil de JWS y, a continuación, añade la firma codificada para firmar digitalmente el JWS.

La configuración de la política que se muestra a continuación crea un JWS a partir de una carga útil contenida en la variable my-payload y almacena el JWS resultante en la variable output-variable.

<GenerateJWS name="JWS-Generate-HS256">
    <DisplayName>JWS Generate HS256</DisplayName>
    <Algorithm>HS256</Algorithm>
    <IgnoreUnresolvedVariables>false</IgnoreUnresolvedVariables>
    <SecretKey>
        <Value ref="private.secretkey"/>
        <Id>1918290</Id>
    </SecretKey>
    <Payload ref="my-payload"/>
    <OutputVariable>output-variable</OutputVariable>
</GenerateJWS>

Generar un JWT firmado con HS256

En este ejemplo también se genera un JWS con contenido adjunto que se firma con el algoritmo HS256. En este caso, la carga útil es JSON. Si se define el encabezado typ como JWT, se obtiene un JWS firmado que también es un JWT firmado. (referencia)

La configuración de la política que se muestra a continuación crea un JWS a partir de una carga útil contenida en la variable json-content y almacena el JWS resultante en la variable output-variable. El resultado será un JWT firmado si y solo si la variable json-content contiene una carga útil JSON y las propiedades de esa carga útil JSON son válidas para JWT. Por ejemplo, la propiedad exp, si está presente, debe tener un valor numérico. La propiedad aud, si está presente, debe ser una cadena o una matriz de cadenas. Y así sucesivamente. Consulta el RFC7519 de IETF para obtener más información sobre los valores válidos de las reclamaciones de JWT.

<GenerateJWS name="JWS-Generate-HS256-JWT">
    <Algorithm>HS256</Algorithm>
    <IgnoreUnresolvedVariables>false</IgnoreUnresolvedVariables>
    <SecretKey>
        <Value ref="private.secretkey"/>
    </SecretKey>
    <Payload ref="json-content"/>
    <AdditionalHeaders>
        <Claim name="typ">JWT</Claim>
    </AdditionalHeaders>
    <OutputVariable>output-variable</OutputVariable>
</GenerateJWS>

Generar un JWS independiente

Esta política de ejemplo genera un JWS con contenido independiente, firmado con el algoritmo RS256. Para generar una firma RS256, se necesita una clave privada RSA, que debe proporcionarse en formato codificado con PEM.

Un JWS con contenido independiente omite la carga útil del JWS generado:

[header]..[signature]

Use el elemento <Payload> para especificar la carga útil de JWS sin codificar. Cuando se activa esta política, Apigee codifica el encabezado y la carga útil de JWS y, a continuación, los usa para generar la firma codificada. Sin embargo, el JWS generado omite la carga útil codificada del JWS serializado. Esto resulta útil cuando el contenido firmado es grande o binario (como una imagen o un PDF) o ambas cosas. Para permitir la validación, debes enviar ambos elementos (el JWS y la carga útil incluida en el contenido firmado) a la parte verificadora. Si usas la política VerifyJWS para verificar el JWS, puedes especificar la variable que contiene la carga útil con el elemento <DetachedContent> de la política VerifyJWS.

<GenerateJWS name="JWS-Generate-RS256">
    <DisplayName>JWS Generate RS256</DisplayName>
    <Algorithm>RS256</Algorithm>
    <IgnoreUnresolvedVariables>false</IgnoreUnresolvedVariables>
    <PrivateKey>
        <Value ref="private.privatekey"/>
        <Password ref="private.privatekey-password"/>
        <Id ref="private.privatekey-id"/>
    </PrivateKey>
    <Payload ref="my-payload"/>
    <DetachContent>true</DetachContent>
    <OutputVariable>output-variable</OutputVariable>
</GenerateJWS>

Definir los elementos clave

Los elementos que se usan para especificar la clave utilizada para generar el JWS dependen del algoritmo elegido, como se muestra en la siguiente tabla:

Algoritmo Elementos clave
HS{256/384/512}*
<SecretKey>
  <Value ref="private.secretkey"/>
  <Id>1918290</Id>
</SecretKey>
RS/PS/ES{256/384/512}*
<PrivateKey>
  <Value ref="private.privatekey"/>
  <Password ref="private.privatekey-password"/>
  <Id ref="private.privatekey-id"/>
</PrivateKey>

Los elementos <Password> y <Id> son opcionales.

*Para obtener más información sobre los requisitos de las claves, consulta Acerca de los algoritmos de cifrado de firmas.

Referencia de elementos de Generate JWS

En la referencia de la política se describen los elementos y atributos de la política Generate JWS.

Nota: La configuración variará ligeramente en función del algoritmo de cifrado que utilices. Consulta los ejemplos para ver configuraciones de casos prácticos específicos.

Atributos que se aplican al elemento de nivel superior

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

Los siguientes atributos son comunes a todos los elementos principales de la política.

Atributo Descripción Predeterminado Presencia
name El nombre interno de la política. Solo puedes usar los siguientes caracteres en el nombre: A-Z0-9._\-$ %. Sin embargo, la interfaz de usuario de Apigee aplica restricciones adicionales, como la eliminación automática de caracteres que no son alfanuméricos.

También puedes usar el elemento <displayname></displayname> para etiquetar la política en el editor de proxies de la interfaz de usuario de Apigee con un nombre diferente en lenguaje natural.

N/A Obligatorio
continueOnError Asigna el valor false para devolver un error cuando falle una política. Este es el comportamiento esperado de la mayoría de las políticas.

Asigna el valor true para que la ejecución del flujo continúe incluso después de que falle una política.

falso Opcional
habilitada Asigna el valor true para aplicar la política.

Selecciona false para desactivar la política. La política no se aplicará, aunque siga adjunta a un flujo.

true Opcional
asíncrono Este atributo está obsoleto. falso Obsoleto

<DisplayName>

<DisplayName>Policy Display Name</DisplayName>

Se usa junto con el atributo name para etiquetar la política en el editor de proxies de la interfaz de usuario de Apigee con un nombre diferente en lenguaje natural.

Predeterminado Si omite este elemento, se usará el valor del atributo name de la política.
Presencia Opcional
Tipo Cadena

<Algorithm>

<Algorithm>algorithm-here</Algorithm>

Especifica el algoritmo de cifrado para firmar el token.

Predeterminado N/A
Presencia Obligatorio
Tipo Cadena
Valores válidos HS256, HS384, HS512, RS256, RS384, RS512, ES256, ES384, ES512, PS256, PS384 y 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>

Coloca los pares nombre-valor de la reclamación adicional en el encabezado del JWS.

Predeterminado N/A
Presencia Opcional
Valores válidos Cualquier valor que quieras usar para una reclamación adicional. Puedes especificar la reclamación explícitamente como cadena, número, valor booleano, mapa o matriz.

El elemento <Claim> acepta estos atributos:

  • name: obligatorio. Es el nombre de la reclamación, también conocido como parámetro.
  • ref: (opcional) Nombre de una variable de flujo. Si está presente, la política usará el valor de esta variable como la reclamación. Si se especifican tanto un atributo ref como un valor de reclamación explícito, el valor explícito será el predeterminado y se usará si la variable de flujo a la que se hace referencia no se resuelve.
  • type: (opcional) uno de los siguientes valores: string (valor predeterminado), number, boolean o map.
  • array: (opcional) asigna el valor true para indicar si el valor es una matriz de tipos. Valor predeterminado: false.

<CriticalHeaders>

<CriticalHeaders>a,b,c</CriticalHeaders>

or:

<CriticalHeaders ref="variable_containing_headers"/>

Añade el encabezado crítico, crit, al JWS. La cabecera crit es una matriz de nombres de cabeceras que debe conocer y reconocer el receptor de JWS. Por ejemplo, puede usar este elemento de configuración para generar un encabezado JWS que, al decodificarse, tenga este aspecto:

{
  "typ": "...",
  "alg" : "...",
  "hyb" : "some-value-here",
  "crit" : [ "hyb" ],
}

Este encabezado JWS afirma que el parámetro de encabezado hyb es de importancia crítica y que cualquier destinatario del JWS debe entender el significado y el valor de ese parámetro.

Según el RFC 7515 de IETF, el destinatario de un JWS debe rechazarlo como no válido si no entiende uno o varios de los parámetros a los que se hace referencia en el parámetro crit. En Apigee, la política VerifyJWS se ajusta a este comportamiento. Por cada parámetro que aparece en el parámetro crit, se comprueba que el elemento <KnownHeaders> de la política VerifyJWS también incluya ese parámetro. Si la política VerifyJWS encuentra en crit una cabecera que no aparece en <KnownHeaders>, la política VerifyJWS rechazará el JWS.

Predeterminado N/A
Presencia Opcional
Tipo Array de una o varias cadenas separadas por comas.
Valores válidos Una matriz o una referencia a una variable que contenga la matriz.

<DetachContent>

<DetachContent>true|false</DetachContent>

Especifica si se debe generar el JWS con una carga útil independiente (<DetachContent>true</DetachContent>) o no (<DetachContent>false</DetachContent>).

Si especificas el valor predeterminado (false), el JWS generado tendrá el siguiente formato:

[header].[payload].[signature]

Si especificas "true" para crear un JWS con una carga útil independiente, el JWS generado omitirá la carga útil y tendrá el siguiente formato:

[header]..[signature]

En el caso de un JWS con una carga útil independiente, debes enviar la carga útil original sin codificar a la parte verificadora junto con el JWS serializado.

Predeterminado falso
Presencia Opcional
Tipo Booleano
Valores válidos verdadero o falso

<IgnoreUnresolvedVariables>

<IgnoreUnresolvedVariables>true|false</IgnoreUnresolvedVariables>

Asigna el valor false si quieres que la política genere un error cuando no se pueda resolver ninguna variable de referencia especificada en la política. Se define como true para tratar cualquier variable que no se pueda resolver como una cadena vacía (nula).

Predeterminado falso
Presencia Opcional
Tipo Booleano
Valores válidos verdadero o falso

<OutputVariable>

<OutputVariable>output-variable</OutputVariable>

Especifica el nombre de la variable de contexto que la política definirá con el JWS generado. De forma predeterminada, la política coloca el JWS en la variable de contexto llamada jws.POLICYNAME.generated_jws.

Predeterminado jws.POLICYNAME.generated_jws
Presencia Opcional
Tipo Cadena (nombre de una variable de flujo)

<Payload>

<Payload ref="flow-variable-name-here" />

or

<Payload>payload-value</Payload>

Especifica la carga útil de JWS sin codificar. Especifica una variable que contenga la carga útil o una cadena.

Predeterminado N/A
Presencia Obligatorio
Tipo Cadena, matriz de bytes, flujo o cualquier otra representación de la carga útil de JWS sin codificar.
Valores válidos Una plantilla de mensaje o una referencia a una variable que contenga la carga útil.

Elemento <PrivateKey>

Es opcional y solo se usa cuando <Algorithm> es una de las opciones RS*, PS* o ES*. Especifica la clave privada que se va a usar para firmar, así como otra información relacionada con la clave privada. Se usa cuando el algoritmo es asimétrico.

<PrivateKey>
   <Value ref="private.privatekey"</Value>
</PrivateKey>
Valor predeterminado: N/A
Presencia: Opcional. Sin embargo, debe incluir exactamente uno de los elementos <PrivateKey> o <SecretKey>. Usa el elemento <PrivateKey> cuando el algoritmo sea RS*, PS* o ES*, y el elemento <SecretKey> cuando el algoritmo sea HS*.
Tipo: N/A

<PrivateKey/Id>

<PrivateKey>
  <Id ref="flow-variable-name-here"/>
</PrivateKey>

or

<PrivateKey>
  <Id>your-id-value-here</Id>
</PrivateKey>

Especifica el ID de clave (kid) que se debe incluir en el encabezado JWS.

Predeterminado N/A
Presencia Opcional
Tipo Cadena
Valores válidos Una variable de flujo o una cadena

<PrivateKey/Password>

<PrivateKey>
  <Password ref="private.privatekey-password"/>
</PrivateKey>

Especifica la contraseña que debe usar la política para descifrar la clave privada, si es necesario. Usa el atributo ref para transferir la clave en una variable de flujo.

Predeterminado N/A
Presencia Opcional
Tipo Cadena
Valores válidos

Referencia a una variable de flujo. Nota: Debe especificar una variable de flujo con el atributo ref. Apigee rechazará como no válida una configuración de política en la que la contraseña se especifique en texto sin cifrar. La variable de flujo debe tener el prefijo "private". Por ejemplo, private.mypassword

<PrivateKey/Value>

<PrivateKey>
  <Value ref="private.variable-name-here"/>
</PrivateKey>

Especifica una clave privada codificada en PEM que se usa para firmar el JWS. Usa el atributo ref para transferir la clave en una variable de flujo.

Predeterminado N/A
Presencia Obligatorio cuando se usa la política para generar un JWS con uno de los algoritmos RS*, PS* o ES*.
Tipo Cadena
Valores válidos Una variable de flujo que contiene una cadena que representa un valor de clave privada codificado en PEM.

Nota: La variable de flujo debe tener el prefijo "private". Por ejemplo: private.mykey

<SecretKey>

<SecretKey encoding="base16|hex|base64|base64url" >
  <Id ref="variable-containing-key-id-here">secret-key-id</Id>
  <Value ref="private.variable-here"/>
</SecretKey>

Especifica la clave secreta que se usará al generar un JWS que utilice un algoritmo simétrico (HS*), como HS256, HS384 o HS512.

Este elemento es opcional. Sin embargo, debe incluir exactamente uno de los elementos <PrivateKey> o <SecretKey>. Usa el elemento <PrivateKey> cuando generes un JWS firmado con un algoritmo asimétrico (uno de RS*, PS* o ES*) y el elemento <SecretKey> cuando generes un JWS firmado con un algoritmo simétrico (como HS*).

Hijos de <SecretKey>

En la siguiente tabla se describen los elementos secundarios y los atributos de <SecretKey>:

Hijo/a Presencia Descripción
codificación (atributo) Opcional

Especifica cómo se codifica la clave en la variable a la que se hace referencia. De forma predeterminada, si no se incluye el atributo encoding, la codificación de la clave se trata como UTF-8. Los valores válidos del atributo son: hex, base16, base64 o base64url. Los valores de codificación hexadecimal y base16 son sinónimos.

<SecretKey encoding="hex" >
  <Id ref="variable-containing-key-id-here">secret-key-id</Id>
  <Value ref="private.secretkey"/>
</SecretKey>

En el ejemplo anterior, como la codificación es hex, si el contenido de la variable private.secretkey es 494c6f766541504973, la clave se decodificará como un conjunto de 9 bytes, que en hexadecimal será 49 4c 6f 76 65 41 50 49 73.

Id (elemento) Opcional

Identificador de la clave. El valor puede ser cualquier cadena. Puede especificar el valor como un valor de texto literal o, de forma indirecta, mediante una referencia de variable con el atributo ref.

<SecretKey>
  <Id ref="flow-variable-name-here"/>
  <Value ref="private.variable-here"/>
</SecretKey>

or

<SecretKey>
  <Id>your-id-value-here</Id>
  <Value ref="private.variable-here"/>
</SecretKey>

La política incluirá este identificador de clave como la reclamación kid en el encabezado del JWS generado.

Valor (elemento) Obligatorio

Una clave secreta codificada. Especifica la clave secreta que se usa para firmar la carga útil. Utilice el atributo ref para proporcionar la clave indirectamente a través de una variable, como private.secret-key .

<SecretKey>
  <Id ref="flow-variable-name-here"/>
  <Value ref="private.my-secret-variable"/>
</SecretKey>

Apigee aplica una longitud mínima de clave para los algoritmos HS256, HS384 y HS512. La longitud mínima de la clave de HS256 es de 32 bytes, la de HS384 es de 48 bytes y la de HS512 es de 64 bytes. Si se usa una clave con una seguridad inferior, se produce un error de tiempo de ejecución.

<Type>

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

Elemento opcional cuyo único valor permitido es Signed, que especifica que la política genera un JWS firmado. <Type> se proporciona solo para que coincida con el elemento correspondiente de las políticas GenerateJWT y VerifyJWT (donde puede adoptar cualquiera de los valores Signed o Encrypted).

Predeterminado N/A
Presencia Opcional
Tipo Cadena
Valor válido Signed

Variables de flujo

La política Generar JWS no define variables de flujo.

Referencia de errores

En esta sección se describen los códigos de error y los mensajes de error que devuelve Apigee, así como las variables de error que define, cuando esta política activa un error. Es importante que conozcas esta información si vas a desarrollar reglas de errores para gestionarlos. Para obtener más información, consulta Qué debes saber sobre los errores de las políticas y Cómo gestionar los fallos.

Errores de tiempo de ejecución

Estos errores pueden producirse cuando se ejecuta la política.

Código de fallo Estado de HTTP Se produce cuando
steps.jws.GenerationFailed 401 La política no ha podido generar el JWS.
steps.jws.InsufficientKeyLength 401 Para una clave de menos de 32 bytes para el algoritmo HS256
steps.jws.InvalidClaim 401 Si falta una reclamación o no coincide, o si falta un encabezado o no coincide.
steps.jws.InvalidCurve 401 La curva especificada por la clave no es válida para el algoritmo de curva elíptica.
steps.jws.InvalidJsonFormat 401 Se ha encontrado un JSON no válido en el encabezado de JWS.
steps.jws.InvalidPayload 401 La carga útil de JWS no es válida.
steps.jws.InvalidSignature 401 <DetachedContent> se omite y el JWS tiene una carga útil de contenido independiente.
steps.jws.KeyIdMissing 401 La política Verify usa un JWKS como fuente de claves públicas, pero el JWS firmado no incluye una propiedad kid en el encabezado.
steps.jws.KeyParsingFailed 401 No se ha podido analizar la clave pública a partir de la información de clave proporcionada.
steps.jws.MissingPayload 401 Falta la carga útil de JWS.
steps.jws.NoAlgorithmFoundInHeader 401 Se produce cuando el JWS omite el encabezado del algoritmo.
steps.jws.SigningFailed 401 En GenerateJWS, si la clave es inferior al tamaño mínimo de los algoritmos HS384 o HS512
steps.jws.UnknownException 401 Se ha producido una excepción desconocida.
steps.jws.WrongKeyType 401 Se ha especificado un tipo de clave incorrecto. Por ejemplo, si especificas una clave RSA para un algoritmo de curva elíptica o una clave de curva para un algoritmo RSA.

Errores de implementación

Estos errores pueden producirse al implementar un proxy que contenga esta política.

Nombre del error Se produce cuando
InvalidAlgorithm Los únicos valores válidos son 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

Otros posibles errores de implementación.

Variables con fallas

Estas variables se configuran cuando se genera un error de entorno de ejecución. Para obtener más información, consulta Qué debes saber sobre los errores de la política.

Variables Donde Ejemplo
fault.name="fault_name" fault_name es el nombre de la falla, como se indica en la tabla de Errores del entorno de ejecución anterior. El nombre de la falla es la última parte del código de la falla. fault.name Matches "TokenExpired"
JWS.failed Todas las políticas de JWS establecen la misma variable en caso de falla. jws.JWS-Policy.failed = true

Ejemplo de respuesta de error

Para controlar errores, se recomienda capturar la parte errorcode de la respuesta de error. No dependas del texto en la faultstring, ya que podría cambiar.

Ejemplo de regla de falla

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