截止目前的OpenSSL-1.0.2j的版本還不支持Google的CHACHA20加密算法.CHACHA20加密算法相對RC4等相對安全,也針對ARM的手機端進行優化,使其更快更省電。
不過最新的Intel處理器及ARM V8的處理器通過AES-NI指令集對AES-GCM加密算法進行了優化,速度要比chacha20快很多,所以在支持AES-NI指令集的設備上優先使用AES-GCM加密算法,在設備不支持的情況下使用chacha20加密算法。
支持chacha20加密算法的3種方式:
使用LibreSSL(OpenBSD Fork)
使用BoringSSL(Google Fork)
使用CloudFlare提供的Patch
三種方法對比:
LibreSSL能支持OCSP stapling,但是如果首選了CHACHA20作爲優先算法,則只要支持CHACHA20算法的都是用CHACHA20算法,支持AES-NI指令集的設備無法發揮出相應的性能
BoringSSL則可以對支持AES-NI指令集的設備優先使用AES-GCM加密算法,但是目前不支持OCSP stapling
使用CloudFlare提供的Patch則可以自動適應,AES-NI設備使用AES-GCM,不支持的設備使用CHACHA20
環境:
CentOS 6.8 x86_64
OpenSSL-1.0.2j
Nginx-1.10.2
下載CloudFlare提供的Patch
wget https://codeload.github.com/cloudflare/sslconfig/zip/master
下載OpenSSL
wget https://www.openssl.org/source/openssl-1.0.2j.tar.gz
下載Nginx
wget http://nginx.org/download/nginx-1.10.2.tar.gz
安裝依賴包
yum -y install gcc gcc-c++ pcre-devel zlib-devel unzip patch
解壓文件
unzip master tar zxf nginx-1.10.2.tar.gz tar zxf openssl-1.0.2j.tar.gz
對OpenSSL進行補丁操作
cd openssl-1.0.2j patch -p1 < ../sslconfig-master/patches/openssl__chacha20_poly1305_draft_and_rfc_ossl102j.patch #此處說明一下須使用同版本的補丁,我這裏是1.0.2j就用ossl102j的patch cd ..
編譯Nginx
cd nginx-1.10.2 ./configure --prefix=/usr/local/nginx1.10.2 --user=www --group=www --with-openssl=../openssl-1.0.2j --with-http_stub_status_module --with-http_ssl_module --with-http_gzip_static_module make && make install
如果執行make && make install的時候報錯,則需要
make -f objs/Makefile make[1]: Entering directory `/root/nginx-1.10.2' cd ../openssl-1.0.2j \ && if [ -f Makefile ]; then make clean; fi \ && ./config --prefix=/root/nginx-1.10.2/../openssl-1.0.2j/.openssl no-shared \ && make \ && make install_sw LIBDIR=lib make[2]: Entering directory `/root/openssl-1.0.2j' Makefile is older than Makefile.org, Configure or config. Reconfigure the source tree (via './config' or 'perl Configure'), please. make[2]: *** [Makefile] Error 1 make[2]: Leaving directory `/root/openssl-1.0.2j' make[1]: *** [../openssl-1.0.2j/.openssl/include/openssl/ssl.h] Error 2 make[1]: Leaving directory `
上面的報錯信息是因爲打了補丁的原因,提示Makefile.org比Makefile新,所以停止操作。這個時候我們可以手動編譯OpenSSL
cd ../openssl-1.0.2j ./config --prefix=/root/nginx-1.10.2/../openssl-1.0.2j/.openssl no-shared make make install_sw LIBDIR=lib
再次執行make && make install就不會報錯了
查看結果:
/usr/local/nginx1.10.2/sbin/nginx -V nginx version: nginx/1.10.2 built by gcc 4.4.7 20120313 (Red Hat 4.4.7-17) (GCC) built with OpenSSL 1.0.2j 26 Sep 2016 TLS SNI support enabled configure arguments: --prefix=/usr/local/nginx1.10.2 --user=www --group=www --with-openssl=../openssl-1.0.2j --with-http_stub_status_module --with-http_ssl_module --with-http_gzip_static_module
可以看到的是OpenSSL 1.0.2j.
然後Nginx的配置文件如下:
server { listen 443; server_name m.abc.com; access_log logs/https_m.abc.com.log main; ssl on; ssl_certificate keys/server.pem; ssl_certificate_key keys/server.key; ssl_protocols TLSv1 TLSv1.1 TLSv1.2; ssl_prefer_server_ciphers on; #定義加密算法 ssl_ciphers EECDH+CHACHA20:EECDH+CHACHA20-draft:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5; ssl_session_timeout 5m; ssl_session_cache builtin:1000 shared:SSL:10m; location / { root html; index index.html; }
不支持AES-NI指令集的手機訪問使用CHACHA20_POLY1305進行加密和身份驗證
支持AES-NI指令集的手機訪問使用AES_128_GCM進行加密和身份驗證