【问题标题】:Default SSL context init failed: SunX509 KeyManagerFactory not available默认 SSL 上下文初始化失败:SunX509 KeyManagerFactory 不可用
【发布时间】:2019-09-03 13:57:34
【问题描述】:

当我尝试使用 restTemplate 从托管在 weblogic 10 上的本地应用程序到身份验证服务进行后调用时出现异常

我已经尝试了很多方法,例如将 TLSv1.2 与 java 5(使用 BouncyCastle 提供程序)一起使用:

  1. 添加选项 -DUseSunHttpHandler=true
  2. 安装所需的认证
  3. 将 bcprov-jdk15on-1.60.jar 添加到 jdk
  4. 这是 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

【问题讨论】:

  • Weblogic 10 是 12 年前发布的,Java 5 是 10 年前最后一次公开发布的。像这样的问题正是您需要从如此古老的技术堆栈中继续前进的原因。我知道你可能无法决定...
  • 并且稍微有用一点:This mailing list thread 似乎是由设法使它工作的人(不是专门针对 WebLogic,但在 Java 5 上默认启用 TLSv1.2)。
  • 我完全同意@JoachimSauer 的观点,无论如何,该应用程序将在几个月内死掉,但在此期间仍然需要完成这个小调用。毕竟,除此之外,我还在使用最新技术
  • 你运行 WebLogic 的操作系统是什么?

标签: spring ssl-certificate resttemplate weblogic-10.x java-5


【解决方案1】:

我找到了我的配置中遗漏的部分来成功我的帖子调用:

除了使用上面的 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:注意! HttpsURLConnection 支持 https.cipherSuites(如果你使用 RestTemplate)

然后它就起作用了:D

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-07-08
    • 1970-01-01
    • 2017-03-17
    • 2014-09-13
    • 2015-09-09
    • 2011-11-23
    • 2016-03-08
    相关资源
    最近更新 更多