我提供了一个名为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/说密码可能我不同的密钥和密钥库。
如果使用Tomcat 6及更早版本,请确保密钥库密码和密钥密码相同。如果使用Tomcat 7及更高版本,请确保它们相同,或者在server. xml
文件中指定了密钥密码。
您的应用程序/配置中定义的私钥密码不正确。首先尝试通过更改为另一个密码来验证私钥密码,如下所示:
keytool -keypasswd -new changeit -keystore cacerts -storepass changeit -alias someapp -keypass password
上面的示例将密码从密码更改为changeit。如果私钥密码是密码,则此命令将成功。
为了避免出现无法恢复密钥
异常,我必须将Java加密扩展(JCE)无限强度管辖权策略文件应用于正在运行我的应用程序的Java的安装。这些文件的版本8可以在这里找到,或者最新版本应该在此页面上列出。下载包括一个解释如何应用策略文件的文件。
自JDK8u151以来,不需要添加策略文件。相反,JCE管辖策略文件由名为cryp. policy
的安全属性控制。将其设置为无限制
,允许JDK使用无限制的密码。作为链接到上述状态的发行说明,它可以通过Security.setProperty()
或通过java.security
文件进行设置。java.security
文件也可以通过将-Djava.security.properties=my_security.properties
添加到启动程序的命令中附加到文件中,如下所述。
由于JDK8u161,默认情况下启用无限加密。