HTTP协议和HTTPS协议的区别
首先先看这张图片:
其实HTTPS就比HTTP多了一个SSL/TLS层。那这一层具体是干什么的,我们先从HTTP的不足之处入手。
HTTP的不足之处
- 通信使用明文(不加密),内容可能会被窃听。
- 不验证通信方的身份,因此有可能遭遇伪装。
- 无法证明报文的完整性,所以有可能已遭篡改。
HTTPS的完善之处
1、加密方式
通信的加密方式
SSL(Secure Socket Layer,安全套接层)和TLS(Transport Layer Security,安全层传输协议)
与SSL组合使用的HTTP被称为HTTPS(HTTP Secure,超文本传输安全协议)或HTTP over SSL。
内容的加密方式
将HTTP协议传输的内容本身进行加密,前提是要求客户端和服务器同时具备加密和解密机制。

由于该方式只对内容加密,不同于SSL和TLS将整个线路进行加密,所以内容仍有被篡改的风险。
2、验证身份
HTTP协议中的请求和响应不会对通信方进行确认。
所以会存在以下隐患:
-
无法确定请求发送至目标的 Web 服务器是否是按真实意图返回响应的那台服务器。有可能是已伪装的 Web 服务器。
-
无法确定响应返回到的客户端是否是按真实意图接收响应的那个客户端。有可能是已伪装的客户端。
-
无法确定正在通信的对方是否具备访问权限。因为某些 Web 服务器上保存着重要的信息,只想发给特定用户通信的权限。
-
无法判定请求是来自何方、出自谁手。
-
即使是无意义的请求也会照单全收。无法阻止海量请求下的 DoS攻击(Denial of Service,拒绝服务攻击)。
这种时候使用SSL可以确定通信方,SSL不仅提供加密处理,而且还使用了一种被称为证书的手段,可用于确定通信方。
证书由第三方机构颁发,用以证明服务端和客户端是实际存在的。(伪造证书是一个非常困难的事)
3、报文完整性
HTTP协议无法证明通信的报文完整性,即使报文被篡改,也无法获悉。
像这样,请求或响应在传输途中,遭攻击者拦截并篡改内容的攻击称为中间人攻击(Man-in-the-Middle attack,MITM)。
虽然HTTP协议有MD5和SHA-1等散列值校验的方法,但是这依然无法百分百保证确认结果正确,因为MD5和PGP本身可能会被改写。
4、HTTPS建立过程
HTTPS采用混合加密机制
① TCP 建立连接
- 三次握手
- 确保客户端和服务器可以通信
② TLS 握手(核心)
(1)Client Hello(客户端)
客户端发送:
- 支持的 TLS 版本(如 TLS 1.2 / 1.3)
- 支持的加密套件
- 一个随机数(Client Random)
(2)Server Hello(服务端)
服务端返回:
- 选定的加密套件
- 一个随机数(Server Random)
- 服务器证书(包含公钥)
(3)客户端验证证书
客户端做三件事:
- 校验证书是否可信(CA)
- 校验域名是否匹配
- 校验证书是否过期
👉 防止中间人攻击
(4)密钥协商(重点)
TLS 1.2(传统)
- 客户端生成:
- 预主密钥(Pre-Master Secret)
- 用服务器公钥加密发送给服务器
- 服务器用私钥解密
👉 双方得到:Pre-Master Secret
TLS 1.3(现代)
- 双方各自生成:
- 临时私钥 + 公钥(ECDHE)
- 交换公钥
- 通过算法计算:
👉 得到:共享密钥(Shared Secret)
(5)生成会话密钥(Session Key)
不管 TLS 1.2 还是 1.3:
👉 都会通过 密钥派生函数(KDF) 生成:
- 会话加密密钥
- MAC 密钥(或 AEAD)
- IV 等
👉 输入材料:
- Pre-Master Secret / Shared Secret
- Client Random
- Server Random
(6)握手完成
双方发送:
- Finished 消息(加密的)
👉 表示: - 密钥一致 ✔
- 握手成功 ✔
③ 开始 HTTPS 通信
之后所有 HTTP 数据:
- 都用 会话密钥加密传输
👉 这才是真正的 HTTPS
加密套件:
TLS1.2之前:握手需要2RTT,客户端通过证书(可以确认身份)获取到服务端的公共密钥,通过公共密钥发送预主密钥到服务端(非对称算法RSA),使用预主密钥派生出的会话密钥通信(对称算法)。报文完整性依靠HMAC算法,发送方生成一个校验值,接收方重新计算并对比,不一致说明数据被篡改。
TLS1.3:握手只需要1RTT,客户端和服务端 ECDHE 算法各自生成临时私钥并根据算法计算公钥各自发送,通过自己的私钥和对面的公钥计算出一个共同的共享密钥,但是该共享密钥需要经过密钥派生,派生出的密钥才能真正用于会话加密。
身份认证依赖数字证书。服务器在握手过程中使用私钥对握手消息进行签名,客户端使用证书中的公钥验证签名,从而确认服务器身份。
TLS 1.3 使用 AEAD(Authenticated Encryption with Associated Data)算法,同时提供加密和完整性校验。发送方生成认证标签(Tag),接收方验证 Tag,若不一致则说明数据被篡改。
TLS1.2虽然允许之前的加密套件,但是现在通常不使用之前的加密套件了,目前使用的是ECDHE+AEAD算法,TLS1.3直接不允许使用旧算法。