当前位置: 首页 > 编程笔记 >

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

索瀚海
2023-03-14
本文向大家介绍在Nginx服务器中使用LibreSSL的教程,包括了在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 团队,再次感谢

 类似资料:
  • 本文向大家介绍服务器使用Nginx部署Springboot项目的详细教程(jar包),包括了服务器使用Nginx部署Springboot项目的详细教程(jar包)的使用技巧和注意事项,需要的朋友参考一下 1,将java项目打成jar包 这里我用到的是maven工具 这里有两个项目,打包完成后一个为demo.jar,另一个为jst.jar 2.准备工具 1.服务器 2.域名(注:经过备案) 3.Xs

  • 无法启动nginx服务器OS:ubuntu服务器16.04 systemctl status nginx.status抛出此消息:nginx.service-高性能web服务器和反向代理服务器加载:加载(/lib/systemd/system/nginx.service;enabled;vendor preset:enabled)活动:失败(结果:exit-code)自UTC Thu 2016-1

  • 本文向大家介绍在Linux和Windows系统上安装Nginx服务器的教程,包括了在Linux和Windows系统上安装Nginx服务器的教程的使用技巧和注意事项,需要的朋友参考一下 1.在CentOS系统上安装Nginx 在 CentOS6 版本的 EPEL 源中,已经加入了 nginx 的 rpm 包,不过此 RPM 包版本较低。如果需要更新版本,可以使用官方制作的 rpm 包,或者使用源码包

  • 本文向大家介绍Nginx服务器上安装并配置PHPMyAdmin的教程,包括了Nginx服务器上安装并配置PHPMyAdmin的教程的使用技巧和注意事项,需要的朋友参考一下 一、 准备工作: 1. 如果mysql的root账号为空,需要设置root密码 CentOS下默认安装的mysql服务器,里面的root账号默认密码为空,首先为root设置一个密码 #mysqladmin -u root pas

  • 本文向大家介绍使用nginx设置代理服务器,包括了使用nginx设置代理服务器的使用技巧和注意事项,需要的朋友参考一下 nginx可以利用其反向代理的功能来进行负载均衡的实现,同时也可以使用其正向代理的功能设置代理服务器,比如在内网的环境中,在可以连接外网的机器上运行nginx作为代理服务器,其他机器通过设定此台机器的IP和port即可通过其连接上网,本文使用nginx官方镜像,通过如下步骤即可简

  • 本文向大家介绍在Nginx服务器中启用SSL的配置方法,包括了在Nginx服务器中启用SSL的配置方法的使用技巧和注意事项,需要的朋友参考一下 生成证书 可以通过以下步骤生成一个简单的证书: 首先,进入你想创建证书和私钥的目录,例如: 创建服务器私钥,命令会让你输入一个口令: 创建签名请求的证书(CSR): 在加载SSL支持的Nginx并使用上述私钥时除去必须的口令: 启用一个 SSL 虚拟主机