java.security.UnrecoverableKeyException:由造成无法恢复的关键

2019-08-22 05:50发布

我与一个名为ABCC_client.store一个JKS密钥库提供。 当我导入此密钥库cacerts的,并尝试连接它说没有这样的算法错误。 PFA堆栈跟踪

    Caused by: java.security.NoSuchAlgorithmException: Error constructing implementation (algorithm: Default, provider: SunJSSE, class:   com.sun.net.ssl.internal.ssl.DefaultSSLContextImpl)
    at java.security.Provider$Service.newInstance(Provider.java:1245)
    at sun.security.jca.GetInstance.getInstance(GetInstance.java:220)
    at sun.security.jca.GetInstance.getInstance(GetInstance.java:147)
    at javax.net.ssl.SSLContext.getInstance(SSLContext.java:125)
    at javax.net.ssl.SSLContext.getDefault(SSLContext.java:68)
    at javax.net.ssl.SSLSocketFactory.getDefault(SSLSocketFactory.java:102)
    at org.apache.axis.components.net.JSSESocketFactory.initFactory(JSSESocketFactory.java:61)
    at org.apache.axis.components.net.JSSESocketFactory.create(JSSESocketFactory.java:79)
    ... 32 more
Caused by: 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.sun.net.ssl.internal.ssl.SunX509KeyManagerImpl.<init>(SunX509KeyManagerImpl.java:113)
    at com.sun.net.ssl.internal.ssl.KeyManagerFactoryImpl$SunX509.engineInit(KeyManagerFactoryImpl.java:48)
    at javax.net.ssl.KeyManagerFactory.init(KeyManagerFactory.java:239)
    at com.sun.net.ssl.internal.ssl.DefaultSSLContextImpl.getDefaultKeyManager(DefaultSSLContextImpl.java:170)
    at com.sun.net.ssl.internal.ssl.DefaultSSLContextImpl.<init>(DefaultSSLContextImpl.java:40)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:513)
    at java.lang.Class.newInstance0(Class.java:355)
    at java.lang.Class.newInstance(Class.java:308)
    at java.security.Provider$Service.newInstance(Provider.java:1221)
    ... 39 more

但是,如果使用这个密钥库独立,即不增加它的cacerts它的工作原理。

一些谷歌搜索导致我http://joewlarson.com/blog/2009/03/25/java-ssl-use-the-same-password-for-keystore-and-key/它说,密码可能我不同钥匙和密钥库。

Answer 1:

如果使用的是Tomcat 6和更早版本,确保密钥库密码和密钥密码相同。 如果使用的是Tomcat 7及更高版本,确保它们是相同或密钥密码在指定server.xml文件。



Answer 2:

在您的应用程序/ config中定义的私钥密码不正确。 首先尝试通过改变到另一个如下验证私钥密码:

keytool -keypasswd -new changeit -keystore cacerts -storepass changeit -alias someapp -keypass password

上面的例子中改变从密码的密码的changeit。 此命令会成功,如果私钥密码是密码。



Answer 3:

为了在不具备Cannot recover key例外,我不得不把Java加密扩展(JCE)无限强度权限策略文件适用于正在运行我的应用程序的Java的安装。 这些文件的版本8,可以发现这里还是最新的版本应该上列出该页面 。 下载内容包括说明如何应用该策略文件的文件。


由于JDK 8u151没有必要添加的政策文件。 取而代之的是JCE仲裁策略文件被称为安全属性控制crypto.policy 。 设置,以unlimited使用允许由JDK使用无限的密码。 作为发行说明链接到上述状态下,其可以通过设置Security.setProperty()经由或java.security文件。 的java.security文件也可以通过添加附加到-Djava.security.properties=my_security.properties到命令详见启动程序这里 。


由于JDK 8u161无限的密码是默认启用。



Answer 4:

我有同样的错误,当我们使用64位版本的OpenSSL进口的关键到密钥库中,这是构建。 当我们遵循同样的程序导入密钥到密钥库中,这是使用32位版本的OpenSSL一切构建了罚款。



文章来源: Caused by: java.security.UnrecoverableKeyException: Cannot recover key