2017-08-11 77 views
1

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

我在做對吧?

+0

你不應該需要輸出什麼。數字簽名應包括簽名人的證書,幷包括其公鑰。 – EJP

+0

@EJP我不相信簽名者。所以,我必須確保它確實使用了相同的密鑰我簽名 –

+0

不,您必須確保*完整的證書*是相同的,並且是可信的。在那之後,從哪裏獲取公鑰並不重要。 – EJP

回答

0

這是我的錯誤,我試圖用錯誤的證書(Keycloak JBOSS)驗證簽名,但實際上訪問令牌是使用Realm的密鑰簽名的。我必須從領域 - >密鑰 - > RSA - >證書(不是通過在Keycloak Jboss配置的密鑰庫JKS中生成證書文件)創建證書文件。

0

它應該工作,我試着生成相同的一組密鑰/證書並驗證它(我用的充氣城堡)

import org.bouncycastle.jce.provider.BouncyCastleProvider; 
import org.bouncycastle.jce.provider.X509CertificateObject; 
import org.bouncycastle.util.io.pem.PemObject; 
import org.bouncycastle.util.io.pem.PemReader; 

import java.io.*; 
import java.security.KeyStore; 
import java.security.Security; 
import java.security.cert.CertificateFactory; 
import java.security.cert.X509Certificate; 
import java.util.Enumeration; 
public class CertTest { 
    public static void main(String[] args) throws Exception { 
    Security.addProvider(new BouncyCastleProvider()); 
    KeyStore ks = KeyStore.getInstance("JKS"); 
    try (Reader readStream = new FileReader("publickey.cert")){ 
     PemReader reader = new PemReader(readStream); 
     CertificateFactory certFactory = CertificateFactory.getInstance("X.509"); 
     PemObject pemObject = reader.readPemObject(); 
     X509Certificate cert = (X509Certificate)certFactory.generateCertificate(new ByteArrayInputStream(pemObject.getContent())); 
     System.out.println(cert.getPublicKey().getAlgorithm()); 
    } 
    } 
} 

打印:RSA

+0

是的,它應該工作。請看我的答案。不管怎麼說,還是要謝謝你! –