天天看点

java.security.UnrecoverableKeyException: Cannot recover key

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

java.security.UnrecoverableKeyException: Cannot recover key

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 生成本地数字证书

java.security.UnrecoverableKeyException: Cannot recover key

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"  

 运行结果:

java.security.UnrecoverableKeyException: Cannot recover key

 说明:keystore的密码是abcdefg,通过-storepass 指定。

java 代码如下:

java.security.UnrecoverableKeyException: Cannot recover key

@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

java.security.UnrecoverableKeyException: Cannot recover key

密码一和 密码二必须相同,否则,启动tomcat 时会报错。