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
?
感谢
您确定您的密钥库是您期望它在类路径中的位置吗?例如'ksis'不为null?您可以在加载密钥库别名时列出密钥库别名吗? – Bruno 2012-08-10 16:34:46
keystore'ksis'不为空......它加载。我想我找到了问题...密钥库加载了整个密钥库的密码,但KeyManagerFactory需要密钥库中包含的密钥对的密码不同。 – Cuga 2012-08-10 17:09:30
KMF密码是保护密钥本身的密码,而KeyStore.load(...)使用的密码保护整个密钥库。这些密码是否有所不同取决于您构建密钥库的方式。 – Bruno 2012-08-10 17:34:19