java - 从 JKS 导出公钥并从 Java 读取

标签 java openssl rsa jks

我已生成 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/

相关文章:

c++ - "unknown ca"带有自生成的 CA、证书和客户端/服务器

java - 使用Shamir算法加密数字数据集(约100,000)

java - Tomcat 目录,用于在重新启动和重新部署时保存信息

java - 如何摆脱 http ://localhost:8080/test/in Jetty? 中的多余/

c - 如何在 C 中以编程方式哈希 PEM 格式的 X509 证书

iphone - 如何根据公钥的指数和模数创建 SeckeyRef 并在 SecKeyEncrypt 方法中使用

c++ - RSA_Verify失败,返回错误的签名错误

java - Hibernate单向多对一和级联删除

java - 来自命令行的 WEKA 分类器参数

php - Openssl RSA加密-解密