查看原文
其他

如何优化HTTPS实现访问加速(篇二)

Reese vivo千镜 2022-11-05

3月vivo千镜发布了《如何优化HTTPS实现访问加速》文章,介绍了HTTPS访问速度优化的一种思路:减少RTT的次数以实现对TLS握手过程的优化。在本文中,我们将继续介绍其他HTTPS优化方案:针对TCP握手的过程进行优化-TCP fast open和证书校验过程优化-OCSP Stapling。


1. TCP fast open是什么?

TCP fast open简称TFO(下文均称TFO),“TCP的快速打开”是对TCP握手流程的一种优化方案,由google提出并在RFC 7413中进行叙述,此方案可以提高两端的打开速度,提高页面响应速度。原本的TCP协议是需先进行三次握手建立连接,而后传输数据,他则是在服务端与客户端建立连接的握手阶段就开始交换数据,因此可以节省1个RTT的时延达到优化HTTPS访问加速的目的。

1.1TFO的执行流程

关于TFO的实际使用中,需要注意以下几点:

1)TFO的性能优化针对的是重复连接,而非首次连接,需要TCP先经过一个3次握手获取TFOcookie(Fast Open Cookie);

2)客户端与服务端必须同时支持TFO,且TFO最大程度上复用了TCP的API,当前是否进行TFO的标识体现在TCP报文OPTION字段的变化中。

1. 首次请求

  1. 客户端发送SYN包,包尾增加FOC请求,且该选项的cookie字段为空

  2. 服务端收到FOC后,用来源IP加密生成cookie后,加在SYN+ACK的尾部一起发回客户端

  3. 客户端保存cookie并发送ACK,开始数据传输

2. 后续重复请求

  1. 客户端发送 SYN包、之前首次握手后存储的TFOcookie(用于证明自己的身份),并携带正式发送给服务端的数据;

  2. 服务端验证 cookie,若验证通过,则证明客户端是之前建立连接过的“老朋友”,向其发送SYN+ACK包后,可以在收到客户端的ACK前向其发送数据包;

  3. 客户端发送ACK包。

注意:若第2步的cookie验证不通过则依照之前的三次握手进行正常握手交互。

1.2Cookie保护

服务端对客户端源IP进行AES-128算法加密生成16字节cookie,传递给客户端用作身份证明,同时服务端用于加密cookie密钥会定期循环轮换,以保证对加密IP生成的cookie的更新,防止攻击者随着时间的推移逐渐积累收集到的cookie对服务端进行攻击;由于客户端IP可能也会定期更改,生成的cookie也与以前不同,也一定程度上保证了cookie的安全性。

1.3TFO 的优势

从上面介绍的流程可以看到,TFO 的优势在于:

对重复握手部分数据传输效率的优化:TFO利用了重连握手期间的1 个RTT提前进行数据传输,复用多次重连的这个过程积累下来也是比较大的优势,谷歌的TFO报告中证明TFO相比TCP,对于35%的http请求可以节省1个RTT[4]

TCP SYN DDOS攻击的防御:当攻击者使用虚假IP向服务器重复SYN数据包和FOC请求,占满TFO建立连接的内存,让很多个TFO连接处于等待ACK的状态,当占用的TFO到达阈值后(管理预设),服务器将禁用TFO,使得后续TFO请求执行常规TCP握手,由TCP的防御机制去处理DDOS攻击,直到挂起的TFO超时释放到阈值以下。

1.4TFO的劣势

因为TFO的优化思路是在SYN包中就带上数据包,那当SYN包重发的时候,就会造成接收方收到重复的数据,所以建议发送和接收方均需具有处理重复数据的能力。

同时TFO 对于内核也有一定的要求[3]

  • IPv4在3.6(客户端)和3.7(服务端)版本中支持。IPv6在3.16版本支持;

  • Google ChromeChromium浏览器在Linux上提供TFO支持,包括Chrome OSAndroid

  • 苹果公司iOS 9OS X 10.11支持TCP快速打开,但并未为各连接默认启用;

  • Microsoft EdgeWindows 10 Preview build 14352开始支持TFO。

