HTTPS对网站性能优化的影响
如今,越来越多的网站和服务开始启动加密,HTTPS加密Web流量占到总流量的一半,其中YouTube这样的流媒体网站首次有50%的流量是经过HTTPS,这一切证明了Web的完整加密是可行的。
百度自2014年底起,开始对部分地区开放了HTTPS加密搜索服务,如今百度已全站开启了HTTPS安全加密搜索,那么,我们该如何看待百度全站采用HTTPS加密搜索呢?
HTTPS在保护用户隐私,防止流量劫持方面发挥着非常关键的作用,但与此同时,HTTPS也会降低用户访问速度,增加网站服务器的计算资源消耗。
百度在工程开发上几乎不做没有性价比的事情,所以我们先看看https这个事情在技术上的投入在哪里?
一、百度启用了HTTPS加密搜索
从2014年底开始,百度在部分地区开始对其搜索启用了HTTPS加密(VeriSign签发的证书),百度HTTPS相关负责人指出,此举致力于为用户提供一个安全可靠的网络环境(具体可查看马海祥博客《》的相关介绍)。
当你网购的时候,你输入银行信息后按继续,在与银行网站对接的过程中,你的付款信息在网络传输过程中,是被加密的,这是为了确保使客户与服务器应用之间的通信不被攻击者窃听。
二、在性能方面的影响
1、多几次握手,网络耗时变长,用户从http跳转到https还要一点时间。
2、机器性能,https要多做一次RSA校验。
3、CDN,全国所有节点要支持https才行,另外,如果面对DDOS,https的解决方案也会复杂得多。
三、对周边系统的影响
1、页面里所有嵌入的资源都要改成https的,这些资源可能会来自不同的部门甚至不同的公司,包括:图片、js、form表单等等,否则浏览器就会报警。
2、手机百度这类使用了百度搜索服务的客户端产品,也可能要修改。
3、解决第三方网站看不到refer的问题。
4、所有的开发、测试环境都要做https的升级。
还有,上线前肯定是一大堆预案,保证切换过程顺畅,所以说下来,https这个事情的投入真心很大,不是说换就换的。
好了,这个事情的收益在哪里呢?在马海祥看来,就是用户的搜索安全,至于原因可能有以下几点:
1、被运营商强插广告,甚至在正常结果前面插一条广告。
2、有的时候劫持代码还会写错,导致用户访问白屏或者报错。
3、手机上被浏览器或者什么卫士篡改或者劫持。
4、最恶心的是泄露用户数据,经常在网上看到说:“我用百度搜了一个黄金,马上就有人联系我了”“我在百度上搜了一种病,马上医院就来电话了”。
5、另外,对百度的收入也有影响、有不少公共wifi自动会自动给百度搜索加一个联盟的计费id。
其实在搜索HTTPS很久之前,百度就做了搜索结果url加密,我想应该是基于类似的考虑。
很多互联网公司在做大的时候都会遇到这个问题:https成本高,速度又慢,规模小的时候在涉及到登录和交易用上就够了,做大以后遇到信息泄露和劫持,想整体换,代价又很高。
四、HTTPS对访问速度的影响
在介绍速度优化策略之前,先来看下HTTPS对速度有什么影响,在马海祥看来,其影响主要来自两方面:
①、协议交互所增加的网络RTT(round trip time)。
②、加解密相关的计算耗时。
卡内基梅隆大学、西班牙电信和都灵理工大学的研究人员在ACM CoNEXT上发表了一篇论文(PDF),量化了网站从HTTP切换到HTTPS所付出的代价。
研究人员分析了启用加密对延迟、消耗数据和客户端电池寿命的影响,他们发现,HTTPS的“S”会使得页面加载时间增加了50%,增加10%到20%的耗电,此外,HTTPS还会影响缓存增加数据开销和功耗,以及父母控制和病毒扫描等也会受到影响(具体可查看马海祥博客《》的相关介绍)。
下面马海祥分别跟大家介绍一下:
1、网络耗时增加
由于HTTP和HTTPS都需要DNS解析,并且大部分情况下使用了DNS缓存,为了突出对比效果,忽略主域名的DNS解析时间。
用户使用HTTP协议访问http://www.mahaixiang.cn(或者www.mahaixiang.cn)时会有如下网络上的交互耗时:
可见,用户只需要完成TCP三次握手建立TCP连接就能够直接发送HTTP请求获取应用层数据,此外在整个访问过程中也没有需要消耗计算资源的地方。
接下来看HTTPS的访问过程,相比HTTP要复杂很多,在部分场景下,使用HTTPS访问有可能增加7个RTT,如下图:
HTTPS首次请求需要的网络耗时解释如下:
①、三次握手建立TCP连接,耗时一个RTT。
②、使用HTTP发起GET请求,服务端返回302跳转到https://www.mahaixiang.cn,需要一个RTT以及302跳转延时。
a、大部分情况下用户不会手动输入https://www.mahaixiang.cn来访问HTTPS,服务端只能返回302强制浏览器跳转到https。
b、浏览器处理302跳转也需要耗时。
③、三次握手重新建立TCP连接,耗时一个RTT。
302跳转到HTTPS服务器之后,由于端口和服务器不同,需要重新完成三次握手,建立TCP连接。
④、TLS完全握手阶段一,耗时至少一个RTT。
a、这个阶段主要是完成加密套件的协商和证书的身份认证。
b、服务端和浏览器会协商出相同的密钥交换算法、对称加密算法、内容一致性校验算法、证书签名算法、椭圆曲线(非ECC算法不需要)等。
c、浏览器获取到证书后需要校验证书的有效性,比如是否过期,是否撤销。
⑤、解析CA站点的DNS,耗时一个RTT。
a、浏览器获取到证书后,有可能需要发起OCSP或者CRL请求,查询证书状态。
b、浏览器首先获取证书里的CA域名。
c、如果没有命中缓存,浏览器需要解析CA域名的DNS。
⑥、三次握手建立CA站点的TCP连接,耗时一个RTT。
DNS解析到IP后,需要完成三次握手建立TCP连接。
⑦、发起OCSP请求,获取响应。耗时一个RTT。
⑧、完全握手阶段二,耗时一个RTT及计算时间。
完全握手阶段二主要是密钥协商。
⑨、完全握手结束后,浏览器和服务器之间进行应用层(也就是HTTP)数据传输。
当然不是每个请求都需要增加7个RTT才能完成HTTPS首次请求交互,据马海祥了解,大概只有不到0.01%的请求才有可能需要经历上述步骤,它们需要满足如下条件:
①、必须是首次请求,即建立TCP连接后发起的第一个请求,该连接上的后续请求都不需要再发生上述行为。
②、必须要发生完全握手,而正常情况下80%的请求能实现简化握手。
③、浏览器需要开启OCSP或者CRL功能,Chrome默认关闭了ocsp功能,firefox和IE都默认开启。
④、浏览器没有命中OCSP缓存,Ocsp一般的更新周期是7天,firefox的查询周期也是7天,也就说是7天中才会发生一次ocsp的查询。
⑤、浏览器没有命中CA站点的DNS缓存,只有没命中DNS缓存的情况下才会解析CA的DNS。
2、计算耗时增加
上节还只是简单描述了HTTPS关键路径上必须消耗的纯网络耗时,没有包括非常消耗CPU资源的计算耗时,事实上计算耗时也不小(30ms以上),从浏览器和服务器的角度分别介绍一下:
①、浏览器计算耗时
a、RSA证书签名校验,浏览器需要解密签名,计算证书哈希值,如果有多个证书链,浏览器需要校验多个证书。
b、RSA密钥交换时,需要使用证书公钥加密premaster,耗时比较小,但如果手机性能比较差,可能也需要1ms的时间。
c、ECC密钥交换时,需要计算椭圆曲线的公私钥。
d、ECC密钥交换时,需要使用证书公钥解密获取服务端发过来的ECC公钥。
e、ECC密钥交换时,需要根据服务端公钥计算master key。
f、应用层数据对称加解密。
g、应用层数据一致性校验。
②、服务端计算耗时
a、RSA密钥交换时需要使用证书私钥解密premaster,这个过程非常消耗性能。
b、ECC密钥交换时,需要计算椭圆曲线的公私钥。
c、ECC密钥交换时,需要使用证书私钥加密ECC的公钥。
d、ECC密钥交换时,需要根据浏览器公钥计算共享的master key。
e、应用层数据对称加解密。
f、应用层数据一致性校验。
由于客户端的CPU和操作系统种类比较多,所以计算耗时不能一概而论,手机端的HTTPS计算会比较消耗性能,单纯计算增加的延迟至少在50ms以上,PC端也会增加至少10ms以上的计算延迟。
服务器的性能一般比较强,但由于RSA证书私钥长度远大于客户端,所以服务端的计算延迟也会在5ms以上。
五、HTTPS协议为何没在互联网上全面采用?
很多人会有一个疑问:https够不够呢?肯定是不够的,但是没有更好的方案了,可为什么更安全的HTTPS协议没有在互联网上全面采用呢?简单来说,有以下几点:
1、SSL证书需要钱,功能越强大的证书费用越高,个人网站、小网站没有必要一般不会用。
2、SSL证书通常需要绑定IP,不能在同一IP上绑定多个域名,IPv4资源不可能支撑这个消耗。(SSL有扩展可以部分解决这个问题,但是比较麻烦,而且要求浏览器、操作系统支持,Windows XP就不支持这个扩展,考虑到XP的装机量,这个特性几乎没用。)
3、HTTPS连接缓存不如HTTP高效,大流量网站如非必要也不会采用,流量成本太高。
4、HTTPS连接服务器端资源占用高很多,支持访客稍多的网站需要投入更大的成本,如果全部采用HTTPS,基于大部分计算资源闲置的假设的VPS的平均成本会上去。
5、HTTPS协议握手阶段比较费时,对网站的相应速度有负面影响,如非必要,没有理由牺牲用户体验。
6、最关键的,SSL证书的信用链体系并不安全,特别是在某些国家(你们懂的)可以控制CA根证书的情况下,中间人攻击一样可行。
另外,在客户端被植入无数后门、木马的状况下,HTTPS连接的作用非常有限,这也许是支付宝不可能像PayPal那么易用的原因之一。
HTTPS是超文本传输协议,是HTTP的加密版和安全版,或者说搜索引会认为这种“带锁”的页面,这种页面一般用于银行、金融、网上支付对通讯安全要求较高的网站,搜索引擎并不太喜欢收录这些页面,可能只收录一些重要的页面,所以说全站HTTPS对SEO影响很大,搜索引擎还不能很好的收录HTTPS协议页面。
鉴于此,你可以分别使用HTTP和HTTPS,对于想要收录和排名的页面使用HTTP,或者网站上一些重要的页面,比如:首页,业务介绍页面等,可以允许HTTP形式也可以访问。