2017-02-23 78 views
1

我在Java KeyStore中存儲了我的證書,這是訪問Restful API所必需的。要訪問這個API,我需要創建JWT(Json Web Token),我正在用Java實現它。爲了生成JWT,我需要用給定的私鑰對有效載荷進行簽名。 那麼,我做的是,從.jks導入私有密鑰文件到我的代碼現在java - 需要從jks(java密鑰庫)導入私鑰

FileInputStream is = new FileInputStream("src/main/resources/file.jks"); 
      KeyStore keystore = KeyStore.getInstance(KeyStore.getDefaultType()); 
      keystore.load(is, "password".toCharArray()); 
PrivateKey privateKey = (PrivateKey) keystore.getKey("key", "".toCharArray()); 
JWTClaimsSet claimsSetOne = new JWTClaimsSet.Builder() 
       .subject("alias") 
       .issueTime(new Date(123000L)) 
       .issuer("https://issuer") 
       .audience("https://audience") 
       .build(); 

JWSSigner signer = new RSASSASigner(privateKey); 
SignedJWT signedJWT = new SignedJWT (new JWSHeader(JWSAlgorithm.RS256), claimsSetOne); 
signedJWT.sign(signer); 
String orderOne = signedJWT.serialize(); 

,用這段代碼,它返回私鑰爲「空」值。這導致我的代碼失敗。 那麼,我的代碼是什麼,這樣我就可以讀取私鑰來簽署有效載荷來生成JWT。 或其他任何可以實現相同的選擇。 在此先感謝。
編輯: 後來我試過這個命令,

File file = new File("src/main/resources/sho1.jks"); 
InputStream is = new FileInputStream(file); 
KeyStore keystore = KeyStore.getInstance(KeyStore.getDefaultType()); 
String password = "sho123"; 
keystore.load(is, password.toCharArray()); 

KeyStore.PrivateKeyEntry keyEnt = 
    (KeyStore.PrivateKeyEntry) keystore.getEntry("sho",new KeyStore.PasswordProtection(password.toCharArray())); 
PrivateKey privateKey = keyEnt.getPrivateKey(); 

它給了我錯誤的Invalid_Signature。

+0

您是如何將密鑰導入密鑰庫的?是導入密鑰時使用的別名的「鑰匙」? – JEY

+0

我有一個.pfx文件。然後使用keytool命令,我將它導入到java密鑰庫中。 –

+0

你確定「key」是你的私鑰的別名? – JEY

回答

1

JAVA代碼的實現沒有錯。此代碼工作正常。我得到的INVALID_SIGNATURE錯誤是由於JKS。我輸入的證書不是正確的,即它沒有正確的證書路徑。我試圖導入正確的方式,然後它的工作。 因此,請確保在這種情況下,您正在使用正確的密鑰對導入證書,以便在JKS中獲得正確的指紋。 謝謝大家。