Nginx + LibreSSL - 尝鲜测试

tl;dr: 用上 LibreSSL 已经第二个夜晚了 ... 依然运行良好

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

性能测试方式的一些说明可能在附录中找到。

结论

此法可行。

虽然不建议在这个阶段使用 LibreSSL 来代替 OpenSSL,但我只想测试其可行性。结果证明这是可行的。 从我的测试来看,没有任何功能上或性能的问题,而且只要你找到方法,构建 nginx + libressl 就容易了。依我所见,长期使用 LibreSSL 的好处是:

  • 干净的代码
  • 更少的漏洞
  • 更多人参与

在我撰写本文的时候,我收到新的 LibreSSL 版本发布的消息,新版本解决了一些新的问题。所以,再回头使用 OpenSSL 就显得有点不理智了:

做得好,LibreSSL 团队,再次感谢

参考

1.第一个可移植的 LibreSSL 版本发布

2.LibreSSL - 下载

3.libreSSL 的兼容性如何?

4.在 Gentoo 上使用 LibreSSL

5.LibreSSL 的 github 仓库

6.Nginx + SSL + SPDY 指南

7.解决 LibreSSL 在 Redhat 上使用的问题

8.LibreSSL - 主页

9.SSL 报告: mare-system.de

10.第二个可移植的 LibreSSL 版本发布

11.reddit-discussion

12.Nginx + BoringSSL

附录
SSL 配置和使用的加密算法

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 的 Configure 选项

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 - 构建时间和输出

# 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
时间: 2024-10-22 21:15:57

Nginx + LibreSSL - 尝鲜测试的相关文章

PHP7 RC7 Release对比PHP5.6快速排序20000数据性能体验以及新语法尝鲜

最近Zend的PHP7已经 处于最后的BUG修复阶段,目前 已经更新RC7,对于Zend官方的说法PHP7的性能大约相比PHP5系列版本 提高2倍以上,增加了一些新的语法,摒弃了PHP5的一些影响性能的因素,主要增加了以下Features . Improved performance: PHP 7 is up to twice as fast as PHP 5.6 性能比5.6提高2倍 Consistent 64-bit support 64位一致性支持Many fatal errors are

尝鲜Android 4.0 PC端虚拟机安装指南

10月19日,谷歌和三星携手发布了Galaxy Nexus,而作为这款有着标杆意义的手机,其所搭载的Android 4.0(Ice Cream Sandwich)也在发布会上同时亮相,作为手机与平板通吃的一代新操作系统,体验方面也是有着大幅的提升,今天为大家带来了Android 4.0的虚拟机安装教程,邀您共同来体验全新的Android 4.0. 尝鲜Android 4.0 在开始教程之前,先给大家展示一下成功运行Android 4.0虚拟机的界面,经过笔者测试,体验很流畅,喜欢DIY和对开发感

【COCOS CREATOR 系列教程之一】CC尝鲜小总结及组件使用需注意的几点细节

本站文章均为 李华明Himi 原创,转载务必在明显处注明:  转载自[黑米GameDev街区] 原文链接: http://www.himigame.com/cocos-creator/1936.html   从今天起,Himi将陆续的会持续更新一些Cocos Creator的文章 一起学习交流的可以加我的QQ群 Cocos Creator :432818031     貌似好久没有来写原创博文了,不知道还有多少认识Himi的- 当然也有不少群里的人问我都在忙什么,这里简单先八卦一下: 去年去了网

云栖直播:尝鲜阿里云大数据分析、机器学习与混合云(原云栖速递)

云栖头条 云栖直播:尝鲜阿里云大数据分析.机器学习与混合云 摘要 云栖大会上海峰会,直播50余场技术干货,让你可以快速复制阿里巴巴的互联 网架构.2016年1月20日早9点,不见不散.观看直播. 微服务(Microservice)那点事 淘宝商品详情平台化思考与实践 软件开发 JVM源码分析系列 本系列文章都是基于Hotspot/JDK源码,从源码角度来分析我们常见的JVM参数,Java概念以及对应的实现原理及玩法 等,希望从根本上来理清Java知识点,我们会不定期地分享这个系列的文章. 写日志

ImageNet大规模视觉识别竞赛 ILSVRC 2015 尝鲜数据集

今年比赛增加两个尝鲜项目: I: Object detection from video 视频中的目标检测,简称VID 今年有新的检测任务:视频中的目标检测,类似目标检测任务的风格.该任务有30个基本类别,是目标检测任务200个基本类别的子集.这些类别都是精心选择的,考虑到不同因素,如运动类型,视频背景干扰,平均目标数目等.所有类别在每个帧都完全打标签.我们使用了Datatang的服务来标记目标框.标记片段见(http://vision.cs.unc.edu/ilsvrc2015/ui/vid)

【阿里云资讯】AliSQL 5.6.32 vs MySQL 5.7.15抢鲜测试

1.导读 有幸抢鲜测试AliSQL,直接拿来和MySQL 5.7.15对比看看.AliSQL刚宣布开源,我就提交申请内测名额,节前收到开放内测邀请,于是第一时间进行了测试了解,希望能给大家提供一些参考. 2.关于性能 本次仅用sysbench进行测试,还没用tpcc做对比,因此测试方案不是太周全.稍后会再发布tpcc的测试结果. a.sysbench采用update_non_index.lua模式测试 b.sysbench采用oltp.lua模式测试 从测试结果来看,AliSQL在sysbenc

AliSQL 5.6.32 vs MySQL 5.7.15抢鲜测试

0.导读 有幸抢鲜测试AliSQL,直接拿来和MySQL 5.7.15对比看看. AliSQL刚宣布开源,我就提交申请内测名额,节前收到开放内测邀请,于是第一时间进行了测试了解,希望能给大家提供一些参考. 1.关于性能 本次仅用sysbench进行测试,还没用tpcc做对比,因此测试方案不是太周全.稍后会再发布tpcc的测试结果. a.sysbench采用update_non_index.lua模式测试 线程 AliSQL 5.6.23 MySQL 5.7.15 AliSQL相差 1 2384.

尝鲜Ubuntu云计算同步协作服务

本文讲的是尝鲜Ubuntu云计算同步协作服务,[IT168 专稿]前阵子,记者报道了Linux世界中顶顶有名的Ubuntu发布了其最新的Ubuntu 9.04版本,并提到该版本中的一项新功能--"Ubuntu企业云服务(UEC)"是第一个在企业防火墙内建立私有云环境的Linux发行版.而今天,Ubuntu又放出了消息,正在为桌面版本的系统准备云计算相关的服务.         这个云服务被命名为"Ubuntu One",是由Ubuntu的发布商提供的Web云服务,主

北京市4000用户“尝鲜”4G

记者昨日从北京移动了解到,该公司上月开始招募的体验用户,近日开始"尝鲜"更为快捷的4G网络.陆续有4000多名本市体验用户拿到申请的4G终端,开始为期6个月的测试体验. 3种4G设备开始测试 首批"尝鲜"的体验者市民古先生拿到手的是一个iPhone 5一半大小的白色设备,这个白色小机器就是可以将4G网络信号转换成手机.iPad.笔记本电脑都通用的WiFi信号的MiFi.据了解,此次北京移动向报名并被选中体验的市民开放的主要有3种4G终端,包括4G上网卡.4G无线网关