我生成了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