Canary Workshop

Whatever is worth doing at all is worth doing well

nginx与OpenSSL 1.1.0的那点事

2016年8月25日,跳票N久的OpenSSL 1.1.0终于正式发布了,带来一大堆新特性,相信很多人都期待已久了。也有很多等不及正式版的就去安装测试版尝鲜,可是一番折腾后发现大部分测试版都无法正常用于服务器软件,而正式版也同样不行,编译时会直接报错退出。我也一直在关注OpenSSL 1.1.0,但连正式版都无法工作,我只得去问万能的Google娘了,最后在GitHub上看到了这样的表述

SSL: guarded SSL_R_NO_CIPHERS_PASSED not present in OpenSSL 1.1.0.
It was removed in OpenSSL 1.1.0 Beta 3 (pre-release 6). It was
not used since OpenSSL 1.0.1n and 1.0.2b.

那看来只好自己动手丰衣足食了,于是乎又一阵Google,发现两条解决方案

1) 使用GitHub上的修正版源码
虽然官网上的nginx最新版源码仍无法工作,但nginx的官方GitHub上很早之前就有人提交了修正版代码并已经通过Pull Request并入了master分支。不用删除已有源码而重新克隆,只需下载这个文件并替换掉src/event/ngx_event_openssl.c即可正常通过编译。该修正预计将在1.11.4版本中自带,但目前只好手动替换了。

2) 使用第三方Patch文件
本质上也是做了如上更改,但也许更方便进行快速部署一些,nginx论坛上的原帖:这里

等到新版nginx发布,这个问题应该就不存在了,但无论如何想尝鲜的话就需要这样做,OpenSSL 1.1.0的新特性完全值得这样的轻微折腾。

nginx -V截图:
alt