我生成了JKS格式的RSA 256公钥/私钥。从JKS导出公钥并从Java中读取
keytool -genkey -keyalg RSA -alias selfsigned -keystore keystore.jks -storepass password -validity 360 -keysize 10950
该文件在Keycloak中配置,该文件将使用私钥签名访问令牌(JWT)。
从我的基于Java的应用程序中,我想用公钥来验证访问令牌的签名。可能存在一个更简单的机制,但尝试各种方法后我感到困惑。从JKS文件
keytool -export -alias selfsigned -keystore keystore.jks -rfc -file publickey.cert
导出的公钥证书来从Java应用程序的证书文件:
// Use file stream to load from file system or class.getResourceAsStream to load from classpath
InputStream readStream = this.getClass().getClassLoader().getResourceAsStream("publickey.cert");
CertificateFactory f = CertificateFactory.getInstance("X.509");
//Certificate certificate = f.generateCertificate(readStream);
X509Certificate certificate = (X509Certificate)f.generateCertificate(readStream);
publicKey = certificate.getPublicKey();
readStream.close();
验证签名用的公钥和jjwt
Jwts.parser().setSigningKey(publicKey).parseClaimsJws(accessToken).getBody();
以上代码会抛出此异常:
io.jsonwebtoken.SignatureException: Unable to verify RSA signature using configured PublicKey. Signature length not correct: got 256 but was expecting 1369
我在做对吧?
你不应该需要输出什么。数字签名应包括签名人的证书,并包括其公钥。 – EJP
@EJP我不相信签名者。所以,我必须确保它确实使用了相同的密钥我签名 –
不,您必须确保*完整的证书*是相同的,并且是可信的。在那之后,从哪里获取公钥并不重要。 – EJP