知识点:什么是 CHACHA20-POLY1305?
HTTPS网站的普及使大家更加关注HTTPS性能优化,一般做HTTPS优化可能只是针对PC端,在移动端的效果并不理想。目前Google已经在移动端做了HTTPS的性能加速,为Android平台的Chrome浏览器增加了一个新的TLS加密套件:ChaCha20-Poly1305,这是专门为移动设备推出的加密套件。接下来我们深入探讨如何使用ChaCha20-Poly1305加密套件实现HTTPS移动端加速和省电。
当你使用chrome浏览器在手机上打开www.google.com的时候(如果你能打开的话),你会看浏览器上面的加密方式是 CHACHA20-POLY1305

为了能够更好的了解ChaCha20-Poly1305,先简单介绍对称加密和AES-NI
对称加密
在HTTPS握手过程,通过非对称加密协商出对称加密密钥,然后使用对称加密对双方通信的数据内容进行加密。非对称加密对服务器性能的开销是巨大的,通过Session Resume等方法可以进行加速。常见的非对称加密算法有RSA、ECDHE等。
在协商出对称加密密钥后,HTTPS中所有数据内容通信的加密都使用对称加密进行。对称加密分为流式加密和分组加密。
常见的流式加密算法有:RC4,ChaCha20-Poly1305。
常见的分组加密算法有:AES-CBC,AES-GCM。
RC4由于存在严重安全漏洞,已经基本不再使用;AES-CBC容易遭受BEAST和LUCKY13攻击,使用也逐渐减少,AES-GCM是它们的安全替代,AES-GCM也是目前最为流行的对称加密算法。
AES-NI
AES-GCM解决了对称加密存在的安全问题,但带来了性能问题。为此,出现了AES-NI(Advanced Encryption Standard New Instruction)。AES-NI是Intel和AMD微处理器上x86架构的一个扩展,可以从硬件上加速AES的性能,目前在服务器和PC端,CPU对AES-NI的支持率已经非常普及。
google推出的CHACHA20-POLY1305 加密套件对精简指令的CPU进行的优化,在ARM平台上一般没有AES硬件加速,AES加密套件在安卓手机上性能比较差。而谷歌的CHACHA20,就是为提高移动端的加/解密性能而生的。CHACHA20-POLY1305优点如下:

