🤔中文 BoringSSL 介绍看这位大大文章 使用 BoringSSL 优化 HTTPS 加密算法选择

imgur图片在中国大陆无法访问,本文以下图片可能无法加载。

本章老旧没有更新,但依然具备些参考价值吧。


超久之前(公元 2014),谷歌推出了 ChaCha20-Poly1305 ,chacha20 在精简指令集架构 CPU , ARM 平台上优势明显( ARMv8 之前),减少等待时间,更为省电。然而这都是之前的事情。AMRv8 已经支持 AES 指令集,也就是说目前 chacha20 的速度优势已经不太明显。

现在 openssl 和 LibreSSL 都能启用 chacha20 (使用最新版)。但是会出现只要客户端支持,无论是桌面端还是移动端都会使用 chacha20 的情况。那么就需要 BoringSSL 的 "等价加密算法组(Equal preference cipher groups)" ,可以自动使用较为适合的算法。

桌面端 Chrome
PCchrome选择的算法.png

手机端 chrome
0_1484282433060_Screenshot_2017-01-13-12-34-38.jpeg

虽然前面说了目前 chacha20 速度优势已经不明显,但还是折腾玩一下。:bubble_funny: 正如官方页面所说,BoringSSL 稳定性无法保证。它也不支持 OCSP Stapling .


准备启用 BoringSSL

服务器系统 Centos7 ,
web 程序使用 nginx , 截至发文前最新版本 Nginx-1.11.8

下载 Nginx-1.11.8 来更新 nginx

wget http://nginx.org/download/nginx-1.11.8.tar.gz
tar -zxvf nginx-1.11.8.tar.gz

BoringSSL

git clone https://boringssl.googlesource.com/boringssl

安装 golang ,如果在编译 BoringSSL 时遇到缺少 golang 的问题

yum install golang cmake

编辑安装 BoringSSL .
其他详细介绍查看 https://boringssl.googlesource.com/boringssl/+/HEAD/BUILDING.md

进入 BoringSSL 目录

cd boringssl

创建 build 目录,并且进入

mkdir build && cd build

编译后返回 BoringSSL 主目录

cmake ..
make
cd ..

创建 openssl 目录,然后各种移动文件...

mkdir -p .openssl/lib && cd .openssl && ln -s ../include . && cd ../
cp build/crypto/libcrypto.a build/ssl/libssl.a .openssl/lib

cd ..

安装 Nginx

一些准备,查看 Nginx 目前版本和上一次编译参数用来备忘 (如果已经安装过 Nginx)

nginx -V

关闭 nginx 后开始重新编译安装 nginx ,注意 --with-openssl 要指向 BoringSSL 目录。
这里参数要完整一些

cd nginx-1.11.8

./configure  --prefix=/usr/local/nginx \
--sbin-path=/usr/local/sbin/nginx \
--conf-path=/etc/nginx/nginx.conf \
--error-log-path=/var/log/nginx/error.log \
--http-log-path=/var/log/nginx/access.log \
--pid-path=/run/nginx.pid \
--user=nginx \
--group=nginx \
--lock-path=/run/lock/subsys/nginx \
--with-http_ssl_module  \
--with-http_v2_module \
--with-http_stub_status_module \
--with-http_gzip_static_module \
--without-mail_pop3_module \
--without-mail_imap_module \
--without-mail_smtp_module \
--with-mail_ssl_module \
--with-http_mp4_module \
--with-http_flv_module \
--with-http_realip_module \
--with-http_gunzip_module \
--with-http_image_filter_module \
--with-file-aio \
--with-http_addition_module \
--with-openssl=/root/boringssl 

修改时间,避免 Nginx 再次编译 BoringSSL
touch /root/boringssl/.openssl/include/openssl/ssl.h

make
make install

nginx -V 查看版本是否被更新,然后重新配置 .conf 文件 ,加入等价加密算法

server {
    listen 443 ssl http2 fastopen=3;
    server_name www.set-fire.com;      
    ssl on;
    ssl_certificate /.../fullchain.pem;
    ssl_certificate_key /.../privkey.pem;
    ssl_dhparam  /.../dhparams.pem;
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    ssl_ciphers   [ECDHE-ECDSA-AES128-GCM-SHA256|ECDHE-ECDSA-CHACHA20-POLY1305]:[ECDHE-RSA-AES128-GCM-SHA256|ECDHE-RSA-CHACHA20-POLY1305]:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256:AES128-GCM-SHA256:AES256-GCM-SHA384:DES-CBC3-SHA;
    ssl_prefer_server_ciphers on;

...
}

大概完成配置。如果我没有忘记一些步骤...

启动 nginx ,看看有没有出错:bubble_funny:

最后由 BlueBlue_Master 编辑