96

我得到了一个名为 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/这表示密码可能与我不同密钥和密钥库。

4

6 回答 6

122

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

于 2014-06-01T10:40:49.360 回答
77

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

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

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

于 2013-10-23T03:15:33.017 回答
10

为了不出现Cannot recover key异常,我必须将 Java Cryptography Extension (JCE) Unlimited Strength Jurisdiction Policy Files 应用于运行我的应用程序的 Java 安装。可以在此处找到这些文件的第 8 版,或者应在此页面上列出最新版本。下载包含一个文件,该文件解释了如何应用策略文件。


JDK 8u151开始,不需要添加策略文件。相反,JCE 管辖策略文件由名为crypto.policy. 将其设置为unlimited允许 JDK 使用无限制的加密。作为链接到上述状态的发行说明,它可以通过文件设置Security.setProperty()或通过java.security文件设置。该java.security文件也可以通过添加-Djava.security.properties=my_security.properties到启动程序的命令来附加,详见此处


由于JDK 8u161默认启用无限加密。

于 2016-02-10T13:55:56.553 回答
5

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

于 2015-12-28T12:10:51.273 回答
4

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

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

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

keytool error: java.security.UnrecoverableKeyException: Cannot recover key
于 2020-02-08T13:47:54.663 回答
0

有时这似乎无缘无故地发生。我也面临同样的问题,并尝试了所有方法,如 Keytool explorer 等。

最终要求谷歌重置密钥,因为我启用了谷歌播放签名。这是一个很好的建议。

https://support.google.com/googleplay/android-developer/answer/9842756?hl=en

于 2021-03-24T15:04:25.327 回答