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

Я пытаюсь написать некоторый код для подписи и проверки полезных нагрузок, используя мои закрытые / открытые ключи в 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)); 

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

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

1 Ответ

1 голос
/ 13 апреля 2019

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

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

JWSVerifier verifier = new RSASSAVerifier(pub);

с

JWSVerifier verifier = new RSASSAVerifier(pub,crit );
...