为了对 Nginx 使用强化 SSL 配置,我们需要做出哪些兼容性权衡?

为了对 Nginx 使用强化 SSL 配置,我们需要做出哪些兼容性权衡?

我发现了一些强化的 SSL 设置github.com/ioerror/duraconf

这是配置的标题:

这是一个高安全性、兼容 SSLv3 和 TLSv1 的 HTTPS 代理服务器示例。该服务器仅允许提供完美前向保密性的模式;不提供其他模式。匿名密码模式被禁用。此配置不包括 HSTS 标头,以确保用户在首次访问后不会意外连接到不安全的 HTTP 服务。

它仅支持 PFS 模式下的强密码:

ssl_prefer_server_ciphers on;
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;

# Only strong ciphers in PFS mode
ssl_ciphers ECDHE-RSA-AES256-SHA:DHE-RSA-AES256-SHA:DHE-DSS-AES256-SHA:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA;
ssl_protocols SSLv3 TLSv1;

如果我们要在网站上使用这些设置,“有点兼容”是什么意思?例如,IE6 是否仍能连接?

答案1

Windows XP(即 6、7 和 8)上的 Internet Explorer 无法连接,因为它们不支持前向保密。您可以在SSL实验室

除此之外一切都应该可以正常工作,但旧的移动客户端可能无法连接。这需要进一步测试。


我个人认为这种配置不适合现实世界的网站。AES256是假的,只会增加连接时间。AES128已经足够好了普通的网站,看看Seagate 的此文档。除非您计划部署银行网站或举报系统,否则请继续使用AES128并节省服务器的计算开销。

我个人的 nginx 配置如下(完整的 nginx 配置可以在这里找到在我的一个存储库中)。

# Content Security Policy
#
# LINK: http://www.w3.org/TR/CSP/
add_header    X-WebKit-CSP              "default-src 'self' *.example.com;";
add_header    X-Content-Security-Policy "default-src 'self' *.example.com;";
add_header    Content-Security-Policy   "default-src 'self' *.example.com;";

# Do not allow embeding of our website in iframes.
#
# LINK: http://tools.ietf.org/html/rfc7034
# LINK: http://tools.ietf.org/html/draft-ietf-websec-frame-options-00
add_header X-Frame-Options "DENY";
add_header Frame-Options   "DENY";

# Only communicate view encrypted connections on all domains, forever!
#
# LINK: https://tools.ietf.org/html/rfc6797
add_header Strict-Transport-Security "max-age=262974383; includeSubdomains;";

# (Re)Enable web browser XSS filter protection (IE+Chrome).
#
# LINK: http://blogs.msdn.com/b/ie/archive/2008/07/02/ie8-security-part-iv-the-xss-filter.aspx
add_header X-XSS-Protection "1; mode=block";

# Use a public DNS to resolve OCSP responder hostnames. The answer stays valid for a complete day.
#
# LINK: http://pcsupport.about.com/od/tipstricks/a/free-public-dns-servers.htm
resolver 209.244.0.3 209.244.0.4 valid=86400;

# We only support AES128 and Elliptic curve Diffie–Hellman (ECDH) plus Diffie–Hellman (DH) in order to enable Forward
# Secrecy. This configuration ensures highest compatibility, best performance while still being extremely secure. Please
# note that using AES128 isn't really less secure than any other AES implementation.
#
# LINK: http://www.scribd.com/doc/29872766/128-Bit-vs-256-Bit-AES-Encryption
ssl_ciphers    "EECDH+AESGCM EDH+AESGCM EECDH -RC4 EDH -CAMELLIA -SEED !aNULL !eNULL !LOW !3DES !MD5 !EXP !PSK !SRP !DSS !RC4 !AES256";
ssl_ecdh_curve secp384r1;

# Prefer our configured ciphers over the client specified ones.
ssl_prefer_server_ciphers on;

# Only support newest protocols, unfortunately we have to support TLS 1.0 and 1.1, otherwise 99% of the internet can't
# connect to our server.
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;

# Use a shared (among all nginx worker threads) cache for SSL sessions; one megabyte can store about 4000 sessions.
#
# LINK: http://nginx.org/en/docs/http/ngx_http_ssl_module.html#ssl_session_cache
ssl_session_cache shared:SSL:100m;

# Number of seconds before an SSL session expires in the session cache. Should match the keepalive value.
#
# LINK: http://nginx.org/en/docs/http/ngx_http_ssl_module.html#ssl_session_timeout
# LINK: http://httpd.apache.org/docs/2.2/mod/mod_ssl.html#sslsessioncachetimeout
ssl_session_timeout 60;

# Enable OCSP stapling.
#
# LINK: http://tools.ietf.org/html/rfc4366#section-3.6
# LINK: http://tools.ietf.org/html/rfc6066
ssl_stapling        on;
ssl_stapling_verify on;

# The certificate of our authority for OCSP verification.
ssl_trusted_certificate ssl/ca-bundle.pem;

我还使用自定义init.d脚本启动 nginx 并直接获取 OSCP 响应,这确保所有客户端都可以验证它。您可以找到它在我的一个存储库中

答案2

对于 SSL 来说,“强化” 是什么意思?

首先,使用哪些 cipher_suites 取决于服务器上有哪些 cipher_suites,然后取决于 server_suggestions,最后取决于客户端能够说什么。使用这些 cipher_suites,您已经配置了 ECDHE 和 DHE,当您想要使用 PFS 时,这还算可以,但由于仅启用了 TLSv1,我认为您无论如何都无法使用 ECDHE,因此您将坚持使用 DHE,它可能适用于大多数浏览器。一些非常老旧的客户端(IIRC IE <= 9)可能无法使用 PFS,因此您将使用此配置将它们排除在外。

如果你想通过浏览器测试给定的密码套件:

  • 配置你的 nginx 来使用它们
  • 检查这些密码ssllabs.com
  • 你可以使用以下命令检查服务器上有哪些密码可用openssl ciphers

从第三方获取cipher_suggestions的问题:

  • 如果你的服务器不支持 tlsv1.2,那么你将无法使用现代 PFS 密码套件(如所有那些 ECDHE 密码),但可以使用非常慢的 DHE 密码
  • 您应该始终对您的密码套件进行性能测试和 SSLBash 检查,以查看哪些浏览器可能出现问题。

您可以在这里找到有关 nginx + ssl 的更多信息:Nginx + SSL + SPDY 指南


我不喜欢您链接到的 nginx-config 中的某些内容:

  • 缓存还缓存了来自上游的“故障”
  • ssl-config 并不是最好的,而且安全性肯定不高

~~~

ssl_protocols SSLv3 TLSv1;
# -> no tlsv1.2/tlsv1.2??? this is NOT high security
# as mentioned in the header

proxy_cache_valid  any 1h;
# REALLY???

~~~

答案3

我最好的猜测是,“有点兼容”是用来表示“不完全兼容”的一种方式。

该密码列表不支持 IE6,因为 IE6 没有可用的 FPS 密码。

您可能还会发现本文使用。

相关内容