三种方法实现移动端HTTPS的加速和省电

标签: https 移动端页面 chacha20-poly1305 野狗 性能优化 | 发表时间:2015-12-29 19:56 | 作者:野狗
出处:http://segmentfault.com/blogs

作者:王继波
野狗科技运维总监,曾在360、TP-Link从事网络运维相关工作,在网站性能优化、网络协议研究上经验丰富。
野狗官博: https://blog.wilddog.com/
野狗官网: https://www.wilddog.com/
公众订阅号:wilddogbaas

图片描述
HTTPS网站的普及使大家更加关注HTTPS性能优化,一般做HTTPS优化可能只是针对PC端,在移动端的效果并不理想。去年Google就已经在移动端做了HTTPS的性能加速,为Android平台的Chrome浏览器增加了一个新的TLS加密套件:ChaCha20-Poly1305,这是专门为移动设备推出的加密套件。接下来我们深入探讨如何使用ChaCha20-Poly1305加密套件实现HTTPS移动端加速和省电。

下图是在iPhone Chrome上打开Google日本网站后的加密信息截图。

图片描述

野狗WildDog已经全站支持在移动设备上更高性能、更省电的加密套件ChaCha20-Poly1305。下面是在Chrome上打开野狗官网的加密信息截图。

图片描述

为了能够更好的了解ChaCha20-Poly1305,先简单介绍对称加密和AES-NI。

对称加密与AES-NI

对称加密

在HTTPS握手过程,通过非对称加密协商出对称加密密钥,然后使用对称加密对双方通信的数据内容进行加密。非对称加密是服务器性能的开销是巨大的,通过Session Resume等方法可以进行加速。常见的非对称加密算法有RSA、ECDHE等。

在协商出对称加密密钥后,HTTPS中所有数据内容通信的加密都使用对称加密进行。对称加密分为流式加密和分组加密。

  • 常见的流式加密算法有:RC4,ChaCha20-Poly1305。

  • 常见的分组加密算法有:AES-CBC,AES-GCM。

RC4由于存在严重安全漏洞,已经基本不再使用;AES-CBC容易遭受BEAST和LUCKY13攻击,使用也逐渐减少,AES-GCM是它们的安全替代,AES-GCM也是目前最为流行的对称加密算法。

安全风险可参看ssllabs上的相关文章:
https://community.qualys.com/blogs/securitylabs/2013/03/19/rc4-in-tls-is-broken-now-what

AES-NI

AES-GCM解决了对称加密存在的安全问题,但带来了性能问题。为此,出现了AES-NI(Advanced Encryption Standard New Instruction)。AES-NI是Intel和AMD微处理器上x86架构的一个扩展,可以从硬件上加速AES的性能,目前在服务器和PC端,CPU对AES-NI的支持率已经非常普及。

测试结果:服务器开启AES-NI后,性能提高了5-8倍左右,这与Intel官方公布的数据基本是一致的。

图片描述

测试方法:

可以使用OpenSSL测试也可以使用其他SSL库测试,因为所有SSL库都支持AES-128-GCM。

图片描述

关于AES-NI的指令集,推荐查看Shay Gueron编写的《Intel 高级加密标准 (AES) 指令集 (2010)》。 https://software.intel.com/en-us/articles/intel-advanced-encryption-standard-aes-instructions-set

ChaCha20-Poly1305优势何在?

Google推出新的加密套件并在所有移动端的Chrome浏览器上优先使用原因:

  1. ChaCha20-Poly1305避开了现有发现的所有安全漏洞和攻击;

  2. ChaCha20-Poly1305针对移动端设备大量使用的ARM芯片做了优化,能够充分利用ARM向量指令,在移动设备上加解密速度更快、更省电;

  3. 更加节省带宽,Poly1305的输出是16字节,而HMAC-SHA1是20字节,可以节省16%的overhead消耗。

通过实际的测试数据来看看ChaCha20-Poly1305在移动端使用的优势。

测试一:

在支持AES-NI扩展的设备上,AES加密的性能优势是明显的。 目前最为常用的对称加密AES-128-GCM的性能是ChaCha20-Poly1305的近5倍。

图片描述

