HTTP 超文本协议是互联网基础协议,但它使用明文传输十分不安全. 而 HTTPS 则在 HTTP 协议基础上增加了 TLS 认证加密过程, 使得传输变得安全,但加密握手过程中带来了性能上的损耗. 本文梳理了 HTTPS 的一些知识以及性能优化的方法.
HTTPS 简介
1.1 http 协议
http 协议是用于从 www 服务器传输超文本到本地浏览器的传输协议. 是最广泛使用的网络传输协议.
1.3 ssl/tls
ssl(secure socket layer) 安全套接层是为网络提供安全完整通信的安全协议. tls( transpor layer security) 是改进了 ssl 中存在的安全漏洞的安全协议,提供给两个应用程序保密性、数据完整性的通信协议.
1.2 https
https 超文本传输安全协议(Hyper Text Transfer Protocol over Secure Socket Layer) 是结合 http+ssl/tls 协议的安全传输协议,它广泛用于互联网上的数据安全传输.
HTTPS 原理与过程
2.1 HTTPS 原理
HTTPS 主要用于解决 HTTP 协议明文传输的缺陷,传输的数据可能被截获、修改或者伪造双方. HTTPS 则是为了解决该问题的协议, 它结合了 SSL/TLS 和 HTTP 协议,确保通信双方是可信、数据是加密的且未被篡改过的.
- 加密: 相比 HTTP ,HTTPS 对数据进行了加密,可以避免用户的数据被监听.
- 数据一致性: 确保用户的数据在传输过程中不会被篡改.
- 身份认证: 确保网站是安全受信的,通过对网站进行身份认证,防止中间人攻击.
- 非对称加密: 加密密钥和解密密钥是不一样的加密方式,如 RSA 等. 由于加密和解密密钥不同,则可以将加密密钥公开作为公钥,而收信息一方保留解密用的私钥,避免了对称加密算法需要交换密钥的风险.
- SSL/TLS
- SSL(Secure Socket Layer): 位于可靠的面向连接的网络层协议和应用层协议之间的一种协议层.
- TLS(Transport Layer Security) : 用于两个应用程序之间提供保密性和数据完整性. TLS 使得 SSL 更加安全.
2.2 HTTPS 握手过程
HTTPS 的建立过程包括 7 次握手,除了 TCP 建立连接的三次握手,还包括 TLS 四次握手过程. 如下:
- 首先通过 tcp 三次握手建立连接
- 客户端发送带有 SYN 及 seq 的请求
- 服务器返回 ack、ACK、SYN、seq 的请求
- 客户端返回 ack 及 ACK,连接建立
- 通过 TLS 的四次握手建立安全的连接, 以下是 TLS 1.2 的过程:
- 客户端向服务器发送 client hello 消息, 其中携带客户端支持的协议版本、加密算法、压缩算法以及客户端生成的随机数.
- 服务端收到 client hello 消息后,向客户端返回一小信息
- Server Hello 消息,并携带选择特定的协议版本、加密方法、会话 ID 以及服务端生成的随机数.
- Certificate 消息,即服务端的证书链,其中包含证书支持的域名、发行方和有效期等信息.
- Server Key Exchange 消息,传递公钥以及签名等信息.
- 可选的消息 CertificateRequest,验证客户端的证书.
- Server Hello Done 消息,通知服务端已经发送了全部的相关信息.
- 客户端收到服务端的协议版本、加密方法、会话 ID 以及证书等信息后,验证服务端的证书
- 向客户端发送 Change Cipher Spec 消息,通知客户端后面的数据段会加密传输;
- 向客户端发送 Finished 消息,验证客户端的 Finished 消息并完成 TLS 握手;
- 服务端收到 Change Cipher Spec 和 Finished 消息后,可以开始进行应用数据传输.
- 在 TCP + TLS 建立的安全通道的基础上,通过 HTTP 协议进行数据传输
下图是访问 https://www.baidu.com 过程中的 tls 握手过程,可以看到下面的 TLSv1.2 过程中,进行了四次握手,有两次 (OUT) 发送数据,两次(IN) 接受服务器请求. 过程如下所示:
HTTPS 性能优化
3.1 性能消耗
在 HTTPS 建立的过程中,完整的四次握手性能十分低,是 HTTP 的 10%. 这对于用户体验是很大的伤害,一些高访问量的网站十分有必要进行 HTTPS 的优化. 以下亮点是 HTTPS 中性能差的部分:
- 完全握手: 性能是 HTTP 的 10%. 相当 1 万 QPS 的 HTTP 访问,HTTPS 只能达到几百.
- 加密算法: HTTPS 中使用非对称加密算法交换密钥,使用对称加密算法加密数据. 加密算法将消耗计算量.
- RSA 算法: 它对性能的影响占了 75 % 左右. 主要是由于 RSA 算法中涉及大素数的指数计算.
- 对称加解密: MAC 计算,它们对性能影响比较小,是微秒级别的.
3.3 优化方案
对于减少 HTTPS 消耗的时间,可以从减少计算量、提升计算性能等方面考虑,以下是三个优化点:
- 减少完全握手的发生: 对于已经握手过的客户端,使用简化握手. 经过优化后,可以将完全握手比例缩小到 30% .
- 策略一: 服务端通过 session_id 找到对应客户端信息,然后进行简化握手,将 2 个 RTT 的握手过程简化为 1 个 RTT.
- 策略二: 客户端发起握手时,携带 session ticket,服务器拿到 session ticket 后会进行解密,解密成功了后就意味着它是可被信任的,握手完成.
- 使用代理计算: 对于需要消耗 CPU 计算的算法过程,使用代理计算,从而减少完全握手所需的计算时间.
- 算法分离: 将最消耗 CPU 计算的算法(RSA、ECDHE_RSA)分离出来,使用其它机器进行计算,减少平均计算时间.
- 代理计算: 可采用硬件加速卡、空闲 CPU 计算
- 异步执行: 异步等待代理机器的计算结果.
- 优化对称加密算法: 对称加密算法涉及块式对称加密算法、流式对称加密算法. 开启 AES-NI 并使用,提升计算性能.
END
4.1 参考资料
1. https://www.infoq.cn/article/soKW3Lm9hoU4yUh2G81h
2. https://zhuanlan.zhihu.com/p/25290538
3. https://mp.weixin.qq.com/s/hf_SmGdapU_1FXQaA0P3-A
4. https://blog.csdn.net/qq_36894974/article/details/104856083
END