淘宝tengine编译openssl支持CHACHA20-POLY1305加密方法

知识点:什么是 CHACHA20-POLY1305? 当你使用chrome浏览器在手机上打开www.google.com的时候(如果你能打开的话),你会看浏览器上面的加密加密方式 CHACHA20-POLY1305                     ...

知识点:什么是 CHACHA20-POLY1305?

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

当你使用chrome浏览器在手机上打开www.google.com的时候(如果你能打开的话),你会看浏览器上面的加密方式是 CHACHA20-POLY1305                           


attachments-2016-08-BkrRv9Zb57b6f832c20e

为了能够更好的了解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优点如下:

  1. ChaCha20-Poly1305避开了现有发现的所有安全漏洞和攻击;
  2. ChaCha20-Poly1305针对移动端设备大量使用的ARM芯片做了优化,能够充分利用ARM向量指令,在移动设备上加解密速度更快、更省电;
  3. 更加节省带宽,Poly1305的输出是16字节,而HMAC-SHA1是20字节,可以节省16%的overhead消耗。

attachments-2016-08-avUs5LnZ57b56edc42be


想成功编译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的三种方式:

  1. 使用OpenBSD从OpenSSL fork的分支LibreSSL;
  2. 使用Google从OpenSSL fork的分支BoringSSL;
  3. 使用CloudFlare提供的OpenSSL Patch。

这三种方法的优缺点大致如下:

LibreSSL

  1. OpenBSD小组对OpenSSL的代码进行了全面清理并重构,更为轻量;
  2. 安全性能较openssl高
  3. 目前为止还不支持等价加密算法功能(Equal preference cipher groups)

BoringSSL

  1. 支持等价加密算法组功能(Equal preference cipher groups)
  2. 与Nginx编译友好性不足,编译容易出错,至少需要修改两处源码;
  3. 不支持OCSP Stapling功能。这一点是比较有意思的,Google工程师在博客上说OCSP Stapling存在缺陷,目前不支持,但不排除后面支持的可能性。联想到Chrome浏览器默认也不使用OCSP,可见Google对OCSP的情感是复杂的。


openSSL本身是不支持CHACHA20-POLY1305加密的,但clouflare公司给openSSL打了一个patch,这个patch

可以应用到openssl-1.0.2h版本上,使openssl也支持了CHACHA20-POLY1305


Cloudflare patched openSSL

  1. 需要给openssl打补丁,支持等价加密算法,支持OCSP协议;
  2. OpenSSL本身较重,存在的安全问题也多,需要频繁升级版本;
  3. Patch文件有版本限制,目前可以支持到最新稳定版openssl-1.0.2h(除非cloudflare持续更新补丁文件)

名词解释:

等价加密算法组(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默认不加这个选项即为静态)

attachments-2016-08-VyufX9Pi57b5a15c789f

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

attachments-2016-08-cuO7zIOe57b5a171c3c6


安装完成后,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;


打开网站测试:

attachments-2016-08-0FldpH1B57b5a24dc0bf

                                  (同时支持httpv2 和spdy,如果都不支持的话,会使用http1.1)


为了验证支持对称加密算法组,分别在电脑上和手机上使用chrome浏览器打开网站。

attachments-2016-08-yWBUYEgZ57b5a28f799b

             pc上使用AES_128_GCM

attachments-2016-08-2IhV7vf757b5a2d86ea8

                            手机上使用 CHACHA20-POLY1305加密


最后对网站的tls通过工具检测下

attachments-2016-08-RDDTNTgb57b5a3b595c1


完整的ssl配置文件参考我的这边文章:https://wenda.zuncuang.com/article/28







  • 发表于 2016-08-18 16:01
  • 阅读 ( 384 )

你可能感兴趣的文章

相关问题

0 条评论

请先 登录 后评论
石天
石天

437 篇文章

作家榜 »

  1. shitian 662 文章
  2. 石天 437 文章
  3. 每天惠23 33 文章
  4. 小A 29 文章