✒️ https
2022年6月20日
- 计算机网络
✒️ https
1. http VS https
http | https | |
---|---|---|
数据传输 | 明文传输 | 密文传输 |
连接建立 | 3次握手 | 3次握手 + 4次 SSL/TLS 握手 |
端口 | 80 | 443 |
潜在风险 & 对策 | 窃听、篡改、冒充 | 混合加密、摘要算法、数字证书 |
2. 具体措施
1) 混合加密 - 防窃听
- 在连接建立时采用非对称加密
- 在数据传输过程中采用对称加密
2) 摘要算法 - 防篡改
- 客户端将明文数据通过指定的摘要算法生成摘要
- 明文数据 & 摘要 经过公钥加密后传输
- 服务端收到信息后,通过私钥解密,得到 明文数据 & 摘要
- 服务端通过相同的摘要算法对明文生成摘要
- 对比客户端传来的摘要 & 自己生成的摘要,一致则表示数据未被篡改
3) 数字证书 - 防冒充
- 需要保证客户端收到的公钥确实是服务端的公钥,而非第三方冒充
- CA 是权威的证书颁发机构,全球就几家,该机构通过 RSA 生成一对公私钥
- 流程
- 服务器将自己的公钥注册到 CA
- 传输数据时,CA 将服务器的 公钥 & 证书认证机构 CA 的信息 & 持有者信息 & 证书有效期 & 其他信息 封装,得到 明文 P
- 明文 P 通过 Hash 算法生成 H1
- CA 用私钥对 H1 进行 RSA 加密,得到 S
- P & S == 数字证书
- 客户端收到数字证书后,对证书进行解析,用同样的 Hash 算法对 P 进行计算,得到 H2
- 通常浏览器 & 操作系统中集成了 CA 的公钥信息,用 CA 公钥解密 S,得到 H3
- 比较 H2 == H3 是否成立,若成立,则说明证书可以信任,可以从 P 中取出服务器的公钥进行后续操作
- 证书链
- 一般向 CA 申请的证书并非 根证书 签发,而是由 中间证书 机构签发的
- 对于服务端传来的证书,如果浏览器之前没有存储该证书,那么,
- 客户端会根据服务端证书的签发者,向 CA 请求该中间证书,
- 若还是没有,继续向 CA 请求中间证书的签发者,直到 根证书
- 然后通过已有的 根证书的公钥,验证中间证书的正确性,验证通过后,
- 利用中间证书的公钥,验证服务端证书的正确性,验证通过,则说明可以信任
- 借助证书链,将根证书尽可能隔离,尽可能保证了根证书的安全性
3. 连接建立过程
1) TCP 三次握手
2) SSL/TLS 协议
① Client Hello
- 客户端向服务器端发送以下信息:
- 客户端随机生成的随机数 [Client Random]
- 客户端支持的 SSL/TLS 协议版本,例 TLS 1.2
- 客户端支持的 密码套件,包含 密钥交换算法 & 签名算法 & 对称加密算法 & 摘要算法
② Server Hello
- 服务端收到请求后,得到 [Client Random],发出响应,主要包含以下信息:
- 服务端随机生成的随机数 [Server Random]
- 确认使用的 SSL/TLS 协议版本,若浏览器不支持,则关闭加密通信
- 确认使用的 密码套件
- 服务器的 数字证书
③ 客户端回应
- 客户端收到服务器的回应后,需要经过以下步骤:
- 通过浏览器 | 操作系统的 CA 公钥,验证服务器数据证书的真实性,认证通过后,
- 从数据证书中取出 服务器的公钥 & 服务器的随机数 [Server Random]
- 客户端随机生成随机数 [Random],使用 服务器的公钥 加密,得到 [PreMaster Key]
- 向服务器发送以下信息:
- [PreMaster Key]
- 加密算法改变通知,之后信息通过 [会话密钥] 加密通信
- 客户端握手结束通知,
- 将前面握手阶段的消息生成摘要,再用 [会话密钥] 加密,作为客户端第一条加密消息,能被服务器端正确解出则说明双方 [会话密钥] 一致
- 会话密钥 = [Client Random] + [Server Random] + [Random]
④ 服务端回应
- 服务端受到客户端回应后,取出 [PreMaster Key],通过 服务端的私钥 解密,得到 [Random]
- 将 Client Hello 阶段得到的 [Client Random] + 自己的 [Server Random] + [Random] == 会话密钥
- 向客户端发送以下信息:
- 加密算法改变通知,之后信息通过 [会话密钥] 加密通信
- 服务端握手结束通知,
- 将握手阶段产生的消息生成摘要,再用 [会话密钥] 加密,作为服务器端第一条加密消息,能被客户器端正确解出则说明双方 [会话密钥] 一致
3) 正常数据传输
- 通过协商好的 [会话密钥] 加密信息,进行传输
4. 缩短 https 握手次数
1) TCP Fast Open
① 是什么
- TCP Fast Open 是为了绕过 TCP 三次握手发送数据,在
Linux 3.7
内核版本之后,提供了TCP Fast Open
功能,这个功能可以减少 TCP 连接建立的时延
② 前置条件
- 客户端和服务端都要同时支持才会生效
- 作用于非初次连接
③ 首次连接流程
- 客户端发送 SYN 报文,报文中包含 Fast Open 选项,且 选项中的 cookie == 空
- 服务端返回 SYN-ACK 报文,报文中包含 Fast Open 选项,且 选项中的 cookie == 服务器生成的 cookie
- 客户端收到 SYN-ACK 报文后,本地缓存 该 cookie
④ 非首次连接流程
- 客户端发送 SYN 报文,报文中包含 Fast Open 选项,且 选项中的 cookie == 之前缓存的 cookie,还同时携带应用数据
- 服务端对 SYN 报文的 cookie 进行校验
- cookie 有效,则服务器端返回 SYN-ACK 报文,报文包含对应用数据的确认,随后向客户端返回响应数据,从而减少了 一个 RTT 的时间消耗
- cookie 无效,则服务器端返回 SYN-ACK 报文,报文中没有对应用数据的确认
2) TLS v1.3
- TLS v1.3 握手过程只需要 1个 RTT 时间
- 会话恢复时,重连 TLS v1.3 只需要 0 个 RTT 时间