今年年初,Google在其安全博客上已经表明,从7月开始,chrome68会将所有的HTTP网站标记为不安全。随后,Mozilla也表明,Firefox浏览器也准备将所有HTTP网站标记为不安全。
届时,我们再去访问HTTP网站的时候,可能就会在地址栏里显示大红色的惊叹号,而且会提示不安全。这时候,作为一个用户,我们在访问时心里就会不安,因为我们并不知道这网站上显示的内容是不是服务器提供的内容,我们的账号或密码是否会泄露。
现在,距离这个时间点已经很近了,这也是最近越来越多的网站上HTTPS的原因。其实早在2015年,天猫淘宝已经实现了全站HTTPS,2015年底,阿里云CDN HTTPS也正式进入产品化,正式对外部客户提供HTTPS服务。
无论从Google Chrome、Firefox的数据,还是从客户和阿里集团内部的应用,都足以证明:HTTPS时代已经越来越近。
本文邀请到阿里云CDN技术专家王祖熙(金九),为大家分享阿里云CDN HTTPS的基础原理、业务架构与优化实践。
什么是HTTPS?
HTTPS里面的“S”代表“Security”,安全的HTTP。大家都知道HTTP是一个超文本传输协议,它的优点是简单、快速、灵活,它的缺点就是不安全,直接运行在TCP层之上,数据在网络上的传输是明文的,就可以被抓包并看到传输的内容,存在非常大的安全隐患。
互联网发展越来越快,网络也越来越发达与复杂,在一些利益的驱动下,一些恶意的运营商经常对用户的HTTP请求做劫持和篡改,如果一个网站现在还在用HTTP为用户提供服务,那一定会经常遇到网站被插入广告、泄露数据等问题。
因为安全——我们需要HTTPS
解决以上问题,我们就需要加密传输,这里有两种方法,一种方法是在HTTP的业务层做加密,这样做会非常地耦合,不通用。另一种就是用HTTPS,从网络模型上看就是在TCP层和HTTP层去做一层SSL层,由这一层来为HTTP层做数据的加解密服务:将HTTP层要发送的数据加密之后通过TCP来发送给对方,将接收到的加密数据解密之后交给HTTP,HTTP层不需关注加密和解密的细节而只需关注业务即可,这样对应用层来说是透明的,也便于客户端和服务器的实现和升级。
HTTPS时代的最大的推动者就是Google。下图是Chrome浏览器加载HTTPS网站的趋势,最上面这条线是美国的,2015年还不到50%,2016年大概在50-60%之间,现在已经超过80%,最下面这条是日本的趋势线,2015-2016年比较平稳的维持在25%左右,到2017年上升超过50%,现在已经超过60%。总体上看,全球用户使用HTTPS网站的趋势是比较明显的,估计国内HTTPS的加载占比在40% 左右,落后美国三年左右的时间。所以,国内的空间还很大,而且趋势是明显的,未来一两年会有越来越多的国内网站将切换到HTTPS。
哪些知名的网站使用了HTTPS?
搜索领域:谷歌、百度、bing、360搜索等等早已全站HTTPS了。
电商领域:天猫、淘宝早在15年已经全站HTTPS,京东也2016年底已全站HTTPS。
支付领域:支付宝、微信支付,以及所有的手机银行和网银,必然都是HTTPS。
社交领域:微信公众号和小程序、微博。
娱乐领域:今日头条、抖音、快手。
直播平台:虎牙、斗鱼、熊猫TV。
其他领域就不用一一列举了,可以说HTTPS适合于所有领域,只要你用了HTTP,遇到了被劫持、篡改、泄露等等安全问题,都可以使用HTTPS来解决。
那为什么还有一些用户不使用HTTPS呢?
用户的担忧来自于以下几个方面:
证书:不知道证书是什么东西,怎么去申请,去哪里申请,证书的费用,证书到期续签,私钥的安全管理等等问题。
性能:担心上了HTTPS性能会变差,服务器扛不住压力,客户端要做SSL握手,影响性能。
体验:因为要做SSL握手,需要握手时间,担心增加首包时间,影响用户体验。
难度:因为HTTPS需要SSL握手,SSL握手非常复杂,不像TCP那么简单,涉及到一套密码学的东西,比较有难度。而且是加密通信,出了问题不好排查,不像HTTP那样抓个包就能看出里面是什么东西。
以上的种种原因导致用户对于HTTPS还是有一点恐惧的。那么,阿里云CDN-HTTPS是如何帮助用户解决以上这些顾虑的呢?
如何消除顾虑 更好地使用HTTPS?
首先来看一下CDN HTTPS的业务流程
不管用户使用HTTP还是HTTPS访问CDN,都要先做域名DNS解析,然后访问到 CDN 的边缘服务器,如果静态资源缓存命中则直接响应给客户端,如果没有缓存命中或者是动态资源请求的话就需要回源到源站服务器获取。
那在用户这一侧,CDN提供了HTTP和HTTPS两种访问方式,开了HTTPS之后,HTTP也能访问,如果想要实现全站HTTPS的话,CDN提供了301跳转和HSTS的方式将HTTP访问都重定向到HTTPS,这样就可以实现HTTP自动跳转到HTTPS,对用户是无感知的。
用户这一侧是最重要的,劫持、篡改、盗链也是经常发生在这一侧,比如一些视频网站,为了收费会在链接后面加鉴权参数,如果用HTTP,那用户和CDN之间的部分恶意网络运营商完全可以抓包拿到鉴权成功的链接,从而实现盗链,这对视频网站的影响就比较大。
在CDN的内部,默认情况下也是全部走HTTPS,这是因为被劫持的情况比较多,经常被用户投诉,另外对有特殊需求的域名也可以走协议跟随。
在源站服务器这一侧,用户可以根据自己的服务器支持情况配置HTTP、HTTPS或者协议跟随回源,推荐配置 HTTPS 回源,实现全链路 HTTPS,更安全。
综上所述,整个业务流程还是很简单清晰的。
CDN HTTPS业务架构
CDN所有的HTTPS功能都可以通过配管后台来配置,最常用的证书/私钥、HTTPS跳转和HTTP/2功能已经开放到控制台让用户自行配置。
用户在控制台上可以选择在阿里云CA证书服务上购买的云盾证书,或者上传自己的已有证书,或者直接使用免费证书,一键开启HTTPS。
这些证书/私钥以及其他HTTPS配置会同步到阿里云证书管理系统,并不是同步到所有的CDN边缘节点服务器,当有HTTPS请求到边缘节点服务器时,再去证书管理系统获取证书,并缓存在本机,做一下证书的切换,从而实现配置的热加载,然后就可以完成SSL握手。没有全部同步到边缘节点服务器的原因,一是机器越多同步越需要时间生效时间越慢,二是没有必要,同步到那些没有访问的机器白白浪费机器内存。
基于以上的业务流程和架构,阿里云CDN HTTPS产品具备了一键开启、功能丰富、秒级生效和稳定可靠等特性,可以解决用户对证书、性能、体验和难度等等担忧的问题。那么这些特性对应的产品功能就有以下几个方面:
便捷接入——CDN HTTPS免费证书
目前大多数CDN或者云计算厂商提供HTTPS服务都需要让客户上传证书或者购买证书,这对于一般用户来说是一个负担,用户需要做一系列的工作,包括选择CA厂商,选定购买途径,选择证书类型,支付一笔证书的费用,配合CA做校验等等,辛苦辛苦申请下来的证书,格式多种多样,却不知道怎么配置,私钥也不知道怎么保管,证书到期前还得麻烦去续签和重新配置一遍,管理起来非常地麻烦。
大部分用户对HTTPS的需求无非是安全和在浏览器上显示小绿锁就可以了,并不是特别关心证书是个什么东西怎么申请怎么配置。
所以,CDN为了让更多用户更容易切到HTTPS,最近推出了免费证书的功能,对于那些不需要关心证书细节的用户就可以很容易地使用HTTPS。
CDN HTTPS配置
这是CDN控制台 HTTPS配置界面,可以看出HTTPS的配置非常简单,只提供了证书、HTTP/2设置和强制跳转这几个配置,点击HTTPS证书的修改配置按钮之后就可以配置证书。
在HTTPS设置界面可以根据自己的需求配置证书,有三种证书类型可以选择,可以选择在阿里云CA证书服务上购买的云盾证书,也可以上传已有的证书,另外一个就是免费证书,只需勾选同意授权阿里云申请免费证书和确认就可以使用HTTPS了(因为阿里云目前还不是CA机构,所以不能签发证书,需要用户授权),如此一来,CDN就帮助用户承担了原本最为繁琐的工作。
同时,有几点需要注意:
- 在使用HTTPS免费证书之前,需要确保用户的域名CNAME切到了阿里云CDN,不然CDN没法配合CA机构去做校验,校验失败的话CA也不会给这个域名签发证书。
- 需要注意域名的CAA记录,CAA记录的目的是防止其他CA误签证书,域名的DNS里面没有CAA记录还好,要有CAA记录的话得把digicert加进去才能申请证书成功,这是因为免费证书是由digicert这个CA机构来签发的。
- 因为是免费证书,所以目前只支持1个域名,还不支持泛域名证书。证书的有效期是1年,到期之前我们会自动续签和自动更新证书。
- www 域名要使用免费证书功能的话需要注意顶级域名也要切到CDN,这是因为www 域名免费证书自动绑定顶级域名(比如:www.a.com 开通免费证书会绑定两个域名:www.a.com和a.com)。
这样一来,用户就完全无需关注证书的细节了。只需关注HTTPS功能是否可用,浏览器地址栏上是不是已经有了绿色的小锁,在SSL labs上测试的安全等级是不是A就可以了(当然在阿里云CDN上的域名 HTTPS 的安全等级都是A)。
我们希望那些对证书有担忧和恐惧的用户可以去使用免费证书功能,更早的使用HTTPS。
TLSv1.3即将发布
TLS1.3从2014年开始提,经历了4年左右时间,总共28个草案的讨论、修改和优化,最终,在今年3月份,正式被IETF纳入标准化,目前只有chrome和firefox这两个浏览器支持,未来会有更多的浏览器支持。
TLS1.3相对于TLS1.2来说,主要的区别就是两点:更快、更安全。
了解TLS1.2的朋友可能知道,TLS1.2完整握手需要2个RTT,而TLS1.3在完整握手时仅需要1个RTT,甚至做到0个RTT,所以TLS1.3会比TLS1.2更快。
TLS1.3只支持完全前向安全性的密钥交换算法,简单地说就是不支持像RSA这种不太安全的密钥交换算法,因为使用这种密钥交换算法,RSA私钥泄露的话可以用来解密之前保存的SSL流量,不太安全。另外,TLS1.3的握手消息在ServerHello之后都是加密的,连传输的证书消息都是加密的,所以TLS1.3比TLS1.2更安全。
性能优化——HTTP/2
刚才讲到很多用户担心性能与用户体验,其实是因为大家不了解HTTP/2,如果了解到HTTP/2的这些优势,肯定能打消这些顾虑。
HTTP/2是二进制协议,相比HTTP/1.1的文本协议就有很大的优势,可以基于二进制协议做很多的优化,比如多路复用、头部压缩、以及服务器推送。提高并发性能,提高传输效率。
下图HTTP/1.1和HTTP/2的网络加载瀑布图,可以看出右边 HTTP/2 的连接利用率更高,并发更高,不用像 HTTP/1.1 时有些请求在白白等待阻塞其他请求。而且可以看出左边HTTP/1.1需要6个SSL 连接,右边HTTP/2只需要一个SSL连接,减少昂贵的SSL请求,对服务器和客户端都有好处。从测试结果来看,HTTP/2的总体加载时间更快,效果更好。
HTTP/2收益
第一个是加载时间的提升,我们之前做过一个测试,将一个大图片切成几百个小图片,放在一个页面上,分别用HTTP/1.1和HTTP/2去加载,HTTP/1.1需要五六秒才能加载完成,而HTTP/2只需要不到1秒就能加载完成。提升了5倍左右,虽然提升幅度有点夸张,但在特定业务场景下的确是能做到的。
第二个收益是头部压缩,HTTP/1.1的响应头平均大小在4到5百个字节,而使用HTTP/2之后,平均的响应头大小只有20多个字节,压缩率非常高,有了95%左右的提升。这个收益就非常适合头部占比过大的小文件业务场景,可以减少很多头部的带宽。
第三个收益是服务器QPS性能的提升,这得益于多路复用的优化,连接复用率变高了,服务器自然能处理更多的请求,本来你的服务器可能每秒只能处理5000个请求,用了HTTP/2之后可以处理到8000个请求,有了60%左右的提升。
性能优化——SSL session复用
另一个性能优化的方案是SSL session复用,它是提升ssl握手性能的主要手段之一。有两种session复用的方式:session id 和session ticket,了解 session id 复用的朋友可能会知道这种方案不支持分布式环境,session ticket支持分布式环境,但是session ticket的客户端支持率并不高,主流还是session id的方式,然后我们做了定制开发,支持了分布式缓存,上了这个优化之后,本来3%左右的session id占比提升到了20%多,提高了7倍左右,握手时间从将近80ms降低到了不到70ms,效果还是挺明显的,这样可以提高服务器的性能,降低首包时间,提高用户体验。
监控告警
下图所展现的就是阿里云所进行实时统计的错误类型以及根据错误类型进行的实时告警。如果没有这样的告警系统,业务往往会产生长时间中断。而这也是由阿里云成熟的架构作为保证的,而且阿里云HTTPS的配置也是秒级配置、热加载和秒级生效。
应用案例
下面来介绍两个应用案例,第一个是虎牙直播。直播平台面临最大的web问题是劫持、黑屏、花屏,早期虎牙直播并没有用HTTPS而是用HTTP,会遇到的问题就是黑屏花屏,这是因为直播流的某些帧比如关键帧被中间恶意运营商删除或者篡改了,甚至可以做到在直播视频流中插入广告,只是技术成本比较大而已。后来虎牙上了HTTPS才能解决这种问题,而且上了之后性能也没受影响,再也没有黑屏花屏的问题。
第二个应用案例是天猫&淘宝,也是阿里云CDN最大的内部客户,天猫&淘宝所有的静态资源比如图片、css、js文件都是跑在阿里云CDN上,天猫&淘宝早期只是在关键的登录和交易环节使用了HTTPS,随着互联网的发展,各种劫持篡改插广告等等问题层出不穷,就会遇到天猫首页大图被网络运营商换掉或插入广告的情况,这种情况对于用户、商家和平台来说都是有害无益的,所以只有上了全站HTTPS才能解决这种问题,所以经过了一年左右的时间,在2015年就实现了全站HTTPS。
这是天猫淘宝全站HTTPS之后加载性能的情况,性能不降反升,效果比HTTP 好很多,比如首页提升了20%左右,聚划算提升了30%,淘宝搜索也提升了6%。所以可以看出,HTTPS其实并不慢,完全不必担忧性能和用户体验的问题。
欢迎大家使用阿里云CDN的HTTPS,提前进入HTTPS时代。