原因:java.security.UnrecoverableKeyException:无法恢复密钥


84

我提供了一个名为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/,它说密码可能与我不同密钥和密钥库。


一些代码,看看可能的话是什么?
布鲁诺

我试图从code..AxisFault Fault代码中调用Web服务方法:{ schemas.xmlsoap.org/soap/envelope } Server.userException faultSubcode:faultString:java.net.SocketException异常:java.security.NoSuchAlgorithmException:错误施工实现(算法:默认,提供程序:SunJSSE,类:com.sun.net.ssl.internal.ssl.DefaultSSLContextImpl)
Mrinal Bhattacharjee

2
可能重复,这里是一个类似的问题,但有一个问题
icrovett

否,我的问题是,如果我们将系统属性设置为使用该密钥库,那么密钥库将起作用。但是,如果我们将密钥库加载到jvm的默认值中,即cacerts,它不会工作。它说坏证书..
Mrinal尔吉

Answers:


109

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



2
相关引用:最后,将提示您输入密钥password,这是专用于此证书的密码(与存储在同一密钥库文件中的任何其他证书相反)。您在此处必须使用与密钥库密码本身相同的密码。这是Tomcat实现的限制。(当前,keytool提示将告诉您,按ENTER键会自动为您执行此操作。)
曼上尉

我遇到了这个问题,因为JMeter(https)coz Java密钥库和密钥密码不同。参阅stackoverflow.com/questions/2889238/…。更改密钥密码即可解决问题。很大的帮助!谢谢。
Rishi

@CaptainMan仅在Tomcat6中适用,而从Tomcat7开始则不是
Andrea Ligios

2
@AndreaLigios的要点,相关引号:最后,系统会提示您输入密钥密码,该密码是专用于此证书的密码(与存储在同一密钥库文件中的任何其他证书相反)。该keytool提示会告诉你,按ENTER键会自动使用相同的密码密钥作为密钥库。您可以自由使用相同的密码或选择自定义密码。如果选择与密钥库密码不同的密码,则还需要在server.xml配置文件中指定自定义密码。
上尉曼

73

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

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

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


2
虽然我没有针对这个问题使用这个答案。这对于验证密钥库文件,存储密码,别名/密钥和密钥密码很有帮助。
拉斯(Russ)

1
请记住,执行此命令后,您将更改密钥库密码。您必须将密码设置回原始密码。
gersonZaragocin

实际上,只需指定公正-keypasswd -keystore storefile -alias somealias并在提示中输入其他所有内容就足够了。
Andrey Regentov '16

运行此代码时,出现以下错误-"keytool error: java.security.UnrecoverableKeyException: Cannot recover key"有什么方法可以检查别名密钥密码或在不知道旧密码的情况下对其进行更改?
Kavin Raju S

10

为了没有Cannot recover key例外,我必须将Java密码学扩展(JCE)无限强度管辖权策略文件应用于运行我的应用程序的Java安装。这些文件的版本8可以在这里找到或者最新版本应该在此页面上列出。该下载文件包含一个说明如何应用策略文件的文件。


JDK 8u151开始,无需添加策略文件。取而代之的是,JCE管辖权策略文件由称为的安全性属性控制crypto.policy。设置为unlimitedwith允许JDK使用无限的加密。由于发行说明链接到上述状态,因此可以通过Security.setProperty()或通过java.security文件进行设置。该java.security文件还可以通过添加-Djava.security.properties=my_security.properties到命令中来追加,以启动程序,如此处所述


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


3
尽管已安装策略文件jar,但仍看到此错误。
亚当

@Adam我的解决方案是针对特定情况的,可能与您遇到的情况有所不同。但是,我添加了更新以反映JDK 8u151中发生的更改。
WhiteKnight

5

将密钥导入使用64位OpenSSL版本构建的密钥库中时,我遇到了相同的错误。当我们按照相同的步骤将密钥导入到使用32位OpenSSL版本构建的密钥库中时,一切正常。


3
上面的错误的根本原因是java.security.UnrecoverableKeyException:无法恢复密钥。这样做的原因可能是如上所述的错误密码,也可能是使用64位OpenSSL实现的密钥库构建。因此,我认为我的答案是另一种可能的解决方案。它在遇到同样的错误情况时对我有所帮助,因此在此提供了解决方案。
Heimi 2015年

openssl不会创建Java密钥库文件。你能澄清一下吗?
Aled

谢谢你的回答。调用https webservices表单OpenESB 3.05时遇到相同的问题。我按照您的指示,并与32位实现OpenSS的再次生成的JKS文件,它工作正常
马蒂PàmiesSolà酒店

2

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

keytool -keypasswd -new temp123 -keystore awsdemo-keystore.jks -storepass temp123 -alias movie-service -keypass changeit

如果您遇到以下错误,则您的密码错误

keytool error: java.security.UnrecoverableKeyException: Cannot recover key
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.