¿Cómo puedo validar un objeto JWSO que tiene un valor "crítico" en sus encabezados?

Estoy tratando de escribir un código para firmar y validar las cargas útiles utilizando mis claves privadas / públicas en Java siguiendo los estándares de JOSE. Necesito usar el algoritmo de cifrado PS256 para esto.

Estoy usando la biblioteca de connect2id Nimbus JOSE + JWT . Puedo llegar al punto en el que puedo firmar una carga útil con una clave privada que cargo desde el sistema de archivos, y también puedo validarla. Sin embargo, como parte de mis requisitos, mi encabezado debe tener un valor "crítico" (explicado como parte de RFC-7515 ).

Mi problema es el siguiente: tan pronto como tengo un valor "crítico" en el encabezado, la validación de mi token falla (incluso si los valores en la matriz "crítico" están presentes en mi encabezado jws, como lo requiere el estándar). Si elimino el "crítico", la firma se valida correctamente.

// create RSA key used for signing. 
RSAKey rsaJWK = new RSAKey.Builder(pub)
  .privateKey(priv)
  .keyUse(KeyUse.SIGNATURE)
  .algorithm(JWSAlgorithm.PS256)
  .keyID("KeyID")
  .build();

// Create RSA-signer with the private key
JWSSigner signer = new RSASSASigner(rsaJWK);

// setting critical values to be used in jws header
Set crit = new HashSet();
crit.add("myHeader");

// setting additional parameters for the jws header
Map myParams = new HashMap();
myParams.put("myHeader", false);

// build the jws header with all the values needed
JWSHeader jwsHeader = new JWSHeader.Builder(JWSAlgorithm.PS256)
  .type(JOSEObjectType.JOSE)
  .contentType("application/json")
  .keyID("KeyID")
  .criticalParams(crit)
  .customParams(myParams)
  .build();


// build the jws object with the header we created above and a static payload for now
JWSObject jwsObject = new JWSObject(jwsHeader, new Payload("{\"message\":\"In RSA we trust!!!\"}"));

// sign the payload
jwsObject.sign(signer);

// print out the token
String s = jwsObject.serialize();
System.out.println("Your token:" + s);



// To parse the JWS and verify it, e.g. on client-side
JWSObject jwsValObj = JWSObject.parse(s);

JWSVerifier verifier = new RSASSAVerifier(pub);

// verify the signature of the parsed token
boolean sigval = jwsValObj.verify(verifier);
System.out.println("Signature Validation passed: " + String.valueOf(sigval)); 

Espero que la firma se verifique correctamente ya que los valores en "crit" están presentes en el token dado. Tan pronto como elimine la línea .criticalParams(crit), la verificación se realizará sin problemas.

¿Alguien me puede ayudar con esto? ¿Estoy malinterpretando algo o me falta algún detalle deslumbrante?

Respuesta 1

Estoy tratando de crear un analizador para el código fuente como este: [tabla de códigos 1.0] tabla de códigos code_table_name id = 500 desc = "mi tabla de códigos una" tabla de códigos finales ... y aquí debajo está la gramática I ...

Digamos que tengo un método que toma un parámetro y devuelve un Mono <Integer> que se completa de forma asíncrona. Por ejemplo: Aleatorio aleatorio = nuevo Aleatorio (); ScheduledExecutorService ...

Tengo una aplicación web que estaba intentando implementar en un servidor remoto de Windows 2003 con java6, tomcat6 y mysql5.5. Después de implementar la aplicación cuando llego a la url de la aplicación, me sigue ...

Contexto que intenta recuperar RetrieveAttributeChangeHistory de la entidad de auditoría de Dynamics 365. Necesito ayuda para formar la sintaxis adecuada para la función OData en esta entidad. Como la función no está consolidada, soy ...