切り離されたペイロードを持つ JWS の検証で問題が発生しています。jose4j ドキュメントで提供されている例のすべての手順を基本的にコピーしましたが、何らかの理由で、検証は成功するはずなのに false を返します。
jose4jの最新バージョンを使用して、私が使用しているコードは次のとおりです。
// signature is the complete JWS in the form: "JOSE Header".."JWS Signature"
// payload is the unencoded JSON string that makes up the request body
public boolean verifySignature(String signature, String payload) {
JsonWebSignature jws = new JsonWebSignature();
jws.setKnownCriticalHeaders(critHeaders); //critical headers from documentation
//Algorithm as provided in documentation
jws.setAlgorithmConstraints(new AlgorithmConstraints(AlgorithmConstraints.ConstraintType.PERMIT,
AlgorithmIdentifiers.ECDSA_USING_P256_CURVE_AND_SHA256));
jws.setPayload(payload);
try {
jws.setCompactSerialization(signature);
String keyId = jws.getKeyIdHeaderValue();
String keyType = jws.getKeyType();
String keyAlg = jws.getAlgorithmHeaderValue();
//Retrieve key from cached jwks
JsonWebKey usedKey = jwks.findJsonWebKey(keyId, keyType, "sig", keyAlg);
jws.setKey(usedKey.getKey());
return jws.verifySignature();
} catch (JoseException e) {
//log
return false;
}
}