默认 SSL 上下文初始化失败:SunX509 KeyManagerFactory 不可用
Default SSL context init failed: SunX509 KeyManagerFactory not available
当我尝试使用 restTemplate 从我在 weblogic 10 上托管的本地应用程序向身份验证服务进行 post 调用时出现异常
我已经尝试了很多事情,比如使用 TLSv1.2 和 java 5(使用 BouncyCastle 提供程序):
- 添加选项 -DUseSunHttpHandler=true
- 安装所需的认证
- 将 bcprov-jdk15on-1.60.jar 添加到 jdk
- 这对 java.security :
security.provider.1=sun.security.provider.Sun
security.provider.2=org.bouncycastle.jce.provider.BouncyCastleProvider
security.provider.3=sun.security.rsa.SunRsaSign
最后我有这个例外:
org.springframework.web.client.ResourceAccessException: I/O error: Default SSL context init failed: SunX509 KeyManagerFactory not available; nested exception is java.net.SocketException: Default SSL context init failed: SunX509 KeyManagerFactory not available
at org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java:453)
at org.springframework.web.client.RestTemplate.execute(RestTemplate.java:401)
at org.springframework.web.client.RestTemplate.postForEntity(RestTemplate.java:302)
...
Caused by: java.net.SocketException: Default SSL context init failed: SunX509 KeyManagerFactory not available
at javax.net.ssl.DefaultSSLSocketFactory.createSocket(SSLSocketFactory.java:163)
at sun.net.www.protocol.https.HttpsClient.afterConnect(HttpsClient.java:372)
at sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.connect(AbstractDelegateHttpsURLConnection.java:166)
at sun.net.www.protocol.https.HttpsURLConnectionImpl.connect(HttpsURLConnectionImpl.java:133)
at org.springframework.http.client.SimpleClientHttpRequest.executeInternal(SimpleClientHttpRequest.java:58)
at org.springframework.http.client.AbstractClientHttpRequest.execute(AbstractClientHttpRequest.java:52)
at org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java:438)
... 22 more
我发现我的配置中遗漏的部分无法成功调用 post :
除了在上面使用 TLSv1.2 之外,我还必须在 JDK 的 java.security 文件中包含它:
security.provider.1=sun.security.provider.Sun
security.provider.2=org.bouncycastle.jce.provider.BouncyCastleProvider
security.provider.3=sun.security.rsa.SunRsaSign
security.provider.4=com.sun.net.ssl.internal.ssl.Provider
security.provider.5=com.sun.crypto.provider.SunJCE
security.provider.6=sun.security.jgss.SunProvider
security.provider.7=com.sun.security.sasl.Provider
然后在测试我的代码时出现此错误:
Caused by: java.lang.ArrayIndexOutOfBoundsException: 64
为了解决这个问题,我添加了 https.cipherSuites 参数,如下所示:
System.setProperty("https.cipherSuites", "SSL_RSA_WITH_3DES_EDE_CBC_SHA");
您可以在启动应用程序时输入:
-Dhttps.cipherSuites="SSL_RSA_WITH_3DES_EDE_CBC_SHA"
PS:注意! https.cipherSuites 在 HttpsURLConnection 中受支持(以防您使用 RestTemplate)
然后就成功了:D
当我尝试使用 restTemplate 从我在 weblogic 10 上托管的本地应用程序向身份验证服务进行 post 调用时出现异常
我已经尝试了很多事情,比如使用 TLSv1.2 和 java 5(使用 BouncyCastle 提供程序):
- 添加选项 -DUseSunHttpHandler=true
- 安装所需的认证
- 将 bcprov-jdk15on-1.60.jar 添加到 jdk
- 这对 java.security :
security.provider.1=sun.security.provider.Sun
security.provider.2=org.bouncycastle.jce.provider.BouncyCastleProvider
security.provider.3=sun.security.rsa.SunRsaSign
最后我有这个例外:
org.springframework.web.client.ResourceAccessException: I/O error: Default SSL context init failed: SunX509 KeyManagerFactory not available; nested exception is java.net.SocketException: Default SSL context init failed: SunX509 KeyManagerFactory not available
at org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java:453)
at org.springframework.web.client.RestTemplate.execute(RestTemplate.java:401)
at org.springframework.web.client.RestTemplate.postForEntity(RestTemplate.java:302)
...
Caused by: java.net.SocketException: Default SSL context init failed: SunX509 KeyManagerFactory not available
at javax.net.ssl.DefaultSSLSocketFactory.createSocket(SSLSocketFactory.java:163)
at sun.net.www.protocol.https.HttpsClient.afterConnect(HttpsClient.java:372)
at sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.connect(AbstractDelegateHttpsURLConnection.java:166)
at sun.net.www.protocol.https.HttpsURLConnectionImpl.connect(HttpsURLConnectionImpl.java:133)
at org.springframework.http.client.SimpleClientHttpRequest.executeInternal(SimpleClientHttpRequest.java:58)
at org.springframework.http.client.AbstractClientHttpRequest.execute(AbstractClientHttpRequest.java:52)
at org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java:438)
... 22 more
我发现我的配置中遗漏的部分无法成功调用 post :
除了在上面使用 TLSv1.2 之外,我还必须在 JDK 的 java.security 文件中包含它:
security.provider.1=sun.security.provider.Sun
security.provider.2=org.bouncycastle.jce.provider.BouncyCastleProvider
security.provider.3=sun.security.rsa.SunRsaSign
security.provider.4=com.sun.net.ssl.internal.ssl.Provider
security.provider.5=com.sun.crypto.provider.SunJCE
security.provider.6=sun.security.jgss.SunProvider
security.provider.7=com.sun.security.sasl.Provider
然后在测试我的代码时出现此错误:
Caused by: java.lang.ArrayIndexOutOfBoundsException: 64
为了解决这个问题,我添加了 https.cipherSuites 参数,如下所示:
System.setProperty("https.cipherSuites", "SSL_RSA_WITH_3DES_EDE_CBC_SHA");
您可以在启动应用程序时输入:
-Dhttps.cipherSuites="SSL_RSA_WITH_3DES_EDE_CBC_SHA"
PS:注意! https.cipherSuites 在 HttpsURLConnection 中受支持(以防您使用 RestTemplate)
然后就成功了:D