使用keytool 工具生成keystore文件,然后通过java 获取私钥privatekey 时,报错:

java.security.unrecoverablekeyexception: cannot recover key
at sun.security.provider.keyprotector.recover(keyprotector.java:311)
at sun.security.provider.javakeystore.enginegetkey(javakeystore.java:121)
at sun.security.provider.javakeystore$jks.enginegetkey(javakeystore.java:38)
at java.security.keystore.getkey(keystore.java:763)
at com.jn.test.testca.test_01(testca.java:18)
at sun.reflect.nativemethodaccessorimpl.invoke0(native method)
at sun.reflect.nativemethodaccessorimpl.invoke(nativemethodaccessorimpl.java:39)
at sun.reflect.delegatingmethodaccessorimpl.invoke(delegatingmethodaccessorimpl.java:25)
at java.lang.reflect.method.invoke(method.java:597)
具体操作如下
使用keystool 生成本地数字证书

keytool -genkeypair -keyalg rsa -keysize 2048 -sigalg sha1withrsa -validity 36000 -alias localhost -storepass abcdefg -keystore zlex.keystore -dname "cn=localhost, ou=zlex,o=zlex, l=bj, st=bj, c=cn"
运行结果:
说明:keystore的密码是abcdefg,通过-storepass 指定。
java 代码如下:

@test
public void test_01() throws exception {
string keystorepath="d:\\temp\\a\\a\\ca\\zlex.keystore";
string password="abcdefg";
// 获得密钥库
keystore ks = getkeystore(keystorepath, password);
// 获得私钥
privatekey privatekey = (privatekey) ks.getkey("localhost", password.tochararray());
system.out.println(privatekey);
}
/**
* 获得keystore
*
* @param keystorepath
* 密钥库路径
* @param password
* 密码
* @return keystore 密钥库
*/
private static keystore getkeystore(string keystorepath, string password)
throws exception {
// 实例化密钥库
keystore ks = keystore.getinstance(keystore.getdefaulttype());
// 获得密钥库文件流
fileinputstream is = new fileinputstream(keystorepath);
// 加载密钥库
ks.load(is, password.tochararray());
// 关闭密钥库文件流
is.close();
return ks;
运行上述java 代码时,报错:java.security.unrecoverablekeyexception: cannot recover key
到底是什么原因呢?
原因:keystore 密码和主密码不同。
解决方法:keystore 密码和主密码使用相同的密码。
(2)tomcat使用keystore文件启动报错
若keystore 密码和主密码不同,启动tomcat时也会报错
命令:keytool -genkey -alias tomcat -keyalg rsa -keysize 1024 -validity 365 -keystore tomcat22.keystore
生成的文件 就是:tomcat22.keystore
密码一和 密码二必须相同,否则,启动tomcat 时会报错。