由于原生的OpenSSL目前还不支持ChaCha20-Poly1305,通过编译LibreSSL源码(最新源码下载地址: http://ftp.openbsd.org/pub/OpenBSD/LibreSSL)来进行测试。

测试方法:

进入到编译后的LibreSSL目录,通过下面的命令测试。

./apps/openssl/openssl speed -elapsed -evp chacha
./apps/openssl/openssl speed -elapsed -evp aes-128-gcm
./apps/openssl/openssl speed -elapsed -evp aes-256-gcm
./apps/openssl/openssl speed -elapsed -evp aes-128-cbc
./apps/openssl/openssl speed -elapsed -evp aes-256-cbc

测试二:

在不支持AES-NI扩展的移动设备上,ChaCha20-Poly1305的性能是AES-GCM的三倍左右。

图片描述

对称加密最合理的使用方法是:在支持AES-NI的设备上,优先使用AES-128-GCM加密套件;在不支持AES-NI的移动设备上,特别是ARM架构的设备上,优先使用ChaCha20-Poly1305加密套件。

Nginx实现ChaCha20-Poly1305的三种方法

OpenSSL官方版本目前不支持ChaCha20-Poly1305,所以不能使用原生的OpenSSL版本。关注OpenSSL官方的动态( https://www.openssl.org/news/changelog.html )。

在Nginx上实现ChaCha20-Poly1305主流的方法有三种:

  1. 使用OpenBSD从OpenSSL fork的分支LibreSSL;

  2. 使用Google从OpenSSL fork的分支BoringSSL;

  3. 使用CloudFlare提供的OpenSSL Patch。

主流的三种方法,都已经在服务器上部署成功并经过流量测试,各有优缺点。具体的部署方法、Nginx配置、部署过程可能会遇到的错误及解决方法,涉及的内容太多,相关内容如下:

  • Nginx编译安装BoringSSL

  • Nginx编译安装LibreSSL

  • Nginx编译安装CloudFlare提供的OpenSSL Patch

下面是我总结的这三种方法的优缺点,这个欢迎大家补充。

LibreSSL

  1. 编译安装方法最为简单;

  2. OpenBSD小组对OpenSSL的代码进行了全面清理并重构,更为轻量;

  3. 已经发布稳定版本,相比于OpenSSL团队,问题修复更及时。

BoringSSL

  1. 支持等价加密算法组功能(Equal preference cipher groups),这功能我认为很有意思,在后面博客中再介绍;

  2. 与Nginx编译友好性不足,编译容易出错,至少需要修改两处源码;

  3. 不支持OCSP Stapling功能。这一点是比较有意思的,Google工程师在博客上说OCSP Stapling存在缺陷,目前不支持,但不排除后面支持的可能性。联想到Chrome浏览器默认也不使用OCSP,可见Google对OCSP的情感是复杂的。
    https://www.imperialviolet.org/2014/04/19/revchecking.html

OpenSSL Patch

  1. 编译安装过程较为复杂;

  2. OpenSSL本身较重,存在的安全问题也多,需要频繁升级版本;

  3. 稳定性需要进一步验证。

目前野狗WildDog网站使用的是LibreSSL,来解决移动端的加速省电等新性能,如果你有疑问,或者想更多交流,或者在使用ChaCha20-Poly1305时遇到问题,都欢迎和我们联系。最后附上野狗官网(www.wilddog.com)在ssllabs上评测结果中截图。

图片描述

相关 [方法 移动 https] 推荐:

三种方法实现移动端HTTPS的加速和省电

- - SegmentFault 最新的文章
野狗科技运维总监,曾在360、TP-Link从事网络运维相关工作,在网站性能优化、网络协议研究上经验丰富. 野狗官博: https://blog.wilddog.com/. 野狗官网: https://www.wilddog.com/. 公众订阅号:wilddogbaas. HTTPS网站的普及使大家更加关注HTTPS性能优化,一般做HTTPS优化可能只是针对PC端,在移动端的效果并不理想.

https单向/双向认证及tomcat配置https方法

- - 行业应用 - ITeye博客
https单向/双向认证及tomcat配置https方法. 1.单向认证,就是传输的数据加密过了,但是不会校验客户端的来源. 2.双向认证,如果客户端浏览器没有导入客户端证书,是访问不了web系统的,找不到地址. 如果想要用系统的人没有证书就访问不了系统的话,就采用双向. 使用keytool为Tomcat生成证书,假定目标机器的域名是“localhost”,keystore文件存放在“C:\OctopusStoreKey\SP2014.keystore”,口令为“123456”,使用如下命令生成:.

nginx强制使用https访问的多种方法(http跳转到https)

- - C1G军火库
nginx强制使用https访问的多种方法(http跳转到https). 先说明一下HTTP跳转的状态码. 301 Moved Permanently:该方式将所有的 HTTP 请求重定向到 HTTPS 上,并且该重定向是永久性的. 客户端在收到 301 响应后,会自动将 HTTP 请求转为 GET 请求,同时将请求地址修改为重定向后的地址.

常见HTTPS攻击及防御方法详解

- - 极客521 | 极客521
研究常见的https攻击方法. Beast crime breach,并针对https的特性提出一些安全部署https的建议. 针对于HTTPS的攻击,多存在于中间人攻击的环境中,主要是针对于HTTPS所使用的压缩算法和CBC加密模式,进行side-channel-attack. 这几类攻击的前置条件都比较苛刻,且都需要受害主机提交很多次请求来收集破译关键数据的足够信息.

三种解密 HTTPS 流量的方法介绍

- - IT技术博客大学习
标签:   HTTPS.    Web 安全是一项系统工程,任何细微疏忽都可能导致整个安全壁垒土崩瓦解. 拿 HTTPS 来说,它的「内容加密、数据完整性、身份认证」三大安全保证,也会受到非法根证书、服务端配置错误、SSL 库漏洞、私钥被盗等等风险的影响. 很多同学认为只要访问的网站地址前有一把小绿锁就绝对安全,其实不然.

salt-api https证书报错解决方法

- - 运维技术的个人空间
问题的原因是“SSL: CERTIFICATE_VERIFY_FAILED”. Python 升级到 2.7.9 之后引入了一个新特性,当使用urllib.urlopen打开一个 https 链接时,会验证一次 SSL 证书. 而当目标网站使用的是自签名的证书时就会抛出一个 urllib2.URLError: 的错误消息,详细信息可以在这里查看(https://www.python.org/dev/peps/pep-0476/).

Chrome浏览器强制http重定向到https的简单方法

- Coolxll - Chrome迷
有的朋友修改host进某些网站,但每次进入都是诸如 http://twitter.com ,大多时候有可能进不去. 前段时间就算修改了,输入http://plus.google.com ,G+也是也进不去的,需要手动修改http为https,方能进入. 今天,在Google+看到一篇介绍Chrome浏览器强制http重定向到https的简单方法,搬到这里来,纯粹的Chrome技巧.