十年网站开发经验 + 多家企业客户 + 靠谱的建站团队
量身定制 + 运营维护+专业推广+无忧售后,网站问题一站解决
tl;dr: 用上 LibreSSL 已经第二个夜晚了 ... 依然运行良好

创新互联公司专注于企业成都全网营销、网站重做改版、防城网站定制设计、自适应品牌网站建设、成都h5网站建设、商城开发、集团公司官网建设、成都外贸网站建设、高端网站制作、响应式网页设计等建站业务,价格优惠性价比高,为防城等各大城市提供网站开发制作服务。
7月11日,LibreSSL团队发布 LibreSSL 的可移植版本,这是第一个可在 OpenBSD, Linux, OSX, Solaris 和 FreeBSD 上运行的版本。 [1,2,5,8]
本文会介绍一些 Nginx 与 Libressl 一起使用实践经验。
nginx 1.6.0
libressl 2.0.0
在reddit-discussion [11]中有描述一些使用最新开发版本(1.7 分支)会出现的问题。
直接从源码编译LibreSSL,构建过程的输出非常简洁,源码还附带测试用例及提供并行构建支持(见附录)。
- # 用于构建及安装 libressl 的选项 [7]
 - $ ./configure --prefix=/usr LDFLAGS=-lrt && make check && sudo make install
 
新安装的 LibreSSL 可替代openssl以相同的方式运行,但要注意:正如 sabotage-linux 的 spencerjohn 和 Gentoo 的 Hanno Böck 所说的那样,用libressl完全替代操作系统中的openssl会很麻烦。[3,4]
LibreSSL 会报告其版本为 LibreSSL 2.0, openssl命令的使用方法与openssl一样:
- $ which openssl
 - /usr/bin/openssl
 - $ openssl version
 - LibreSSL 2.0
 - $ openssl s_client -host www.openssl.org -port 443
 - CONNECTED(00000003)
 - depth=2 C = BE, O = GlobalSign nv-sa, OU = Root CA, CN = GlobalSign Root CA
 - verify error:num=19:self signed certificate in certificate chain
 - verify return:0
 - ---
 - Certificate chain
 - 0 s:/C=GB/OU=Domain Control Validated/CN=*.openssl.org
 - i:/C=BE/O=GlobalSign nv-sa/CN=GlobalSign Domain Validation CA - G2
 - 1 s:/C=BE/O=GlobalSign nv-sa/OU=Root CA/CN=GlobalSign Root CA
 - i:/C=BE/O=GlobalSign nv-sa/OU=Root CA/CN=GlobalSign Root CA
 - 2 s:/C=BE/O=GlobalSign nv-sa/CN=GlobalSign Domain Validation CA - G2
 - i:/C=BE/O=GlobalSign nv-sa/OU=Root CA/CN=GlobalSign Root CA
 - ---
 - Server certificate
 - -----BEGIN CERTIFICATE-----
 - ... skip
 - -----END CERTIFICATE-----
 - subject=/C=GB/OU=Domain Control Validated/CN=*.openssl.org
 - issuer=/C=BE/O=GlobalSign nv-sa/CN=GlobalSign Domain Validation CA - G2
 - ---
 - No client certificate CA names sent
 - ---
 - SSL handshake has read 4136 bytes and written 707 bytes
 - ---
 - New, TLSv1/SSLv3, Cipher is DHE-RSA-AES256-GCM-SHA384
 - Server public key is 2048 bit
 - Secure Renegotiation IS supported
 - Compression: NONE
 - Expansion: NONE
 - SSL-Session:
 - Protocol : TLSv1.2
 - Cipher : DHE-RSA-AES256-GCM-SHA384
 - TLS session ticket lifetime hint: 300 (seconds)
 - TLS session ticket:
 