感兴趣的小伙伴可以检查下自己的环境是否支持,去体验下TFO的优化效果。


2. 证书优化

然后我们再来看看HTTPS访问加速的另一个思路:证书优化。

如上图所示,为了证明自己的可信度,服务器会在TLS的握手过程中,将证书发给客户端,这个过程的耗时主要在于1)证书传递到客户端;2)客户端验证书的有效性这两步,那么我们就从这两个角度进行优化思考。

2.1证书传输过程

当客户端向服务端发起一个请求,服务端会先返回一个证书,为了加快传输的效率,必然要尽可能减少证书大小,故而可考虑优先使用ECDSA证书,而不是RSA证书。为什么呢?



RSA与ECDSA的对比

RSA是现在应用最成熟的数字签名算法,用到了初等数论中的欧拉定理,安全性依赖大整数因数分解的困难性,但因为受制于素数产生技术,导致产生密钥非常麻烦,很难一次一密,且运算代价高,速度也很慢。

ECDSA是ECC与DSA的结合,签名过程类似DSA,但签名中使用的算法为ECC,其安全性基于椭圆曲线离散对数的难解性,相同强度下,ECC160比特的长度大远小于1024比特的RSA[1],较短的密钥也使得处理速度更快,存储空间和传输带宽占用更少。



2.2证书验证

客户端根据内置CA对服务端发来的证书中的信息进行有效性和合法性校验。但是证书状态是CA不断更新的,客户端也需要实时去获取证书合法性的最新情况,则不可避免的要向CA去请求最新的证书状态,这时候就需要OCSP(CRL缺点较多,现已基本被替代,故不多做介绍)。


OCSP(Online Certificate Status Protocol)在线证书状态协议,是一个协议状态查询的接口,主要是实现了客户端可实时请求CA服务器查询证书有效性,但是此方式会存在些实用性的问题[5]

  • 泄露隐私:由于client在OCSP要求下会直接访问CA服务器,此过程中则会泄露很大一部分用户浏览习惯等数据,这会严重损害用户的个人隐私;

  • 性能负担:客户端每收到一个请求就需要联系Responder,增加了HTTP的连接数,验证证书的负担加重;

  • 可靠性:线路延迟等因素在请求Responder阶段会增加整个验证流程的耗时,对于证书验证的成功率影响也变得更大;

  • 安全性:因为可靠性的问题,客户端对于OCSP检测容忍失败,失败后仍会判断证书有效,若攻击者阻断了客户端对Responder的请求,就可以一直使用不合法证书进行访问。

随后就提出了OCSP stapling的概念,优化点在于:OCSP变为由web server发起,并支持在验证信息的缓存,跳过了自己验证CA的过程,极大程度上减少频繁访问的情况,提高握手效率,也提高了HTTPS的性能。


随着人们对于安全性的要求逐渐提高,HTTPS也变的越来越普及。在访问量很大的情况下,HTTPS带来的功耗、性能、响应时间等方面的影响也更容易被关注,因此这些优化就变得尤为重要。HTTPS的优化之路还很长,希望各位都能学会优化访问速度的技巧,在日常使用HTTPS时,降低对业务的影响。


参考文章

[1] 张岩,张爱丽. 数字签名算法RSA和ECDSA的比较与分析[J]. 科协论坛(下半月),2010(2):96-97. DOI:10.3969/j.issn.1007-3973.2010.02.054.

[2] TFO那些事:https://blog.csdn.net/u014023993/article/details/85928026

[3]https://zh.wikipedia.org/wiki/TCP%E5%BF%AB%E9%80%9F%E6%89%93%E5%BC%80

[4] TCP Fast Open:http://conferences.sigcomm.org/co-next/2011/papers/1569470463.pdf

[5] OCSP stapling:https://zhuanlan.zhihu.com/p/302697430

[6]RFC7413:https://storage.googleapis.com/pub-tools-public-publication-data/pdf/43269.pdf



精彩文章推荐


关于vivo千镜安全架构的深度解析



远程锁卡,锁住你的隐私和财产



一种基于eBPF的Android系统监测方案



关于 Android任意URL跳转的这些危害你知道吗?

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存