在NGINX Web服务器中实现SSL完美的前向保密

在NGINX Web服务器中实现SSL完美转发保密

版权所有©2014本·约翰逊

这个HOW-TO描述了在Debian和Ubuntu系统上使用NGINX Web服务器实现完美转发保密的过程。 该过程可以轻松适应其他GNU / Linux系统。

简而言之,“完美转发保密”确保:“一个消息的妥协不能导致他人的妥协,而且没有一个秘密的价值可以导致多个消息的妥协。” 有关更多信息,请参阅: http : //en.wikipedia.org/wiki/Forward_secrecy#Perfect_forward_secrecy

当2014年初openSSL中的Heartbleed漏洞被揭露时,越来越清楚,PFS对于任何使用SSL / TLS的系统来说都是必须的。

如果您希望比较我的结果,我的参考实现可以通过https://www.ssllabs.com/ssltest/analyze.html?d=indietorrent.org和发送的SSL证书链和NGINX标头进行测试可以在https://indietorrent.org上查看

不用多说,我们来配置NGINX来实现PFS。

我们进入NGINX的配置目录:

cd /etc/nginx/

我们需要生成足够强的Diffie-Hellman参数。 有些人认为4096位是过度杀伤,并会对系统的CPU造成不必要的负担,但是使用现代计算能力,这似乎是一个值得妥协的妥协。 有关更多信息,请参阅下面的参考部分。

openssl dhparam -out dh4096.pem 4096

有一个配置文件,这是特定于手头的任务,分隔在一个包含文件是方便的; 这使得在大量系统上实现PFS更为简单。

vi /etc/nginx/perfect-forward-secrecy.conf

将以下内容粘贴到上述文件中:

ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;
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 !MEDIUM";
ssl_dhparam dh4096.pem;

将NGINX配置修改为包含上述文件,将以下行插入到NGINX的主配置文件(默认为/etc/nginx/nginx.conf )中,位于http {}块的底部(和内部):

# See: https://community.qualys.com/blogs/securitylabs/2013/08/05/configuring-apache-nginx-and-openssl-for-forward-secrecy
# This MUST come AFTER the lines that includes .../sites-enabled/*, otherwise SSLv3 support may be re-enabled accidentally.
include perfect-forward-secrecy.conf;

重新启动NGINX以使更改生效:

service nginx restart

如果测试在https://www.ssllabs.com/ssltest/analyze.html显示会话恢复(缓存)否(已分配但不被接受的ID)为红色,并且服务器实现SNI,请将以下内容添加到顶层http {}块(即,添加到nginx.conf ,就在我们之前添加的地方):

# See: http://forum.nginx.org/read.php?2,152294,152401#msg-152401
ssl_session_cache shared:SSL:10m;

再次,重新启动NGINX以使更改生效:

service nginx restart

上述测试不应该再报告这个问题(尽管这个问题不能降低整体测试成绩)。

进一步:实施长时间的HTTP严格传输安全(HSTS)

这是一个容易的,值得做的事情是:

  1. 您希望为设置此标题的任何主机(即所涉及的网站上的每一页) 强制 SSL为所有资源。
  2. 您可以无法接受并忽略从设置此标题的任何主机所请求的任何资源的SSL警告,例如“域名不匹配”等。HSTS的性质是相关的警告和错误条件SSL证书不能被覆盖。

我浏览了互联网,以获取有关是否设置此标题可能在不支持标题和短消息的浏览器中产生意想不到的后果的信息。 但是,例如通过在Internet Explorer 6中测试此实现,以及HSTS未实现的浏览器简单地忽略标题,我可以减轻我的担忧。 完善!

只需将以下行添加到/etc/nginx/perfect-forward-secrecy.conf的底部并保存更改:

add_header Strict-Transport-Security "max-age=31536000; includeSubDomains";
# This will prevent certain click-jacking attacks, but will prevent
# other sites from framing your site, so delete or modify as necessary!
add_header X-Frame-Options SAMEORIGIN;

重新加载(而不是重启)将足以强制NGINX提取这些特定的更改:

service nginx reload

可以通过https://www.ssllabs.com/ssltest/analyze.html测试您的实施来确认HSTS正常工作。 如果HSTS正确实施,您应该看到一个绿色的盒子正好低于你的分数,说:“这个服务器支持长时间的HTTP严格传输安全性,等级设置为A +。

恭喜!

您现在拥有Internet上最安全的SSL / TLS实现。

参考文献:

赞(52) 打赏
未经允许不得转载:优客志 » 系统运维
分享到:

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