java.security.UnrecoverableKeyException: Cannot recover key 博客分类: JavaJava Web keytoolca证书获取私钥数字证书
程序员文章站
2024-02-24 19:59:28
...
(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://*.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 时会报错。
上一篇: java判断回文数示例分享