2013-04-12 134 views
61

我提供了一个名为ABCC_client.store的jks密钥库。当我将这个密钥库导入cacerts并尝试连接它时,表示没有这样的算法错误。 PFA堆栈跟踪导致:java.security.UnrecoverableKeyException:无法恢复密钥

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/其中说,密码可能不同的密钥和密钥库。

+0

有点代码可以查看所谓的如果可能? – Bruno

+0

我正在尝试从代码中调用Web服务方法.. AxisFault faultCode:{http://schemas.xmlsoap.org/soap/envelope/}Server.userException faultSubcode: faultString:java.net.SocketException :java.security.NoSuchAlgorithmException:构造实现时出错(算法:默认,提供程序:SunJSSE,类:com.sun.net.ssl.internal.ssl.DefaultSSLContextImpl) –

+2

可能在此复制的是类似的[question](http:///stackoverflow.com/questions/1321557/can-not-get-key-from-keystore)与asnwer。 – icrovett

回答

57

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

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

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

+1

虽然我没有使用这个问题的答案。这有助于验证密钥库文件,存储密码,别名/密钥和密钥密码。 – Russ

+0

请记住,执行此命令后,您将更改密钥库密码。您将不得不将密码设回原来的密码。 – gersonZaragocin

+0

实际上,只需指定'-keypasswd -keystore storefile -alias somealias'并在提示中输入其他所有内容即可。 –

85

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

+9

这是事实。参考https://tomcat.apache.org/tomcat-6.0-doc/ssl-howto.html#Prepare_the_Certificate_Keystore – Atharva

+1

相关报价:最后,系统会提示您输入*密码*,该密码专门用于此证书(而不是存储在同一密钥库文件中的任何其他证书)。您**必须**在此处使用与密钥库密码本身相同的密码。这是Tomcat实施的限制。 (目前,'keytool'提示符会告诉你,按下ENTER键会自动执行此操作。) –

+0

我有这个问题w JMeter(https)因为Java密钥库和密钥密码不同。 Ref https://stackoverflow.com/questions/2889238/keystore-change-passwords?noredirect=1&lq=1。更改密钥来解决问题。很好的帮助!谢谢。 – Rishi

5

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

+2

上述错误的根本原因是java.security.UnrecoverableKeyException:Can not恢复密钥。其原因可能是上面提到的错误密码,也可能是使用64位OpenSSL实现构建的密钥库。所以我认为我的答案是另一种可能的解决方案它在相同的错误情况下帮助我,所以我在这里提供了解决方案。 – Heimi

+0

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

+0

Thks for you answer。从OpenESB 3.05调用https webservices时,我面临同样的问题。我按照你的指示,再次用32位的OpenSS生成jks文件,它工作正常 –

5

为了不存在Cannot recover key异常,我必须将Java密码扩展(JCE)无限强度管辖策略文件应用于正在运行我的应用程序的Java的安装。可以找到这些文件的第8版here或最新版本应在this page上列出。下载包括一个文件,解释如何应用策略文件。


由于JDK 8u151没有必要添加策略文件。相反,JCE辖区政策文件由名为crypto.policy的安全属性控制。将其设置为unlimited,允许JDK使用无限加密技术。由于发布说明链接到上述状态,因此可以通过Security.setProperty()或通过java.security文件进行设置。 java.security文件也可以添加-Djava.security.properties=my_security.properties作为详细的here启动程序的命令。


既然JDK 8u161默认启用无限加密。

+0

我看到这个错误,尽管安装了策略文件的jar包。 – Adam

+0

@Adam我的解决方案适用于特定情况,可能与您遇到的情况有所不同。不过,我添加了一个更新以反映JDK 8u151中发生的更改。 – WhiteKnight

相关问题