在Nginx服务器中使用LibreSSL的教程

本文会介绍一些 Nginx 与 Libressl 一起使用实践经验。
本文所用软件的版本

  • nginx 1.6.0
  • libressl 2.0.0

安装

直接从源码编译LibreSSL,构建过程的输出非常简洁,源码还附带测试用例及提供并行构建支持(见附录)。

# 用于构建及安装 libressl 的选项 

$ ./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 团队,再次感谢

(0)

相关推荐

  • nginx环境下配置ssl加密(单双向认证、部分https)

    nginx下配置ssl本来是很简单的,无论是去认证中心买SSL安全证书还是自签署证书,但最近公司OA的一个需求,得以有个机会实际折腾一番.一开始采用的是全站加密,所有访问http:80的请求强制转换(rewrite)到https,后来自动化测试结果说响应速度太慢,https比http慢慢30倍,心想怎么可能,鬼知道他们怎么测的.所以就试了一下部分页面https(不能只针对某类动态请求才加密)和双向认证.下面分节介绍. 默认nginx是没有安装ssl模块的,需要编译安装nginx时加入--with

  • 在Nginx服务器下配置StartSSL和SSL的教程

    第一步 申请本地证书 1. openssl 之类的软件我就不多说,系统自带的,如果不带,自己 yum 下 [root@e2fsck ~]# openssl genrsa -des3 -out e2fsck.org.key 2048 Generating RSA private key, 1024 bit long modulus ---..++++++ ---..++++++ e is 65537 (0×10001) Enter pass phrase for e2fsck.org.key: 输

  • Nginx 下配置SSL证书的方法

    1.Nginx 配置 ssl 模块 默认 Nginx 是没有 ssl 模块的,而我的 VPS 默认装的是 Nginx 0.7.63 ,顺带把 Nginx 升级到 0.7.64 并且 配置 ssl 模块方法如下: 下载 Nginx 0.7.64 版本,解压 进入解压目录: 复制代码 代码如下: wget http://sysoev.ru/nginx/nginx-0.7.64.tar.gz tar zxvf nginx-0.7.64.tar.gz cd nginx-0.7.64 如果要更改heade

  • Nginx+SSL+Node.js运行环境配置教程

    Nginx是一款高性能的HTTP服务器,同时也是一款高效的反向代理服务器.不像传统的服务器,Nginx是基于事件驱动的异步架构,内存占用少但是性能很好.如果你的Web应用是基于Node.js的,那么建议你考虑使用Nginx来做反向代理,因为Nginx可以非常高效地提供静态文件服务.本文的主要内容是在不同的操作系统下配置Nginx和SSL,并且搭建一个Node.js运行环境. 安装Nginx 假设你已经在服务器上安装了Node.js,下面我们来安装Nginx. 在Mac系统上安装Nginx 利用c

  • Nginx服务器的SSL证书配置以及对SSL的反向代理配置

    Nginx的SSL证书配置 1.使用openssl实现证书中心 由于是使用openssl架设私有证书中心,因此要保证以下字段在证书中心的证书.服务端证书.客户端证书中都相同 Country Name State or Province Name Locality Name Organization Name Organizational Unit Name Country Name State or Province Name Locality Name Organization Name Or

  • Nginx+SSL搭建 HTTPS 网站

    一.HTTPS 是什么? 根据维基百科的解释: 复制代码 代码如下: 超文本传输安全协议(缩写:HTTPS,英语:Hypertext Transfer Protocol Secure)是超文本传输协议和SSL/TLS的组合,用以提供加密通讯及对网络服务器身份的鉴定.HTTPS连接经常被用于万维网上的交易支付和企业信息系统中敏感信息的传输.HTTPS不应与在RFC 2660中定义的安全超文本传输协议(S-HTTP)相混. HTTPS 目前已经是所有注重隐私和安全的网站的首选,随着技术的不断发展,H

  • 对Nginx支持SSL的性能进行优化的方法

    这篇文章是讲web服务器方面的性能调整. 不包括数据库性能的调整. 初始化服务器 这个web服务器运行在一个EC2 t1.micro 环境.我选择 Nginx + PHP5-FPM 来运行php页面,出于安全考虑我使用SSL. 测试性能 我使用Blitz.io来进行压力和性能测试. 下面的是我压力测试的命令. 功能是在60秒内逐渐增加用户. 在整个过程中,Blitz.io 每秒创建一个请求并增加4个用户(rise/run = 260/60). 复制代码 代码如下: -p 1-250:60 htt

  • 在Nginx服务器中启用SSL的配置方法

    生成证书 可以通过以下步骤生成一个简单的证书: 首先,进入你想创建证书和私钥的目录,例如: $ cd /usr/local/nginx/conf 创建服务器私钥,命令会让你输入一个口令: $ openssl genrsa -des3 -out server.key 1024 创建签名请求的证书(CSR): $ openssl req -new -key server.key -out server.csr 在加载SSL支持的Nginx并使用上述私钥时除去必须的口令: $ cp server.ke

  • Nginx服务器中关于SSL的安全配置详解

    本文向你们展示如何在nginx的web服务器上设置更强的SSL.我们是通过使SSL无效来减弱CRIME攻击的这种方法实现.不使用在协议中易受攻击的SSLv3以及以下版本并且我们会设置一个更强的密码套件为了在可能的情况下能够实现Forward Secrecy,同时我们还启用HSTS和HPKP.这样我们就有了一个更强.不过时的SSL配置并且我们在Qually Labs SSL 测试中得到了A等级. 我们在nginx的设置文档中如下编辑 复制代码 代码如下: /etc/nginx/sited-enab

  • 针对OpenSSL安全漏洞调整Nginx服务器的方法

    1. 概述     当前爆出了Openssl漏洞,会泄露隐私信息,涉及的机器较多,环境迥异,导致修复方案都有所不同.不少服务器使用的Nginx,是静态编译 opensssl,直接将openssl编译到nginx里面去了,这就意味着,单纯升级openssl是没有任何效果,Nginx不会加载外部的 openssl动态链接库的,必须将nginx重新编译才可以根治. 2. 识别Nginx是否是静态编译的 以下三种方法都可以确认Nginx是否静态编译Openssl.    2.1 查看Nginx编译参数

  • nginx配置ssl双向验证的方法

    1.安装nginx略 http://www.jb51.net/article/49479.htm 2.使用openssl实现证书中心 由于是使用openssl架设私有证书中心,因此要保证以下字段在证书中心的证书.服务端证书.客户端证书中都相同 Country Name State or Province Name Locality Name Organization Name Organizational Unit Name 编辑证书中心配置文件 vim /etc/pki/tls/openssl

  • Nginx启动SSL功能,并进行功能优化详细介绍

    Nginx启动SSL功能,并进行功能优化,你看这个就足够了 一:开始Nginx的SSL模块 1.1 Nginx如果未开启SSL模块,配置Https时提示错误 nginx: [emerg] the "ssl" parameter requires ngx_http_ssl_module in /usr/local/nginx/conf/nginx.conf:37 原因也很简单,nginx缺少http_ssl_module模块,编译安装的时候带上--with-http_ssl_module

  • Linux下Nginx安全证书ssl配置方法

    分享下我是如何一步步在Nginx上配置SSL的.首先,确保安装了OpenSSL库,并且安装Nginx时使用了–with-http_ssl_module参数. 初学者或者菜鸟建议使用LNMP进行一键安装. 生成证书:进入要生成证书的目录cd /usr/local/nginx/conf 使用openssl创建创建服务器私钥,输入相应提示的信息 复制代码 代码如下: openssl genrsa -des3 -out server.key 1024 创建证书签名请求(Certificate Signi

随机推荐