一、异常信息:
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