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