https://imququ.com/post/optimize-ssl-ciphers-with-boringssl.html
首先,获取编译所需的 Nginx 和 BoringSSL 源码,Nginx 从 1.7.4 开始支持 BoringSSL,这里我直接使用最新版:
BASHwget http://nginx.org/download/nginx-1.9.6.tar.gz
tar xzf nginx-1.9.6.tar.gz
git clone https://boringssl.googlesource.com/boringssl
现在,当前目录下应该有这两个子目录:
boringssl/
nginx-1.9.6/
确认无误后,还要做一些准备工作:
BASH# 安装编译 BoringSSL 所需的 Golang
sudo apt-get install golang
# 安装编译 Nginx 所需的工具和依赖库
sudo apt-get install build-essential libpcre3 libpcre3-dev zlib1g-dev
# 忽略编译过程中的 Warning(不加这个,编到一半会因为 Warning 太多无法继续)
export CFLAGS="-Wno-error"
编译 BoringSSL:
BASH# 进入 BoringSSL 源码根目录
cd boringssl
# 创建 build 目录并编译,完成后回到 BoringSSL 源码根目录
mkdir build && cd build && 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 了:
BASH# 进入 Nginx 源码根目录
cd nginx-1.9.6
# 指定使用 BoringSSL 作为 SSL 库
./configure --with-openssl=../boringssl --with-http_v2_module --with-http_ssl_module
# 修改时间,避免 Nginx 再次编译 BoringSSL
touch ../boringssl/.openssl/include/openssl/ssl.h
touch 后可以开始 make
和 make install
了。这期间可能还会遇到这样一个报错:
'SSL_R_BLOCK_CIPHER_PAD_IS_WRONG' undeclared
这是因为 BoringSSL 删掉了这个变量。找到报错文件 src/event/ngx_event_openssl.c
中对应的位置:
|| n == SSL_R_BLOCK_CIPHER_PAD_IS_WRONG /* 129 */
删掉这一行,或者加个判断都可以解决问题:
BASH#ifdef SSL_R_BLOCK_CIPHER_PAD_IS_WRONG
|| n == SSL_R_BLOCK_CIPHER_PAD_IS_WRONG /* 129 */
#endif
其他应该没什么问题了。make install
之前记得先停掉 nginx 服务,不然很可能需要手动杀死之前的 nginx 进程。一切妥当后,参考前文修改 ssl_ciphers
并启动服务,搞定收工!