引起:java.security.UnrecoverableKeyException:无法恢复密钥

Mri*_*jee 78 java ssl jks ssl-certificate

我提供了一个名为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
Run Code Online (Sandbox Code Playgroud)

但是,如果我独立使用这个密钥库,即不将它添加到cacerts,它就可以工作.

一些谷歌搜索引导我到http://joewlarson.com/blog/2009/03/25/java-ssl-use-the-same-password-for-keystore-and-key/这说明密码可能与我有所不同密钥和密钥库.

小智 105

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

  • 这是真的.参考https://tomcat.apache.org/tomcat-6.0-doc/ssl-howto.html#Prepare_the_Certificate_Keystore (9认同)
  • 相关引用:最后,将提示您输入*密钥密码*,这是专用于此证书的密码(与存储在同一密钥库文件中的任何其他证书相反)。您必须在这里使用与密钥库密码本身相同的密码。这是Tomcat实现的限制。(当前,“ keytool”提示会告诉您,按ENTER键会自动为您执行此操作。) (2认同)
  • @AndreaLigios好点,相关引用:最后,系统将提示您输入*密钥*,这是专门用于此证书的密码(与存储在同一密钥库文件中的任何其他证书相对).`keytool`提示符会告诉您按ENTER键会自动使用与密钥库相同的密码密码.您可以自由使用相同的密码或选择自定义密码.**如果为密钥库密码选择不同的密码,则还需要在`server.xml`配置文件中指定自定义密码.** (2认同)

Ume*_*ari 67

您的app/config中定义的私钥密码不正确.首先尝试通过更改为另一个密码来验证私钥密码,如下所示:

keytool -keypasswd -new changeit -keystore cacerts -storepass changeit -alias someapp -keypass password
Run Code Online (Sandbox Code Playgroud)

上面的示例将密码从password更改为changeit.如果私钥密码是密码,则此命令将成功.

  • 虽然我没有在这个问题上使用这个答案.它有助于验证密钥库文件,存储密码,别名/密钥和密钥密码. (2认同)

Whi*_*ght 7

为了没有Cannot recover key例外,我不得不将Java Cryptography Extension(JCE)Unlimited Strength Jurisdiction Policy Files应用于运行我的应用程序的Java的安装.这些文件的版本8可在此处找到,或者此页面上应列出最新版本.下载包含一个文件,说明如何应用策略文件.


JDK 8u151开始,没有必要添加策略文件.相反,JCE管辖区域策略文件由名为的Security属性控制crypto.policy.将其设置为unlimited允许JDK使用无限加密.作为与上述状态相关联的发行说明,可以Security.setProperty()通过java.security文件或通过文件进行设置.该java.security文件还可以通过添加附加-Djava.security.properties=my_security.properties到命令详见启动程序在这里.


由于默认情况下启用了JDK 8u161无限加密.

  • 尽管安装了策略文件 jar,我还是看到了这个错误。 (3认同)

小智 6

通过运行以下命令检查您使用的密码是否正确

keytool -keypasswd -new temp123 -keystore awsdemo-keystore.jks -storepass temp123 -alias movie-service -keypass changeit
Run Code Online (Sandbox Code Playgroud)

如果您收到以下错误,则说明您的密码错误

keytool error: java.security.UnrecoverableKeyException: Cannot recover key
Run Code Online (Sandbox Code Playgroud)

  • 如果我使用任何其他密码,我会收到错误“密钥库被篡改,或密码不正确”。如果我使用密码,我知道它是正确的,我会收到错误“无法恢复密钥”。所以我认为你的说法是不正确的,至少就我而言是这样。其他原因可能会导致错误 (7认同)

Hei*_*imi 5

当我们将密钥导入使用64位OpenSSL版本构建的密钥库时,我遇到了同样的错误.当我们按照相同的过程将密钥导入到使用32位OpenSSL版本构建的密钥库时,一切都很顺利.

  • 上面错误的根本原因是java.security.UnrecoverableKeyException:无法恢复密钥.其原因可能是如上所述的假密码,也可能是使用64位OpenSSL实现的密钥库构建.所以我认为我的答案是另一种可能的解决方案 它在同样的错误情况下帮助了我,所以我在这里提供了解决方案. (2认同)