博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[工作笔记]JDK版本不同导致的SSL异常
阅读量:4697 次
发布时间:2019-06-09

本文共 1082 字,大约阅读时间需要 3 分钟。

前言

遇到这个问题得说一下笔者的开发环境,笔者所在公司,平时开发用的web容器是jboss,使用的JDK是oracle的JDK,但是测试和生产环境用的是WAS,JDK用的是IBM的JDK,由于项目的不同,测试环境所安装的web容器和JDK版本都并不相同。这个也是笔者遇到问题的原因所在。

笔者在公司负责一个项目的开发,该项目有一个功能需要调用到公司另一个项目的接口,而那个项目提供的接口是基于HTTPS的,所以笔者在进行调用的时候,使用了JDK提供的SSL连接进行了请求。

SSLContext.getInstance(“SSL”);

该代码,笔者在自己本机的JBoss上测试过,并没有问题。可是,发布到was里面之后,程序一直没法成功调用接口,通过日志追踪后,发现程序在服务器运行的时候后台报了异常,该异常如下:

javax.net.ssl.SSLHandshakeException: Remote host closed connection during handshank

握手失败,网上有人说,该异常是因为证书的原因,可是笔者尝试过后发现,该说法并不对应笔者所描述的场景,最后在同事的帮助下找到了原因。

该问题出现的原因在于SSL协议的版本不同。发现问题之后,笔者分析了一下具体情况。由于项目的原因,笔者现在用的JDK版本还是1.5的,同时,笔者去调的项目也是个老项目,用的JDK版本也是1.5的。所以当笔者通过本地测试的时候,SSL的请求方和接收方的版本是一致的,并没有问题。可是由于项目的扩容,笔者项目的测试环境前阵子进行了迁移,新的测试环境采用的是IBM的JDK1.6。因为JDK版本不同,默认采用的握手协议不同,所以导致两边程序进行握手的时候会失败。

仔细查询了一下资料后发现,原来oracle的JDK默认采用的是TLSv1和TLSv2进行尝试握手连接的,而IBM新的JDK采用的是SSLv3,新老版本还不一样。

详细的资料地址:

该问题的解决方法有两个:

方法一:修改获取SSL连接的的代码(笔者使用的方法,简单)

SSLContext.getInstance(“TLS”);

方法二:更新IBM的JDK

在上面给出的链接中,其实IBM已经意识到自己的问题,也给出了另外一个补丁,据说更新后就能成功(笔者没尝试过( ̄▽ ̄)”)

 

本文章同步发布至 http://blog.e65535.com/2017/01/15/ssl-excepiton/

转载于:https://www.cnblogs.com/Seanit/p/6286531.html

你可能感兴趣的文章
HBase工程师线上工作经验总结----HBase常见问题及分析
查看>>
FICO_月末关帐
查看>>
获取包含中文字符串的长度、截取包含中文的字符串
查看>>
unity编辑器学习,创建自己的窗口
查看>>
Microsoft Build 2015
查看>>
使用EntityFrameWork 5.0增删查改(&分页,连表)
查看>>
ios block常见的错误(三)——并发编程的block引用
查看>>
Arcgis Server发布的带有透明度的地图服务,调用时不显示透明度问题
查看>>
Android Loader详解(官方文档翻译)
查看>>
[Java]ArrayList源码分析
查看>>
Mybatis中javaType和jdbcType对应关系
查看>>
Master Concept provides Professional Service for server and storage virtualization.
查看>>
客户端javascript笔记
查看>>
工作笔记——前端分页数据回显
查看>>
test小结
查看>>
Apache 调用不同的 PHP 版本
查看>>
第三周总结
查看>>
流程控制与数组
查看>>
python循环导入的解决方案
查看>>
AngularJS中选择样式
查看>>