http的不安全性:明文传输的风险
http: 浏览器和服务器之间的通信是纯文本,这意味着你输入的密码和互联网发送的信用卡号可以被任何有能力拦截它的人读取
https诞生:安全通信的解决方案
https的诞生就是解决这个问题,使通过互联网发送的数据无法被发送者和接收者以外的任何人读取
TLS:HTTPS安全的基石
https是HTTP协议的扩展,数据传输会通过称为 TLS(Transport Layer Security)的协议进行加密,这时如果加密数据被黑客截获,它们所能看到的只是无法解读的密文
TLS握手过程详解
TLS 在建立安全的 HTTP 连接之前,先通过一个“握手”过程协商加密参数并建立安全通道:
1. 建立TCP连接
和普通的 HTTP 一样,浏览器首先与服务器建立基础的 TCP 连接。
2. TLS握手开始
-
客户端(浏览器)向服务器发送问候信息Client Hello:,里面包含:
- 支持的 TLS 版本。
- 支持的加密算法、密钥交换算法、哈希算法等组合
-
服务器会回应客户端Server Hello:,里面包含:
- 选定的 TLS 版本。
- 选定的加密算法、密钥交换算法、哈希算法等组合
- 服务器证书: 这是最关键的一步。证书包含服务器的身份信息(域名等)和最重要的服务器公钥。证书由受信任的第三方机构(CA)签发,用于证明服务器身份的真实性。
客户端收到证书后,会验证其有效性(是否由受信任的机构颁发、域名是否匹配、是否在有效期内等)。如果验证失败,浏览器会发出安全警告,连接可能被终止。
3. 密钥交换
由于非对称加密计算开销大,效率低,不适合持续加密大量数据,因此TLS设计为仅用其安全交换一个高效的对称会话密钥:
客户端用服务器公钥来加密自己随机生成的Pre-Master Secret(预主密钥),并发送给服务器;
只有持有对应私钥的服务器才能解密该消息,获取Pre-Master Secret
双方基于 Pre-Master Secret 和此前交换的随机数,独立生成相同的会话密钥
这样客户端和服务器都安全地拥有了相同的会话密钥,且该密钥从未直接传输,且由双方独立计算得出
4. 握手完成与安全通信开始
- 启用加密通信
双方发送 Change Cipher Spec 消息,声明后续通信将使用协商的密钥加密
- 生成哈希值
客户端与服务器各自计算此前所有握手数据(Client Hello、Server Hello、证书、密钥交换等)的哈希值
- 交换验证消息
客户端和服务器都使用会话密钥加密此哈希值,形成"Finished"消息,发送加密后的"Finished"消息给对方
- 最终验证
接收方解密"Finished"消息获得对方计算的哈希值, 使用相同的算法重新计算握手过程的哈希值, 都比较两个哈希值,确认握手未被篡改且密钥一致,哈希值不匹配立即终止连接
- 安全通道建立
验证通过后,后续的所有 HTTP 请求和响应数据,都将使用这个会话密钥和协商好的对称加密算法进行加密和解密。
tips:哈希值是什么?
这是一个独特的"数字指纹",通过对
Client Hello、Server Hello、证书交换、密钥交换等所有握手步骤的数据进行特殊计算(哈希算法)生成。它像密封蜡一样保护整个谈判过程不被篡改。