一、异常信息:

Remote host closed connection during handshake

Caused by: java.io.EOFException: SSL peer shut down incorrectly

二、场景:系统用HttpClient通过https从外部系统获取数据

三、原因:客户端和服务端支持的https协议版本不一致,项目是老项目用的jdk1.6_045,没法支持服务端协议版本

JDK中对 HTTPS 版本的支持情况

JDK 6
  • SSL v3
  • TLS v1(默认)
  • TLS v1.1(JDK6 update 111 及以上)
JDK 7
  • SSLv3
  • TLS v1(默认)
  • TLS v1.1
  • TLS v1.2
JDK 8
  • SSL v3
  • TLS v1
  • TLS v1.1
  • TLS v1.2(默认)

四、解决方法

网上找到两种解决方法

  • 设置协议版本
System.setProperty("https.protocols", "TLSv1,TLSv1.1,TLSv1.2");
  • 服务端设置对客户端支持

五、实际方案

和接口提供方沟通后,发现服务端没有使用nginx,也不是Java服务,是一个Oracle中间件什么的,具体不清楚,总之服务端也没法兼容我们。

最后在老系统调用jdk1.8的服务,jdk1.8的服务再调用外系统接口。

六、参考文章

  • https://stackoverflow.com/questions/28908835/ssl-peer-shut-down-incorrectly-in-java
  • https://emacsist.github.io/2017/03/02/https.protocols%E5%9C%A8java%E4%B8%AD%E7%9A%84%E4%BD%BF%E7%94%A8/
  • https://blog.csdn.net/sumengnan/article/details/112056484