Nginx 中的前向保密(CentOS6)

Nginx 中的前向保密(CentOS6)

我正在尝试使用 nginx 网络服务器在 CentOS 中启用前向保密。

我尝试过
我读过一些教程,似乎我们应该有 nginx、openssl 最新版本才能启用它。所以我从源代码安装了最新的 openssl。

sudo wget http://www.openssl.org/source/openssl-1.0.1e.tar.gz
sudo tar  -xvzf openssl-1.0.1e.tar.gz
cd openssl-1.0.1e
sudo ./config --prefix=/usr/local
sudo make 
sudo make install

现在 OpenSSL 支持椭圆曲线密码 (ECDHE)。我也用 openssl s_server 测试了这一点。效果很好。

接下来,我用最新的替换了 Nginx。

sudo wget  http://nginx.org/packages/centos/6/x86_64/RPMS/nginx-1.4.2-1.el6.ngx.x86_64.rpm
sudo rpm -e nginx
sudo rpm -ivh  nginx-1.4.2-1.el6.ngx.x86_64.rpm

并按照此链接中的描述配置 Nginx

ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;
ssl_ciphers EECDH+ECDSA+AESGCM:EECDH+aRSA+AESGCM:EECDH+ECDSA+SHA256:EECDH+aRSA+RC4:EDH+aRSA:EECDH:RC4:!aNULL:!eNULL:!LOW:!3DES:!MD5:!EXP:!PSK:!SRP:!DSS;

http://baudehlo.wordpress.com/2013/06/24/setting-up-perfect-forward-secrecy-for-nginx-or-stud/

但是现在 Nginx 不支持 ECDHE 密码。它支持 DHE 密码。我尝试在 nginx 中启用 ECDHE 密码,但仍然不起作用。我正在使用最新的 Web 浏览器(chrome 29,它支持此密码)

我是不是漏掉了什么?还是 CentOS 或 Nginx 出了问题?我读到过一些文章说 CentOS 存在 ECC 专利问题,这是否会导致问题?

答案1

openssl您说得对,由于专利问题,RedHat(以及 CentOS)中的 ECC已被禁用;参见(例如)此 Bugzilla 条目了解更多详情。请注意,任何时候有人打开新的跟踪器进行投诉,它都会作为此跟踪器的副本被关闭,因此不要被跟踪器的年限所欺骗,以为这是一个过期的问题(旁注:虽然大多数 Bugzilla 都是坏消息,但我确实喜欢 RH 的评论'请注意:“Ubuntu 做到了”永远不是一个可行的法律论据。')。

您正确地预测到,解决这个问题意味着要编译自己的openssl,这很好。但是这样做之后,您不能简单地安装打包的二进制文件并期望它们会神奇地获取您的新库,因为它们不会。

您需要重新编译 openssl,例如--prefix=/usr/local/openssl-custom,然后make install将其编译到新位置,然后nginx从源代码进行编译,注意告诉它编译并链接到新的库(我无法为您提供标准咒语,因为它因包而异,但-with-ssl=/usr/local/openssl-custom有时可能是正确的)。

如果您需要任何其他工具来使用nginx,并且其中任何一个都有openssl依赖项(而现在,什么没有呢?),那么您可能也需要编译它们。

最后,请允许我劝你不要这样做。这项工作很繁重;编译是其中最不重要的部分,然后你必须随时关注你构建的软件包的所有新版本,并在它们发生变化时重建它们。 我不知道您为什么决定需要前向保密,但我强烈怀疑,由于软件包超出补丁范围,您会给自己带来更多的安全问题,而启用它所解决的问题却无法解决。

还请注意上面链接的 bugzilla 条目中的注释 43 和 90;如果您所说的前向保密是指完美前向保密 (PFS),那么启用 PFS 确实不是似乎需要 ECC。或者只是等待,因为看起来我们从 RHEL6.5 (C6.5) 开始就获得了 ECC

答案2

作为 MadHatter 建议的 tl;dr:

如果你的 openssl 有点过时,那么有一个选项可以让 nginx 使用现代 ssl 运行:

  • 下载并提取来源openssl
  • 配置 nginx 以使用您下载的 openssl-sources:

    ./configure ... --with-openssl=/path/to/openssl_source/ ... 
    
  • 构建你的包

然后,您将拥有一个带有现代 ssl 的更新 nginx,静态构建,并且不会干扰您发行版中的 openssl 包。

有关 nginx + ssl 的更多信息,请参阅此处nginx 和 ssl 指南

答案3

我用

yum --enablerepo=axivo install nginx

yum --enablerepo=axivo update openssl

Nginx 说明这里对于 OpenSSL这里

这将安装(在回答此问题时)Nginx 1.4.4 和 OpenSSL 1.0.1e

Apache(httpd)给我带来了问题,我不得不重新编译,但除此之外,此设置一切都正常。

我也花了很长时间来完善这个密码偏好(对我来说) - 受到谷歌的启发:

ECDHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-RC4-SHA:ECDHE-RSA-AES128-SHA:AES128-GCM-SHA256:RC4-SHA:RC4-MD5:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:AES256-GCM-SHA384:AES256-SHA256:AES256-SHA:ECDHE-RSA-AES128-SHA:AES128-SHA256:AES128-SHA;

需要您自担风险使用它。

您可以使用 ssllabs.com 进行测试。

相关内容