确认了 libressl 能够使用后,我便动手让 nginx 来使用 libressl 。尽管在仍然使用 openssl 0.9.x 的旧系统中,通常我都会静态构建 nginx+openssl 以使最新和最好的 tls 版本可用。第一次尝试,只使用 ./configure --with-openssl=/path/to/libressl 就大错特错了,因为 nginx 已经完全与 openssl 的构建过程融合了:
可使用名为./config的脚本来替代./configure(容易解决)
openssl 会收集在 .openssl/lib 下的 objects(.obj) 文件和其他文件来链接进二进制文件和库文件,而 libressl 将这些文件分开存放在 crypto/.libs 和 ssl/.libs。
尝试通过手工建立目录层次(.openssl/lib)及根据 libressl 成功构建后出现的错误提示(见下面的错误信息)来复制文件以解决这些问题;在编译 libressl 时,我看到一个类似可以通过使用 LDFLAGS=-lrt 选项来解决问题的错误提示,但在尝试编译nginx并链接到已静态编译过的libressl库时仍然无法修复这个问题(但我依然继续):
- ...
 - objs/addon/nginx-upstream-fair/ngx_http_upstream_fair_module.o \
 - objs/addon/src/ngx_http_headers_more_filter_module.o \
 - objs/addon/src/ngx_http_headers_more_headers_out.o \
 - objs/addon/src/ngx_http_headers_more_headers_in.o \
 - objs/addon/src/ngx_http_headers_more_util.o \
 - objs/addon/src/ngx_http_encrypted_session_module.o \
 - objs/addon/src/ngx_http_encrypted_session_cipher.o \
 - objs/ngx_modules.o \
 - -Wl,-E -lpthread -lcrypt -L/usr/lib -lm -llua5.1 -lpcre /data/builds/froggstack/nginx_modules/openssl/.openssl/lib/libssl.a /data/builds/froggstack/nginx_modules/openssl/.openssl/lib/libcrypto.a -ldl -lz
 - /data/builds/froggstack/nginx_modules/openssl/.openssl/lib/libcrypto.a(libcompat_la-getentropy_linux.o): In function `getentropy_fallback':
 - /data/builds/froggstack/nginx_modules/openssl/crypto/compat/getentropy_linux.c:324: undefined reference to `clock_gettime'
 - /data/builds/froggstack/nginx_modules/openssl/crypto/compat/getentropy_linux.c:395: undefined reference to `clock_gettime'
 - collect2: error: ld returned 1 exit status
 - make[1]: *** [objs/nginx] Error 1
 - make[1]: Leaving directory `/data/builds/froggstack/src_nginx/nginx-1.6.0'
 - make: *** [build] Error 2
 
下一个尝试是在安装了 libressl 的前提下通过链接到 libressl 的动态库来构建 nginx,最终成功了(完整的nginx ./configure 选项参数见附录)。 运行 nginx-libressl -t 测试成功,并将 /usr/bin/nginx 替换成新的二进制可执行文件和运行 /etc/init.d/nginx restart,更新后的 nginx + libressl 上线了。任何配置文件和 nginx 的 ssl 配置都不需要修改,非常好!
感兴趣并想测试的朋友可以访问: www.mare-system.de,网站从2014-07-12开始运行在 libressl 上。如你发现任何不兼容的问题,请通过 atsecurity@mare-system.de 给我留言。
在各种 Linux 和 Android 的浏览器上测试都没有发现问题;甚至在一台已被遗忘的装有2007年10月发布并已过时的附带 OpenSSL 0.9.8g 19 的 debian 5 上使用像 w3m 这样的控制台浏览器上浏览也没有问题。
在 ssllabs.com 上测试的得分为 A+,成绩与之前的配置一样;在使用了 libressl 后,唯一给出的提示是加密算法 ChaCha20-Poly1305 还处于实验阶段。
做了一个小小的性能测试,结果显示没有什么大问题;LibreSSL 与平均水平相比慢了 4%。原因可能是 openssl 是静态链接到 nginx 的,而 libressl 则是动态链接到 nginx 的,所以会产生更多的资源开销。
纯数字的测试结果:
- | Parallel Requests | OpenSSL-RPS | LibreSSL-RPS
 - | 10 | 2341.75 | 2260.5
 - | 20 | 2459.75 | 2418.25
 - | 30 | 2472 | 2397
 - | 40 | 2485 | 2384.5
 - | 50 | 2445 | 2382.25
 - | 60 | 2453.25 | 2390.75
 - | 70 | 2426.25 | 2347.25
 - | 80 | 2346.5 | 2227.5
 - | 90 | 2325.5 | 2211
 - | 100 | 2297.75 | 2318.25
 
