场景:使用httpclient调用供应商的接口,我自己电脑上运行没问题,提交代码后,同事拉取调用报错
报错:
javax.net.ssl.SSLException: Received fatal alert: protocol_version at sun.security.ssl.alerts.getSSLException(alerts.java:208) at sun.security.ssl.alerts.getSSLException(alerts.java:154) at sun.security.ssl.SSLSocketImpl.recvalert(SSLSocketImpl.java:1959) at sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:1077) 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 org.apache.http.conn.ssl.SSLSocketFactory.connectSocket(SSLSocketFactory.java:533)
原因:原来是jar版本问题,项目使用的httpclient版本为4.3.2,不支持jdk1.7。我电脑使用的是jdk1.8,但是服务器其实使用的jdk1.7,所以我电脑上跑就没问题,同事电脑上就报错。
解决方案:
由于jar包不是我一个人用,所以没改版本。而使用jdk自带的URLConnection(项目很多地方都用的这个。。。),但是又出了一个问题:
javax.net.ssl.SSLException: Received fatal alert: protocol_version at sun.security.ssl.alerts.getSSLException(alerts.java:208) ~[?:1.7.0_67] at sun.security.ssl.alerts.getSSLException(alerts.java:154) ~[?:1.7.0_67] at sun.security.ssl.SSLSocketImpl.recvalert(SSLSocketImpl.java:1959) ~[?:1.7.0_67] at sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:1077) ~[?:1.7.0_67] at sun.security.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1312) ~[?:1.7.0_67] at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1339) ~[?:1.7.0_67] at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1323) ~[?:1.7.0_67] at sun.net.www.protocol.https.HttpsClient.afterConnect(HttpsClient.java:563) ~[?:1.7.0_67]
原因:还是jdk的问题,jdk1.7默认使用TLSv1.1。但是供应商和我这边的不一样;如果他们用的是jdk1.8,则他们那边用的是TLSv1.2。
解决方法:手动设置TLS;博客
SSLContext sslContext = SSLContext.getInstance("TLSv1.2");
sslContext.init(null,null,null);
SSLContext.setDefault(sslContext);



