我如何决定使用 nginx 设置哪些 ssl_protocols 和 ssl_ciphers?

我如何决定使用 nginx 设置哪些 ssl_protocols 和 ssl_ciphers?

我最近为我的域添加了 TLS(使用 certbot 的 letsencrypt)。它带有基本配置options-ssl-nginx.conf包括

ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers "ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA:ECDHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES256-SHA:ECDHE-ECDSA-DES-CBC3-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:DES-CBC3-SHA:!DSS";

此部分与Mozilla 的建议

然后我检查了我的域名https://ssldecoder.org和。他们抱怨我的服务器不支持 TLSv1.3

问题 1:为什么 TLSv1.3 不在 ssl_protocols 中?还有什么理由不添加它呢?

检查我的网站https://www.ssllabs.com/ssltest显示了一些关于支持的 SSL 密码的投诉:

  • TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256
  • TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384
  • TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA
  • TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA
  • TLS_DHE_RSA_WITH_AES_128_CBC_SHA256
  • TLS_DHE_RSA_WITH_AES_128_CBC_SHA
  • TLS_DHE_RSA_WITH_AES_256_CBC_SHA256
  • TLS_DHE_RSA_WITH_AES_256_CBC_SHA
  • TLS_RSA_WITH_AES_128_GCM_SHA256
  • TLS_RSA_WITH_AES_256_GCM_SHA384
  • TLS_RSA_WITH_AES_128_CBC_SHA256
  • TLS_RSA_WITH_AES_256_CBC_SHA256
  • TLS_RSA_WITH_AES_128_CBC_SHA
  • TLS_RSA_WITH_AES_256_CBC_SHA

问题 2:我应该如何决定支持哪些密码?

如果支持的密码较少,能够访问网站的设备就会较少。但是有没有办法让我判断会有多少个(比如caniuse.com 提供 css,但对于密码来说)?而且,由于这是优先顺序,客户端仍然可以选择他们喜欢的任何人:为什么我不应该支持所有?

答案1

这个问题没有唯一正确的答案,因为选择密码套件必须在安全性和兼容性之间做出适当的妥协。Mozilla 的服务器端 TLS 指南配置生成器上的链接解释了不同配置文件的用途:

  • 现代兼容性。对于不需要向后兼容的服务,以下参数可提供更高级别的安全性。此配置兼容 Firefox 27、Chrome 30、Windows 7 上的 IE 11、Edge、Opera 17、Safari 9、Android 5.0 和 Java 8。

  • 中等兼容性(默认)。对于不需要兼容旧客户端(主要是 WinXP),但仍需要支持各种客户端的服务,建议使用此配置。它与 Firefox 1、Chrome 1、IE 7、Opera 5 和 Safari 兼容

  • 旧向后兼容性。这是适用于所有 Windows XP/IE6 客户端的旧密码套件。它应仅作为最后的手段使用。

将 TLS 1.3 添加到这些建议中讨论,但尚未添加。这个理由来自 2016 年,当时 TLS 1.3 还没有被提出作为标准RFC 8446

jvehent 于 2016 年 12 月 27 日 贡献者

我认为我们不应该在这里推荐实验版本。我们等待 CHACHA20 标准化后才将其添加到指南中,TLS1.3 也是如此。

同样,Qualys SSL Labs 也发布了SSL 和 TLS 部署最佳实践。由于它(截至 2019 年 6 月)上次更新时间为 2017 年 5 月,其中还提到 TLS 1.3 仅作为未来协议,但它解释了 TLS 1.2 之前的旧版本的问题:

TLS v1.2 应成为您的主要协议,因为它是唯一提供现代认证加密(也称为 AEAD)的版本。如果您现在不支持 TLS v1.2,您的安全性就会不足。

为了支持较旧的客户端,您可能需要暂时继续支持 TLS v1.0 和 TLS v1.1。但是,您应该计划在不久的将来停用 TLS v1.0。例如,PCI DSS 标准将要求所有接受信用卡付款的网站在 2018 年 6 月之前取消对 TLS v1.0 的支持。

目前正在进行 TLS v1.3 的设计工作,目的是删除所有过时和不安全的功能,并做出改进,以保证我们在未来几十年的通信安全。

SSL Labs 服务器测试更新更频繁,并指出了其他可能存在的弱点:

  • 所有TLS_RSA密码套件均被标记为弱密码套件,因为它们不提供前向保密性:如果私钥将来被泄露,则可以使用它解密所有记录的流量。
  • 所有密码套件均采用密码块链接 CBC并不一定很弱,但有很多实现都容易受到填充预言攻击他们决定将它们全部标记为弱。

我们还有一个当前最佳实践 RFC 7525从2015年5月起;安全使用传输层安全性 (TLS) 和数据报传输层安全性 (DTLS) 的建议。 它是第4.2节给出了与 Mozilla 的现代兼容性和 SSL Labs 服务器测试类似的建议:

鉴于上述考虑,建议实施和部署以下密码套件:

  • TLS_DHE_RSA_WITH_AES_128_GCM_SHA256

  • TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256

  • TLS_DHE_RSA_WITH_AES_256_GCM_SHA384

  • TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384

这些密码套件仅在 TLS 1.2 中受支持,因为它们是经过认证的加密 (AEAD) 算法 [RFC5116]。

基于这一切,也许可以“根据您的需要进行调整“例如现代简介

  • 从现代兼容性配置文件中删除基于 CBC 的密码套件,即删除ECDHE-ECDSA-AES256-SHA384、、、ECDHE-RSA-AES256-SHA384ECDHE-ECDSA-AES128-SHA256ECDHE-RSA-AES128-SHA256
  • 添加 DHE 密码套件,只要它们的密钥长度至少为 2048 位并使用 GCM 模式:DHE-RSA-AES256-GCM-SHA384DHE-RSA-AES128-GCM-SHA256

SSL Labs 服务器测试中的“握手模拟”部分有助于指出配置不支持的浏览器。您可以自行决定是否支持它们,并添加该浏览器上可用的最强密码套件。

是否等待 Mozilla 的建议实施 TLS 1.3 也是基于个人观点的。好消息是 TLS 1.3 已完全取消对所有旧算法的支持,这使得挑选坏密码套件变得更加困难。来自RFC 8446, 1.2。 与 TLS 1.2 的主要区别

受支持的对称加密算法列表已删除所有被视为遗留的算法。剩下的都是带关联数据的认证加密 (AEAD) 算法。密码套件概念已更改,以将身份验证和密钥交换机制与记录保护算法(包括密钥长度)和用于密钥派生函数和握手消息认证码 (MAC) 的哈希分开。

相关内容