性能测试方式的一些说明可能在附录中找到。
#p#
此法可行。
虽然不建议在这个阶段使用 LibreSSL 来代替 OpenSSL,但我只想测试其可行性。结果证明这是可行的。 从我的测试来看,没有任何功能上或性能的问题,而且只要你找到方法,构建 nginx + libressl 就容易了。依我所见,长期使用 LibreSSL 的好处是:
干净的代码
更少的漏洞
更多人参与
在我撰写本文的时候,我收到新的 LibreSSL 版本发布的消息,新版本解决了一些新的问题。所以,再回头使用 OpenSSL 就显得有点不理智了:
做得好,LibreSSL 团队,再次感谢
第一个可移植的 LibreSSL 版本发布
LibreSSL - 下载
libreSSL 的兼容性如何?
在 Gentoo 上使用 LibreSSL
LibreSSL 的 github 仓库
Nginx + SSL + SPDY 指南
解决 LibreSSL 在 Redhat 上使用的问题
LibreSSL - 主页
SSL 报告: mare-system.de
第二个可移植的 LibreSSL 版本发布
reddit-discussion
Nginx + BoringSSL
- server {
 - listen 443 ssl spdy;
 - server_name www.mare-system.de;
 - ...
 - # ssl
 - ssl_session_cache shared:SSL:10m;
 - ssl_session_timeout 10m;
 - # older protos for browsercompatibility
 - ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
 - ssl_prefer_server_ciphers on;
 - # suggestion from sslabs / including PFS
 - ssl_ciphers EECDH+ECDSA+AESGCM:EECDH+aRSA+AESGCM:EECDH+ECDSA+SHA384:EECDH+ECDSA+SHA256:EECDH+aRSA+SHA384:EECDH+aRSA+SHA256:EECDH+aRSA+RC4:EECDH:EDH+aRSA:RC4:!aNULL:!eNULL:!LOW:!3DES:!MD5:!EXP:!PSK:!SRP:!DSS;
 - # excluding subDomain on purpose
 - add_header Strict-Transport-Security "max-age=31536000";
 - ...
 - }
 
- nginx_libressl_opts = """ --conf-path=/etc/nginx/nginx.conf
 - --sbin-path=/usr/sbin/nginx
 - --prefix=
 - --error-log-path=/var/log/nginx/error.log
 - --http-log-path=/var/log/nginx/access.log
 - --http-client-body-temp-path=/var/run/nginx/client_temp
 - --http-proxy-temp-path=/var/run/nginx/proxy_temp
 - --http-fastcgi-temp-path=/var/run/nginx/fastcgi_temp
 - --with-file-aio
 - --with-http_gzip_static_module
 - --with-http_ssl_module
 - --with-http_spdy_module
 - --with-http_stub_status_module
 - --with-debug
 - --without-mail_pop3_module
 - --without-mail_smtp_module
 - --without-mail_imap_module
 - --without-http_uwsgi_module
 - --without-http_scgi_module
 - --without-http_ssi_module
 - --add-module=$nmd/nginx-openssl-version
 - --add-module=$nmd/naxsi
 - --add-module=$nmd/lua-nginx-module
 - --add-module=$nmd/ngx_devel_kit
 - --add-module=$nmd/echo-nginx-module
 - --add-module=$nmd/nginx-accesskey
 - --add-module=$nmd/ngx_http_log_request_speed
 - --add-module=$nmd/set-misc-nginx-module
 - --add-module=$nmd/nginx-sticky-module-ng
 - --add-module=$nmd/ngx_cache_purge
 - --add-module=$nmd/memc-nginx-module
 - --add-module=$nmd/nginx-upstream-fair
 - --add-module=$nmd/headers-more-nginx-module
 - --add-module=$nmd/encrypted-session-nginx-module
 
- # libressl
 - $ make check
 - real 1m58.610s
 - user 1m24.517s
 - sys 0m11.477s
 - $ make check -j4
 - real 0m34.231s
 - user 1m28.626s
 - sys 0m11.357s
 - # make check output
 - $ make check
 - ============================================================================
 - Testsuite summary for libressl 2.0.0
 - ============================================================================
 - # TOTAL: 41
 - # PASS: 41
 - # SKIP: 0
 - # XFAIL: 0
 - # FAIL: 0
 - # XPASS: 0
 - # ERROR: 0
 - ============================================================================
 
小服务器,双核,2GB内存,没有特别的调整
从另一台服务器发起性能测试,使用 automake ab(abmeter)脚本
打开 keepalive
url: / (由 nginx 缓存)
测试了 10,20,30...100 个并发连接, 每次100.000 个请求
每个配置测试 4 轮
累积结果 / 4 -> 每次运行的值
OpenSSL Valhalla Rampage
https://www.ssllabs.com/ssltest/analyze.html?d=mare-system.de
英文原文:Nginx + LibreSSL - a first test
译文链接:http://www.oschina.net/translate/nginx-libressl-first-test