TLS版本不适配导致Connection reset问题
问题:服务器调外部公司S的接口一直失败,报错 connection reset ,但调其他外部公司的接口却Ok
,本地开发环境调S的接口也可以调通。
java.net.SocketException: Connection reset
at java.net.SocketInputStream.read(SocketInputStream.java:196)
at java.net.SocketInputStream.read(SocketInputStream.java:122)
at sun.security.ssl.InputRecord.readFully(InputRecord.java:442)
at sun.security.ssl.InputRecord.read(InputRecord.java:480)
at sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:927)
at sun.security.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1312)
at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1339)
at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1323)
at sun.net.www.protocol.https.HttpsClient.afterConnect(HttpsClient.java:563)
at sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.connect(AbstractDelegateHttpsURLConnection.java:185)
at sun.net.www.protocol.http.HttpURLConnection.getOutputStream(HttpURLConnection.java:1091)
at sun.net.www.protocol.https.HttpsURLConnectionImpl.getOutputStream(HttpsURLConnectionImpl.java:250)
问题排查:
1.首先排查服务器联通问题
步骤1:操作telnet s域名 结论:可以telnet通
步骤2:curl s对应域名联通测试接口 结论:curl报错 ssl(35)
最后网上找文章(http://blog.studygolang.com/2015/10/curl-35-ssl-connect-error/)排查后是nss的问题
解决ssl不通问题:运维在服务器执行命令 yum update nss,然后再测试,可以联通对方服务器了但调对方接口还是报错 connection reset
步骤3:继续查原因,最后找到篇文章:https://www.jianshu.com/p/c640652886d4 说是cs两端tls版本不适配导致的,jvm启动加参数 -Djavax.net.debug=all 打印网络连接信息 本地能调通的版本是tlsv1.2,服务器是tlsv1,S公司运维说他们那边tls只支持v1.2,再看服务器,使用的是jdk7,将jdk7升级为8后,重新编译,调接口,成功!tls显示版本v1.2.问题解决。