谈如何优化 HTTPS 的性能之前,我们先来看看整个 TLS 握手流程,如下图:
如图中所示,一个握手过程最坏的情况下,要分为八个步骤:
发送 Syn 包到 Web 客户端,收到并确认后,同时发送 SynAck 到服务器,这时还是一个 HTTP 的请求。
HTTP 转换 HTTPS,需要做一次 302 或者 301 跳转。
用户再次发送 HTTPS 请求,做一次 TCP 握手。
做 TLS 完全握手第一阶段,Clienthello 到 Server hello。
当证书首次到客户端,客户端需要走验证流程,做 CA 域名解析。
第二次,TLS 握手。
在线证书合法性校验的过程。
TLS 完全握手第二阶段,底部灰色部分才是真正的数据通讯。
苏宁易购的全站 HTTPS 方案在性能优化方面做了很多事情,如 HSTS、Session resume、Ocsp stapling 的合理使用,如客户端 HTTPS 性能、HttpDNS 解决 DNS 攻击劫持等优化。
01、网页制作技巧之HSTS 的合理使用
Web 安全协议 HSTS 的作用是强制客户端(如浏览器)使用 HTTPS 与服务器创建连接。
优点是减少 HTTP 做 302 跳转的开销。302 跳转不仅暴露了用户的访问站点,也很容易被中间者劫持(降级劫持、中间人攻击),最重要是降低了访问速度(影响性能)。
缺点是 HSTS 在 max-age 过期时间内,在客户端是强制 HTTPS 的,服务端无法控制。
因此,当需要降级时,HTTPS 无法及时切换到 HTTP。当然你也可以通过手动动态去配置 max-age 的值,这样可以通过将 max-age 设置为 0 来达到降级效果。
还有 HSTS 是严格的 HTTPS,一旦网络证书错误时,网页将直接无法访问(用户无法选择忽视)。
02、网页设计注意Session resume 的合理使用
当用户端和客户端、客户端和服务端完成第一次 TLS 握手之后,第二次数据传输还需要 TLS 握手吗?
这里可以采用 Session 复用的方式。Session resume(会话复用),是 RFC 标准中早就定好的一个机制,HTTPS 最初发布时就已经涉及其中。
Session 复用有 Session ID 和 Session tickets 两种方式,下图是实现流程:
Session ID。使用 clienthello 中的 session ID 查询服务端的 session cache,如果服务端有对应的缓存,则直接使用已有的 session 信息提前完成握手,称为简化握手。
Session ID 是 TLS 协议的标准字段,市面上的浏览器全部都支持 Session ID。需要注意的是,单机多进程间共享 ssl session 对集群环境是没有意义的。
因此,在这里需要实现多机共享 Session ID。可以放在 redis 中,nginx 提供了专门处理 Session ID 的模块 ssl_session_fetch_by_lua_block。
Session tickets。Session tickets 是会话 ID 的一种补充,server 将session 信息加密成 ticket 发送给浏览器,浏览器在后续握手请求时会发送 ticket,server 端如果能成功解密和处理 ticket,就能完成简化握手。
显然,session ticket 的优点是不需要服务端消耗大量资源来存储 session 内容。但是 session ticket 只是 TLS 协议的一个扩展特性,目前的支持率不是很广泛,只有 60% 左右。
还需要维护一个全局的 KEY 来加解密,需要考虑 KEY 的安全性和部署效率。
03、网站制作注意Ocsp stapling 的合理使用
Ocsp 全称在线证书状态检查协议 (rfc6960),用来向 CA 站点查询证书状态,比如证书是否被撤销,是否已经过期等。
通常情况下,浏览器使用 OCSP 协议发起查询请求,CA 返回证书状态内容,然后浏览器接受证书是否可信的状态。
如下图,是 Ocsp 实现流程:
这个过程非常消耗时间,因为 CA 站点有可能在国外,导致网络不稳定,RTT 也比较大。那有没有办法不直接向 CA 站点请求 OCSP 内容呢?
ocsp stapling 就能实现这个功能。ocspstapling 的原理简单来说是服务端代替客户端完成 CA 校验证书的过程,节省用户端的时间开销。
就是当浏览器发起 clienthello 时会携带一个 certificate status request 的扩展,服务端看到这个扩展后将 OCSP 内容直接返回给浏览器,完成证书状态检查。
由于浏览器不需要直接向 CA 站点查询证书状态,这个功能对访问速度的提升非常明显。
网站建设技巧之HTTPS 方案之灰度上线篇
灰度上线可遵循灰度、降级和开闭三大原则。灰度原则是指整个上线过程要按区域、版本、用户等级来进行灰度,通过灰度收集上来的用户数据来决定整个计划的进行。
降级原则保证每一步的操作都是可逆可回滚的,即对扩展开放,对修改关闭,这是可复用设计的基石。
01、网站制作技巧之HTTPS 开关控制
HTTPS 开关控制方面,苏宁主要建设内容管理、CDN、客户端三大开关:
内容管理开关。内容管理开关的作用是保证所有运营维护的链接都可以被替换。
CDN 开关。每个页面,从 HTTP 到 HTTPS 都需要做 301 跳转,这些跳转都配置在 CDN 中。
客户端开关。就是移动加速 SDK 的开关。
02、网页设计之上线过程中遇到的新问题如何解决
做完开关控制,在正式上线的过程中,又遇到了一些新问题如:Referrer、DNS 劫持、HTTPS 性能监控等。
Referrer
目前大部分浏览器,在发生协议降级时默认不发送 Referrer 信息,最典型的场景就是从 HTTPS 页面点链接跳到 HTTP 网站时,浏览器并不会在请求头中带上 Referer 字段。当 Referrer 带不过去,对大数据的影响非常大,因为没办法追溯流量来源。
针对现代的浏览器,这个问题可以通过给页面加上下面这个 meta 标签来解决:
<meta name="referrer" content="always" />
DNS 劫持
DNS 劫持是指非法破坏域名的解析过程导致请求被解析到一个错误节点以达到某些恶意目的。当我们使用 HTTP时,DNS 异常可能还不会影响请求的功能性,但 HTTPS 因为非法节点没有证书和私钥,肯定是无法响应了。
苏宁的做法的是通过一些波测监控 DNS 的正常,如下图,我们监测到苏宁中华特色馆在某个地区有大量 DNS 解析异常。
出现 DNS 劫持,对用户影响很大,一旦出现一次页面打不开,用户就会认为这个页面有问题,不会在进行二次访问。
如下图,是苏宁易购河北地区出现的问题:
如图中所示,页面整个框架都在,但就是没有图片,最终确定是由 DNS 劫持导致的。
这里的应对方法就是要建立完整的风控体系,在全国各地建设波测节点,做整个请求图片、页面的记录,并保存,如下图:
当时,河北地区用户发出请求后,TCP 没有办法建立连接,使用 SSL 无法握手。原因是 DNS 劫持,被映射到非法的错误节点上了。
应对方法还是我刚才说的降级手段,通过 IP 判断是河北移动的用户就对 HTTPS 进行降级成 HTTP,其他地方还继续使用 HTTPS 策略。待当地运营商解决问题之后,再进行恢复。
网页设计方法HTTPS 性能监控
如下图,是苏宁易购移动端的监控页面:
HTTPS 灰度最重要的一个是做好监控,必须要有一个监控覆盖,要做好灰度,每一步上线时都要分析一下业务、性能、站内站外投放,CPS 等数据。
一切数据分析都正常之后,再逐步扩大区域,按 APP 的版本和用户级别进行部署。
网页制作技巧HTTPS 未来展望篇
这里分享一个基于 UDP 的低时延的互联网传输层协议:QUIC(Quick UDP Internet Connection)。
TCP/IP 协议族是互联网的基础,这个 UDP 协议由谷歌提出,其用意是替代 TCP 协议。
这两种协议,UDP 更为轻量,错误校验也要少得多,但可靠性方面要弱于 TCP。目前,针对 QUIC 协议,国外一些公司在试用阶段,强调的是既保证安全,又能保证握手不会对原来的传输造成影响,这也许是未来的发展方向。深圳网站建设博纳网络编辑整理。
[声明]本网转载网络媒体稿件是为了传播更多的信息,此类稿件不代表本网观点,本网不承担此类稿件侵权行为的连带责任。故此,如果您发现本网站的内容侵犯了您的版权,请您的相关内容发至此邮箱【qin@198bona.com 】,我们在确认后,会立即删除,保证您的版权。