2012-08-10 26 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

相关问题