抛弃 OpenSSL 使用 BoringSSL 编译 NGINX

分类:Linux 评论: 2

BoringSSL 是由谷歌开发,从 OpenSSL 中分离的一个分支。

BoringSSL 现阶段已经在 Chrome/Chromium 、 Android 等应用上。

项目主页:Google Source

镜像项目:Github

编译加密组件

依赖

# apt -y install build-essential make cmake golang

小贴士:是的,没错,编译需要 Go 语言支持,否则会看到以下报错。

CMake Error at CMakeLists.txt:57 (message):
  Could not find Go

克隆

定位至工作目录,推荐清理掉其他无关项目。

# cd /usr/local/src/

谷歌代码托管源

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

同理也可以使用 GitHub 源(推荐国内使用)

# git clone https://github.com/google/boringssl.git

编译

Ninja

# cd boringssl && mkdir build && cd build && cmake -GNinja .. && ninja

Make

# cd boringssl && mkdir build && cd build && cmake ..

若一切顺利则会提示

-- The ASM compiler identification is GNU
-- Found assembler: /usr/bin/cc
-- Configuring done
-- Generating done
-- Build files have been written to: /usr/local/src/boringssl/build

真正开始编译

# make && cd ../

编译结束后复制编译好的库到目标地址

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

标记已完成编译

# touch /usr/local/src/boringssl/.openssl/include/openssl/ssl.h

此步骤若不进行,则在编译 NGINX 时会看到以下报错。

make -f objs/Makefile
make[1]: Entering directory '/usr/local/src/nginx-1.15.10'
cd /usr/local/src/boringssl/ \
&& if [ -f Makefile ]; then make clean; fi \
&& ./config --prefix=/usr/local/src/boringssl//.openssl no-shared no-threads  \
&& make \
&& make install_sw LIBDIR=lib
/bin/sh: 3: ./config: not found
objs/Makefile:2102: recipe for target '/usr/local/src/boringssl//.openssl/include/openssl/ssl.h' failed
make[1]: *** [/usr/local/src/boringssl//.openssl/include/openssl/ssl.h] Error 127
make[1]: Leaving directory '/usr/local/src/nginx-1.15.10'
Makefile:8: recipe for target 'build' failed
make: *** [build] Error 2

至此为止, BoringSSL 编译完成。


连接 NGINX

下载源码

下载 最新主线版

# cd /usr/local/src/ && wget https://nginx.org/download/nginx-1.15.12.tar.gz

解压

# tar xf nginx-1.15.12.tar.gz

编译

# cd nginx-1.15.12

生成 Makefile

# ./configure \
--prefix=/etc/nginx \
--sbin-path=/usr/sbin/nginx \
--modules-path=/usr/lib/nginx/modules \
--conf-path=/etc/nginx/nginx.conf \
--error-log-path=/var/log/nginx/error.log \
--http-log-path=/var/log/nginx/access.log \
--pid-path=/var/run/nginx.pid \
--lock-path=/var/run/nginx.lock \
--http-client-body-temp-path=/var/cache/nginx/client_temp \
--http-proxy-temp-path=/var/cache/nginx/proxy_temp \
--http-fastcgi-temp-path=/var/cache/nginx/fastcgi_temp \
--http-uwsgi-temp-path=/var/cache/nginx/uwsgi_temp \
--http-scgi-temp-path=/var/cache/nginx/scgi_temp \
--user=nginx \
--group=nginx \
--with-compat \
--with-file-aio \
--with-threads \
--with-http_addition_module \
--with-http_auth_request_module \
--with-http_dav_module \
--with-http_flv_module \
--with-http_gunzip_module \
--with-http_gzip_static_module \
--with-http_mp4_module \
--with-http_random_index_module \
--with-http_realip_module \
--with-http_secure_link_module \
--with-http_slice_module \
--with-http_ssl_module \
--with-http_stub_status_module \
--with-http_sub_module \
--with-http_v2_module \
--with-http_xslt_module=dynamic \
--with-http_image_filter_module=dynamic \
--with-http_geoip_module=dynamic \
--with-http_perl_module=dynamic \
--with-google_perftools_module \
--with-mail \
--with-mail_ssl_module \
--with-stream \
--with-stream_realip_module \
--with-stream_ssl_module \
--with-stream_ssl_preread_module \
--with-cc-opt='-g -O2 -specs=/usr/share/dpkg/no-pie-compile.specs -fstack-protector-strong -Wformat -Werror=format-security -Wp,-D_FORTIFY_SOURCE=2 -fPIC' \
--with-ld-opt='-specs=/usr/share/dpkg/no-pie-link.specs -Wl,-z,relro -Wl,-z,now -Wl,--as-needed -pie' \
--with-openssl=/usr/local/src/boringssl/ \
--add-module=/usr/local/src/ngx_brotli

小贴士:其他组件不再赘述,请移至相关链接中查看。

# make

执行编译即可。

安装

# make install

小贴士:若当前有 NGINX 在工作,请先停止服务后再执行。

检查

安装成功后检查版本

# nginx -V

即可看到

nginx version: nginx/1.15.12
built by gcc 6.3.0 20170516 (Debian 6.3.0-18+deb9u1) 
built with OpenSSL 1.1.0 (compatible; BoringSSL) (running with BoringSSL)
TLS SNI support enabled

附录

相关链接

参考链接

回复
  1. Quarter

    移动端用的版本怎么编译?

    回复
    1. @Quarter

      可参考官网的编译方法 https://boringssl.googlesource.com/boringssl/+/HEAD/BUILDING.md#building-for-android

      回复