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发展史
- SSL 1.0仅是网景内部版本,由于严重Bug,从未公开发布
- SSL 2.0 发布于1995年2月,同样存在一些安全漏洞,已于2011年废弃
- SSL 3.0 发布于1996年,经过完全重新设计,也是一度广泛使用的版本,但由于易遭臭名昭著的POODLE攻击,同样在2015年已被废弃
- TLS 1.0,发布于1999年1月,为协议从网景移交到IETF后的第一个版本,该版本变化并不大,已于2020年被废弃
- TLS 1.1,发布于2006年4月,修复了安全漏洞,增强加密强度,同样于2020年被废弃
- TLS 1.2,发布于2008年8月,强化了支持的算法包,增加了扩展定义,也是目前的使用的主流版本
- 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 )才能完成握手,然后才能发送请求
TLS 1.3 的握手不再支持静态的 RSA 密钥交换,这意味着必须使用带有前向安全的 Diffie-Hellman 进行全面握手。使用 TLS 1.3 协议只需要一次往返( 1-RTT )就可以完成握手
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