我已生成 JKS 格式的 RSA 256 公钥/私钥。
keytool -genkey -keyalg RSA -alias selfsigned -keystore keystore.jks -storepass password -validity 360 -keysize 10950
此文件在 Keycloak 中配置,它将使用私钥对访问 token (JWT) 进行签名。
在我的基于 Java 的应用程序中,我想使用公钥验证访问 token 的签名。可能存在更简单的机制,但在尝试了各种方法后我感到困惑。
从 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
我这样做对吗?
最佳答案
这是我的错误,我试图使用错误的证书(Keycloak JBOSS)验证签名,但实际上访问 token 是使用 Realm 的 key 进行签名的。我必须从领域 -> key -> RSA -> 证书创建一个证书文件(不是通过在 Keycloak Jboss 中配置的 keystore JKS 生成它)
关于java - 从 JKS 导出公钥并从 Java 读取,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45627341/