2012-08-10 46 views
0
String keyStorePath = "2keystore.jks"; 
String keyStoreType = "JKS"; 
String keyStorePassword = "mypass"; 

KeyStore keyStore = KeyStore.getInstance(keyStoreType); 
InputStream ksis = ClassLoader.getSystemResourceAsStream(keyStorePath); 
keyStore.load(ksis, keyStorePassword.toCharArray()); 
ksis.close(); 
// Above seems to work fine 

KeyManagerFactory kmf = 
     KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm()); 
    kmf.init(keyStore, keyStorePassword.toCharArray()); 

// Above throws exception: 
// UnrecoverableKeyException: Cannot recover key 

然而,使用密鑰工具,我可以查看2keystore.jks內容像這樣:的KeyManagerFactory無法恢復的關鍵,但它在密鑰工具打開

keytool -list -v -keystore 2keystore.jks | more 
Enter keystore password: mypass 
Keystore type: JKS 
Keystore provider: SUN 

Your keystore contains 3 entries 

Alias name: 
... 

任何想法嘗試加載這個時候可能是什麼問題keystore放入KeyManagerFactory

感謝

+0

您確定您的密鑰庫是您期望它在類路徑中的位置嗎?例如'ksis'不爲null?您可以在加載密鑰庫別名時列出密鑰庫別名嗎? – Bruno 2012-08-10 16:34:46

+0

keystore'ksis'不爲空......它加載。我想我找到了問題...密鑰庫加載了整個密鑰庫的密碼,但KeyManagerFactory需要密鑰庫中包含的密鑰對的密碼不同。 – Cuga 2012-08-10 17:09:30

+1

KMF密碼是保護密鑰本身的密碼,而KeyStore.load(...)使用的密碼保護整個密鑰庫。這些密碼是否有所不同取決於您構建密鑰庫的方式。 – Bruno 2012-08-10 17:34:19

回答

1

原來我不得不指定KeyStore不同的密碼,而不是在KeyManagerFactory

這是我在創建KeyStore文件時犯的一個錯誤。我使用Portecle將我的PKCS#12密鑰轉換爲JKS,它將密碼存儲器中的密鑰對重置爲「密碼」,我在第一次復飛時錯過了這個密碼。

因此,使用Portecle,我能夠將整個KeyStore中包含的密鑰對上的密碼重置爲我期待的值,然後一切正常。

感謝布魯諾

+2

您不需要轉換您的PKCS#12文件以將其用作密鑰庫,只需使用PKCS12作爲密鑰庫類型(在這種情況下,密鑰和存儲的密碼相同)。 – Bruno 2012-08-10 19:59:34

+0

+1有用的信息。我想在這種情況下,將「javax.net.ssl.keyStoreType」屬性設置爲「PKCS12」而不是「JKS」時,還需要指定其他屬性。 – Cuga 2012-08-10 20:22:07

相關問題