(1)Java代码通过keystore文件获取私钥报错
使用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 密码和主密码使用相同的密码。
详情请参考:http://stackoverflow.com/questions/4926290/java-keystore-and-password-settings
(2)tomcat使用keystore文件启动报错
若keystore 密码和主密码不同,启动tomcat时也会报错
命令:keytool -genkey -alias tomcat -keyalg RSA -keysize 1024 -validity 365 -keystore tomcat22.keystore
生成的文件 就是:tomcat22.keystore
密码一和 密码二必须相同,否则,启动tomcat 时会报错。