OpenSSL 1.1.0+CloudFlare CHACHA20 Patch

SSLLABS检测结果

之前读过imququ博客上的文章,对OpenSSL 1.0.2添加CloudFlare Patch,使之支持CHACHA20-POLY1305并在不支持AES-NI的设备上优先采用包含此算法的加密套件。

CloudFlare也发布了用于OpenSSL 1.1.0的Patch。

#下载OpenSSL 1.1.0f, 校验SHA256, 解压缩
wget https://www.openssl.org/source/openssl-1.1.0f.tar.gz
wget https://www.openssl.org/source/openssl-1.1.0f.tar.gz.sha256
sha256sum openssl-1.1.0f.tar.gz
tar -zxvf openssl-1.1.0f.tar.gz

#下载CloudFlare Patch
wget https://raw.githubusercontent.com/cloudflare/sslconfig/master/patches/openssl__1.1.0_chacha20_poly1305.patch

#Patch OpenSSL
cd openssl-1.1.0f/
patch -p < ../openssl__1.1.0_chacha20_poly1305.patch

#编译&安装
./config --prefix=/opt/openssl-1.1.0f --openssldir=/etc/ssl shared enable-weak-ssl-ciphers enable-ssl3 enable-ssl3-method no-srp no-psk -Wl,-rpath=/opt/openssl-1.1.0f/lib
make
make install

应用编译好的OpenSSL(libssl)到http服务器

首先要修改加密套件顺序,必须将CHACHA20的加密套件放在最前面。
比如我使用的是:

ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-CHACHA20-POLY1305:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-SHA256:ECDHE-RSA-AES256-SHA384:DHE-RSA-AES128-SHA256:DHE-RSA-AES256-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA:DES-CBC3-SHA

得到如文章所附图片的效果。

1.Apache

分别执行ldd /usr/sbin/apache2ldd /usr/lib/apache2/modules/mod_ssl.so,得到类似如下输出:

	linux-vdso.so.1 =>  (0x00007ffe47d7f000)
	libssl.so.1.1 => /opt/openssl-1.1.0f/lib/libssl.so.1.1 (0x00007f7727f9f000)
	libcrypto.so.1.1 => /opt/openssl-1.1.0f/lib/libcrypto.so.1.1 (0x00007f7727b14000)
	libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f77278f7000)
	libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f772752d000)
	libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f7727329000)
	/lib64/ld-linux-x86-64.so.2 (0x00007f7728443000)

若其中一者有libssl.so,则重启Apache即可;若二者皆没有libssl.so,则需重新编译Apache。

*:如果Apache的编译参数中没有--enable-ssl-staticlib-deps,则重启即可;若有,需重新编译。

2.nginx

通过nginx -V查看其编译参数,若没有--with-openssl=,则重启nginx即可;若有,则需重新编译安装。

重新安装时,复制nginx -V执行结果中所有的编译参数并修改--with-openssl=后的路径,此路径为OpenSSL源码的路径,而非二进制的路径,额外的OpenSSL编译参数用--with-openssl-opt=添加。