SSL/TLS协议简介

一、SSL/TLS协议是什么

SSL协议(Secure Sockets Layer,安全套接字层),是由网景(Netscape)公司在1990年推出的一种标准安全协议,用于在网络通信中建立Web浏览器和Web服务器之间的加密链接。

TLS(Transport Layer Security,传输层安全)是 IETF组织 (工程任务组)在1999年将SSL3.0协议规范进行了标准化。

SSL(Secure Sockets Layer)和TLS(Transport Layer Security)的关系就像windows XP和windows 7的关系,升级后改了个名字而已。

HTTPS=HTTP+TLS

二、SSL/TLS发展史

  1. SSL 1.0仅是网景内部版本,由于严重Bug,从未公开发布
  2. SSL 2.0 发布于1995年2月,同样存在一些安全漏洞,已于2011年废弃
  3. SSL 3.0 发布于1996年,经过完全重新设计,也是一度广泛使用的版本,但由于易遭臭名昭著的POODLE攻击,同样在2015年已被废弃
  4. TLS 1.0,发布于1999年1月,为协议从网景移交到IETF后的第一个版本,该版本变化并不大,已于2020年被废弃
  5. TLS 1.1,发布于2006年4月,修复了安全漏洞,增强加密强度,同样于2020年被废弃
  6. TLS 1.2,发布于2008年8月,强化了支持的算法包,增加了扩展定义,也是目前的使用的主流版本
  7. TLS 1.3,发布于2018年8月,在强化安全性的同时,引入了0-RTT模式,降低了传输延迟,增强了传输性能

三、TLS报文结构

TLS协议内部也是基于分层架构,分为两层,组合起来实现完整的协议功能

  • 上层包含4种子协议:握手协议(Handshake Protocal)、警报协议(Alert Protocol)、应用数据协议(Application Protocol)及Change_cipher_spec。这篇文章主要关注握手协议(Handshake Protocal)
  • 下层为记录层协议(TLS Record Layer),为TLS上层子协议为传送提供分片、消息加密及加密后报传输,同时对接收到的数据进行验证、解密、重新组装,然后提交给高层的应用层

3.1 记录层协议(TLS Record Layer)报文

ContentType含义,区分是哪个子协议

十六进制 十进制 含义
0x14 20 ChangeCipherSpec
0x15 21 Alert
0x16 22 Handshake
0x17 23 Application
0x18 24 Heartbeat

Version含义

十六进制 Major Minor 含义
0x0300 0x03 0x00 SSL3.0
0x0301 0x03 0x01 TLS1.0
0x0302 0x03 0x02 TLS1.1
0x0303 0x03 0x03 TLS1.2
0x0304 0x03 0x04 TLS1.3

3.2 握手协议(Handshake Protocal)

MessageType含义,区分消息类型

十六进制 十进制 含义
0x00 0 HelloRequest
0x01 1 ClientHello
0x02 2 ServerHello
0x0b 11 Certificate
0x0c 12 ServerKeyExchange
0x0e 14 ServerHelloDone
0x10 16 ClientKeyExchange
0x14 20 Finished

四、TLS1.2 和TLS1.3主要区别

4.1 更快的访问速度

使用 TLS 1.2 需要两次往返( 2-RTT )才能完成握手,然后才能发送请求
TLS1.2握手

TLS 1.3 的握手不再支持静态的 RSA 密钥交换,这意味着必须使用带有前向安全的 Diffie-Hellman 进行全面握手。使用 TLS 1.3 协议只需要一次往返( 1-RTT )就可以完成握手
TLS1.3握手

4.2 更强的安全性

TLS 1.3 在之前版本的基础上删除了那些不安全的加密算法,这些加密算法包括:

  • RSA 密钥传输 —— 不支持前向安全性
  • CBC 模式密码 —— 易受 BEAST 和 Lucky 13 攻击
  • RC4 流密码 —— 在 HTTPS 中使用并不安全
  • SHA-1 哈希函数 —— 建议以 SHA-2 取而代之
  • 任意 Diffie-Hellman 组—— CVE-2016-0701 漏洞
  • 输出密码 —— 易受 FREAK 和 LogJam 攻击

五、查询JDK支持协议版本

SSLContext context = SSLContext.getInstance("TLS");
context.init(null, null, null);
SSLSocketFactory factory = context.getSocketFactory();
SSLSocket socket = (SSLSocket) factory.createSocket();

String[] supportedProtocols = socket.getSupportedProtocols();
System.out.println("supported protocols: " + Arrays.asList(supportedProtocols));

String[] enabledProtocols = socket.getEnabledProtocols();
System.out.println("enabled protocols: " + Arrays.asList(enabledProtocols));

各版本JDK支持协议

Java版本 HTTPS请求默认使用的TLS版本 支持的协议
JDK7 TLSv1 TLSv1、TLSv1.1、TLSv1.2、SSLv3
JDK8 TLSv1.2 TLSv1、TLSv1.1、TLSv1.2、SSLv3
JDK11 TLSv1.3 TLSv1、TLSv1.1、TLSv1.2、TLSv1.3、SSLv3

六、参考

https://www.jiamisoft.com/blog/28126-tls.html
https://zhuanlan.zhihu.com/p/558594332?utm_id=0
https://zhuanlan.zhihu.com/p/44980381
https://baijiahao.baidu.com/s?id=1707131030663801650&wfr=spider&for=pc

posted @ 2023-05-08 23:17  wusanga  阅读(2721)  评论(0编辑  收藏  举报