龙空技术网

由于jdk版本的原因影响https请求,有人知道为什么吗

怀揣梦想的闭眼听风 1474

前言:

现在各位老铁们对“域名tls”大约比较珍视,朋友们都想要剖析一些“域名tls”的相关资讯。那么小编同时在网络上汇集了一些有关“域名tls””的相关文章,希望各位老铁们能喜欢,你们一起来学习一下吧!

前言:项目中对接了OPPO的API,来获取OPPO账户一些数据,运行快一年了,也没有发现什么问题。最近发现执行时间很长,原来几秒就能完成的,现在至少的几十秒才能完成,查看后台日志发现频繁的出现SSL错误。如图:

错误日志

由于是调用API,所以必须要设置重发,时间间隔为3秒,重发5次,所以时间会大大加长。既然找到原因,就赶紧找OPPO那边的技术吧。之后就是一起排查问题,后来发现其他几家公司也是会报这种错误。网上百度了下这个错误的原因,提示是安全协议的问题,正在使用的协议和主机接受的协议不一致导致。

那么为什么会出现安全协议不一样的问题,根据域名查看下协议

协议

发现是TLSv1.2,那么就查看下TLSv1.2协议吧,百度到这个图片

支持情况

很明显 因为jdk1.7默认支持的TLS是v1 ,jdk1.8默认支持的是v1.2。我们这几家的确是用的jdk1.7,当时OPPO的解决方案是让升级jdk,其他几家公司升级了,但是我没有,因为服务器里还有别的项目而且是已经正式使用的,绝对不能这么干,还有之前的项目都是基于1.7规范写的,比如List<String> list = new ArratList<>(),在1.7是不会报错的,但是在jdk1.8中必须的写成List<String> list = new ArrayList<String>(),不然就报错(这个问题在eclispe中会报错,可能是eclispe哪个地方设置不对,但是在IDEA中不报错,公司用的都是eclipse)。我只能通过其他的办法解决了。继续百度。

我的eclispe是的确报错的

总结出来几种方案:

①、在jdk1.7客户端代码中指定使用的协议System.setProperty("https.protocols", "TLSv1.2")或System.setProperty("jdk.tls.client.protocols", "TLSv1.2")。注意,该方法有时候会莫名的失效,原因未知。

②、在VM参数中设置-Dhttps.protocols=TLSv1.2或-Djdk.tls.client.protocols=TLSv1.2。注意,该方法有时候会莫名的失效,原因未知。

③、使用HttpClient设置协议。

最后我采用的第三种,因为我本来就是通过HttpClient去写的。设置代码如下:

httpclient

运行了几天,至今未发现再次报出SSL错误。

标签: #域名tls #idea配置jdk后为什么不能用