HTTPS
早期的Web应用是一个学术网络,其信任度很高,因此早期的HTTP是明文协议,但是随着Web应用的不断壮大和发展,其应用场景不断拓宽,功能越来越强大,对加密的需求变得非常普遍。
HTTPS(Hypertext Transfer Protocol Secure)是基于HTTP,通过TLS/SSL进行数据加密和身份认证的协议
SSL和TLS
早期的HTTPS由SSL进行加密,但是在随后的不断完善中最终被标准化为TLS,因此加密协议经常被叫做SSL/TLS
版本演化
SSL1.0,SSL2.0,SSL3.0均存在安全风险,后在1999年被标准化为TLS1.0协议,SSL也被禁用
在随后的发展中,TLS1.0和TLS1.1也被证实存在一定安全漏洞,因此主流浏览器和操作系统和行业标准全面禁用
目前广泛使用的版本是TLS1.2和TLS1.3,最新的版本是TLS1.3
层级
TLS并不是应用层协议,而是位于传输层和应用层之间,因此TLS不仅仅可以给HTTP加密,也可以给其他协议加密;
TLS1.2工作流程
1.客户端发送clientHellow
clientHellow中包含以下内容:
- 支持的TLS版本
- 客户端随机数
- 支持的加密套件
2.服务器接收后,返回serverHellow
serverHellow包含以下内容:
- 选择的加密套件和TLS版本
- 服务器随机数
3.证书交换和验证
服务器发送其数字证书,其中包含其公钥(RSA公钥)
客户端收到数字证书后,验证数字证书的合法性
4.密钥协商
RSA(不支持前向保密)
协商过程:
- 客户端生成预主密钥,是一个48字节的随机序列
- 客户端利用数字证书中携带的服务器公钥(RSA公钥),加密预主密钥,发送给服务器
- 此时客户端和服务器都拿到了对称密钥
这个过程相当于使用RSA非对称加密传输AES对称加密密钥,随后服务器根据这个对称密钥进一步生成会话密钥用于实际传输的对称密钥
如果服务器的私钥被泄露,由于每次通信使用的密钥都是一样的,因此以前所有的信息交流都可能被破解,因此RSA不支持前向保密
ECDHE(支持前向保密)
数学原理:
- 椭圆曲线上的两个点G和A,有aG = A,知道G和A的情况下,计算输出系数a是困难的,因此a可以作为私钥
- 对于相同的基点G,有
aG = A,bG = B,分别有aBG = abG,bAG = abG,因此aBG = bAG,因此两者可以通过aBG或者bAG生成相同的序列,由于系数难以通过两个点来计算,这个序列可以作为对称加密的密钥
基于以上特性容易实现每次对话选择不同的私钥,进一步容易实现向前保密;
协商过程:
- 首先在上面的1,2步骤中已经确定好加密套件,其中包含椭圆曲线函数、椭圆曲线上的一个基点G
- 客户端随机选一个系数
a,通过aG得到点A - 服务器随机选一个系数
b,通过bG得到点B - 两者交换
A和B作为各自的公钥 - 两方分别通过
aBG和bAG生成相同的序列 - 此时客户端和服务器都拿到了对称密钥
即使双方的私钥被泄露,但是由于每次都是使用的随机系数来作为私钥,因此泄露的私钥只适用于当前对话,不能对以前的会话进行解密,因此支持前向保密
5.生成会话密钥
通过上面的密钥协商流程,通信双方都拿到了对称密钥、双方生成的随机数
随后通过对称密钥、双方随机数,通过密钥派生函数(HKDF)生成最终会话密钥
6.完成握手
- 双方发送
Change Cipher Spec消息,通知后续通信使用会话密钥加密。 - 交换
Finished消息,验证握手过程的完整性和正确性
7.进行加密通信
双方通过AES-256-GCM或者AES-128-CBC,使用会话密钥对数据包进行加密和解密操作
TLS1.3
TLS1.3对TLS1.2进行了诸多改进
- 简化握手流程到1RTT
- 强制使用ECDHE以支持向前保密
- 移除AES-128-CBC和RSA等不安全的算法
工作流程-加密握手简化到1RTT
clientHello,除了和1.2版本一样的TLS版本、加密套件、客户端随机数以外,因为强制使用ECDHE,所以此时就可以发送公钥AserverHello,除了确认TLS版本、加密套件、发送服务器随机数以外,还会发送自己的公钥B
此时双方已经可以通过基点、自己的私钥、对方的公钥来生成会话秘钥
由此可见,原本需要两个往返才可以生成会话秘钥,此时只需要一个往返就可以生成,握手时间从2-RTT优化到了 1-RTT
强制使用ECDHE
简化为一种密钥协商算法,因此在clientHello和serverHello阶段就可以交换密钥,进一步促成了2-RTT到1-RTT的优化;
并且每次双方选取的椭圆曲线点所使用的系数都是随机选择的,因此即使获取该点的系数暴露,也只是此次对话临时密钥对泄露,不影响以前和往后的加密,具有前向保密的特性;