TLS协议与JDK版本之间微妙的关系
日期: 2018-12-27 分类: 跨站数据测试 258次阅读
TLS协议与JDK版本之间微妙的关系
首先想知道TLS协议与JDK版本之间微妙的关系,就必须知道什么是TLS协议?
维基百科是这样说的:
传输层安全性协定(英语:Transport Layer Security,缩写作TLS),及其前身安全套接层(Secure Sockets Layer,缩写作SSL)是一种安全协议,目的是为网际网路通信提供安全及数据完整性保障。网景公司(Netscape)在1994年推出首版网页浏览器,网景领航员时,推出HTTPS协定,以SSL进行加密,这是SSL的起源。IETF将SSL进行标准化,1999年公布第一版TLS标准文件。随后又公布RFC 5246 (2008年8月)与RFC 6176(2011年3月)。在浏览器、电子邮件、即时通讯、VoIP、网路传真等应用程式中,广泛支持这个协定。主要的网站,如Google、Facebook等也以这个协定来建立安全连线,传送资料。目前已成为互联网上保密通信的工业标准。
SSL包含记录层(Record Layer)和传输层,记录层协议确定传输层数据的封装格式。传输层安全协议使用X.509认证,之后利用非对称加密演算来对通讯方做身份认证,之后交换对称金钥作为会谈金钥(Session key)。这个会谈金钥是用来将通讯两方交换的资料做加密,保证两个应用间通信的保密性和可靠性,使客户与服务器应用之间的通信不被攻击者窃听。
TLS协定采用主从式架构模型,用于在两个应用程式间透过网路建立起安全的连线,防止在交换资料时受到窃听及篡改。
TLS协议是可选的,必须配置客户端和服务器才能使用。主要有两种方式实现这一目标:一个是使用统一的TLS协议通讯埠(例如:用于HTTPS的端口443);另一个是客户端请求服务器连接到TLS时使用特定的协议机制(例如:邮件、新闻协议和STARTTLS)。一旦客户端和服务器都同意使用TLS协议,他们通过使用一个握手过程协商出一个有状态的连接以传输数据。通过握手,客户端和服务器协商各种参数用于建立安全连接。
TLS协议的优势是与高层的应用层协议(如HTTP、FTP、Telnet等)无耦合。应用层协议能透明地运行在TLS协议之上,由TLS协议进行建立加密通道需要的协商和认证。应用层协议传送的数据在通过TLS协议时都会被加密,从而保证通信的私密性。
根据我个人的理解就是TLS协议保证了我们客户端和服务端传输数据时的安全性,并且对传输的数据进行了一定的加密,同时通过了非对称加密算法对通讯双方的身份进行了验证,防止数据在传输过程被第三者进行监控和篡改相关数据,应用层协议可以运行在TLS协议之上(比如我们熟知的http协议等等),在一定程度上保证了双方通信的隐私。
那么话说回来,JDK版本与TLS版本到底存在什么微妙的关系呢?
从前几周对公司旧系统中一个提供给商户使用的demo进行整改的过程中,算是真正了解了它们两者之间神奇的关系。废话少说,先上图,大家可以看下如下的图片:
从上图中不难分析出JDK8几乎对所有的TLS协议和SSLv3协议都是支持的,并且默认(default)支持TLS1.2版本;然而JDK6只支持TLSv1.1,TLSv1和SSLv3这三个版本,JDK7版本同理可得。那么问题来了,我的上级叫我将demo(使用JDK6编译的)整改成支持所有的TLS协议和SSLv3协议,我当时就想这不就是件轻轻松松的事情吗?直接将该demo改成JDK8编译的demo不就行了吗,而且高版本的JDK是可以向下兼容低版本的JDK的,商户用上这个高版本的demo也不至于出问题吧?
于是我高兴地把我的想法告诉我的上级时,我上级先是认可了我的做法,但是经过一番分析后认为我的想法会对商户那边的改动比较大,同时升级JDK版本风险也大,不利于商户方便使用,所以最后还是建议我用原来JDK6编译的demo整改成支持所有的TLS协议和SSLv3协议的demo,当时我整个人懵了,想着这怎么可能做到呢?于是我百度了一番,发现果然还是有方法解决的,方法就是先通过引入一个jar包或者一个maven依赖,接着创建协议工厂类和创建工具类来使得这个效果可行,也就是让JDK6增加对tls1.2的支持,具体解决方案我就不详细说了,大家可以参考以下这个链接:https://www.cnblogs.com/supertonny/p/8378910.html ,我觉得写得确实挺好的。x
通过以上链接按正常来说就可以就请轻松松松解决版本不兼容的问题了,但由于自己对协议工厂类的底层原理不是很熟悉,所以在使用相关工具类进行相关url请求时总是报协议使用受到攻击的bug,针对这个问题,个人分析了一段时间,最后通过将url中的ip地址改成域名(比如随便举个例子,将“https://175.5.3.2/”改成“https://mp.csdn.net/”)
这种类似的方式进而可以让JDK6编译的程序同样可以访问支持TLSV1.2协议的服务器。
综上所述,相信大家已经对TLS协议与JDK版本之间微妙的关系有了深刻的理解。整篇文章都是基于本人的理解,有什么不足的地方请指正,谢谢!
除特别声明,本站所有文章均为原创,如需转载请以超级链接形式注明出处:SmartCat's Blog
精华推荐