Как я могу проверить JWSObject, у которого есть значение "крит" в его заголовках?

Я пытаюсь написать некоторый код для подписи и проверки полезных нагрузок, используя мои закрытые / открытые ключи в Java, следуя стандартам JOSE. Мне нужно использовать алгоритм шифрования PS256 для этого.

Я использую библиотеку connect2id Nimbus JOSE + JWT. Я могу добраться до точки, где я могу подписать полезную нагрузку закрытым ключом, который я загружаю из файловой системы, и я также могу проверить его. Однако, как часть моих требований, мой заголовок должен иметь значение "крит" (объясняется как часть RFC-7515).

Моя проблема заключается в следующем: как только в заголовке появляется значение "crit", проверка моего токена завершается неудачно (даже если значения в массиве "crit" присутствуют в моем заголовке jws, как того требует стандарт). Если я уберу "крит", то подпись будет проверена правильно.

// 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)); 

Я ожидаю, что подпись будет проверена должным образом, так как значения в "крит" присутствуют в данном токене. Как только я уберу строку с .criticalParams(crit), тогда проверка проходит без проблем.

Может ли кто-нибудь помочь мне с этим? Я что-то неправильно понимаю или пропускаю какие-то вопиющие детали?

1 ответ

Решение

В соответствии с RFC 7515 критические заголовки должны пониматься приложением, поэтому необходимо указать библиотеке, что они переданы приложению для обработки

Глядя на исходный код RSASSAVerifier, попробуйте изменить

JWSVerifier verifier = new RSASSAVerifier(pub);

с

JWSVerifier verifier = new RSASSAVerifier(pub,crit );
Другие вопросы по тегам