想成功编译CHACHA20-POLY1305,需要LibreSSL或boringSSL套件的支持,openssl本身不支持CHACHA20-POLY1305,但可以使用cloudflare打补丁后的openssl获得支持
科普下LibreSSl和boringSSL:
LibreSSL是OpenSSL加密软件库的一个分支,在OpenSSL爆出心脏出血安全漏洞之后,一些OpenBSD开发者于2014年4月创立了LibreSSL,目标是重构OpenSSL的代码,以提供一个更安全的替代品。LibreSSL复刻自OpenSSL库的1.0.1g分支(来至百度百科)
在OpenBSD创建OpenSSL分支LibreSSL两个月后,Google宣布了它创建的OpenSSL分支BoringSSL。 Google安全团队的Adam Langley在个人博客上说,他们使用了超过70个OpenSSL补丁,部分被接受合并到了OpenSSL主库,但大部分没有。所以他们决定创建OpenSSL分 支。但Google不打算取代OpenSSL,使用BoringSSL的代码不能保证API或ABI的稳定性,他们会继续向 OpenSSL递交bug修正,继续资助Core Infrastructure Initiative和OpenBSD基金会。OpenBSD创始人Theo de Raadt对此表示,有选择总是好的。
实现Nginx支持CHACHA20-POLY1305的三种方式:
这三种方法的优缺点大致如下:
LibreSSL
BoringSSL
openSSL本身是不支持CHACHA20-POLY1305加密的,但clouflare公司给openSSL打了一个patch,这个patch
可以应用到openssl-1.0.2h版本上,使openssl也支持了CHACHA20-POLY1305
Cloudflare patched openSSL
名词解释:
等价加密算法组(Equal preference cipher groups)
This allows a server consumer to specify multiple cipher suites at the same level of preference, so the server can enable SSL_OP_CIPHER_SERVER_PREFERENCE, but also take the client's preferences into account when selecting one of several ciphers that are all equally preferred.
SSL_OP_CIPHER_SERVER_PREFERENCE
When choosing a cipher, use the server's preferences instead of the client preferences. When not set, the SSL server will always follow the clients preferences. When set, the SSL/TLS server will choose its own preferences.
OCSP
OCSP(Online Certificate Status Protocol,在线证书状态协议)是维护服务器和其它网络资源安全性的两种普遍模式之一。OCSP克服了证书注销列表(CRL)的主要缺陷:必须经常在客户端下载以确保列表的更新。当用户试图访问一个服务器时,在线证书状态协议发送一个对于证书状态信息的请求。服务器回复一个“有效”、“过期”或“未知”的响应。协议规定了服务器和客户端应用程序的通讯语法。在线证书状态协议给了用户的到期的证书一个宽限期,这样他们就可以在更新以前的一段时间内继续访问服务器。
我这里使用patch过的openssl,这是因为它既支持等价加密算法组 又支持OCSP
最新版本的tengine 可以同时支持http2 和spdy http1.1 三种协议,这里编译tengine 使之支持同时支持者三种协议,并把CHACHA20-POLY1305的支持也编译进去。
下载需要的文件:
git clone https://github.com/alibaba/tengine.git
git clone https://github.com/cloudflare/sslconfig
git clone https://www-origin.openssl.org/source/openssl-1.0.2h.tar.gz
解压openssl-1.0.2h.tar.gz:
tar -zxvf openssl-1.0.2h.tar.gz
cd openssl
patch -p1 <../sslconfig/patches/openssl__chacha20_poly1305_draft_and_rfc_ossl102g.patch
./config
cp -rp openssl-1.0.2h /usr/local/openssl
进入 tengine 目录
cd tengine
把nginx动态tls补丁也打上
patch -p1 <../sslconfig/patches/nginx__dynamic_tls_records.patch
开始编译:
./configure --prefix=/webdata/opt/local/tengine --with-jemalloc --with-jemalloc=/usr/local/jemalloc --with-http_ssl_module --user=www --group=www --with-pcre --with-http_spdy_module --with-http_v2_module --with-openssl=/usr/local/openssl
说明:因为新版openssl使用了C++ 11的功能,现在Centos6和Centos7上面的GCC编译器版本都是4.4版本的,编译过程会报错,必须升级到gcc到4.8以上,如果是手动编译GCC
源码升级,请记住一块升级binutils 到2.22 以上,否则,你即使升级了GCC,编译也依然会报错。如果你像我一样懒,不想源码升级GCC,可以安装devtoolset
请按顺序执行下面几条命令(centos上面)
1,yum install centos-release-scl-rh centos-release-scl
2,yum check-update
3,yum install devtoolset-3-gcc devtoolset-3-gcc-c++
#(yum install devtoolset-4-gcc devtoolset-4-gcc-c++)安装devtoolset-4
4,source /opt/rh/devtoolset-3/enable
如果编译ngx_http_upstream_session_sticky_module 为共享模块的话,也会报错,编译静态模块就行了(tengine默认不加这个选项即为静态)

(安装session_sticky为共享模块的话会报错)

安装完成后,nginx配置文件中加密套件和协议指定如下:
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers EECDH+CHACHA20:EECDH+CHACHA20-draft:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5;
打开网站测试:

(同时支持httpv2 和spdy,如果都不支持的话,会使用http1.1)
为了验证支持对称加密算法组,分别在电脑上和手机上使用chrome浏览器打开网站。

pc上使用AES_128_GCM

手机上使用 CHACHA20-POLY1305加密
最后对网站的tls通过工具检测下:

完整的ssl配置文件参考我的这边文章:https://wenda.zuncuang.com/article/28
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!