ext/openssl 的默认设置已更改

usa 发布于 2014 年 10 月 27 日

我们在 Ruby 2.1.4、Ruby 2.0.0-p594 和 Ruby 1.9.3-p550 中更改了 ext/openssl 的默认设置。通过此更改,不安全的 SSL/TLS 选项现在默认禁用。然而,通过此更改,SSL 连接可能存在一些问题。

详情

出于历史原因,OpenSSL 仍然实现了今天被认为不安全的协议和密码。例如 POODLE 漏洞 ( CVE-2014-3566 ),如果您继续使用具有这些不安全功能的 OpenSSL,您可能无法保证网络通信的安全。因此,根据 Bug #9424 的讨论,我们决定默认禁用这些不安全的 SSL/TLS 选项。如果您需要取消此更改(如下所示),请应用反向补丁进行撤销。

2.1.4
r48098
2.0.0-p594
r48110
1.9.3-p550
r48121

但是,如果您取消此更改,则可能无法保证网络通信的安全。您应该在删除它之前了解此更改的含义。

Ruby 的内置库

此更改反映在 net/http, net/imap 和 net/pop 中。由于 DRb 和 WEBrick 单独接收设置,因此此更改不会影响它们。

直接使用 ext/openssl 的脚本

当实例化一个 OpenSSL::SSL::SSLContext 对象并调用实例方法 set_params 时,此更改将被反映。

特别是,像这样的代码

ctx = OpenSSL::SSL::SSLContext.new
ctx.set_params  # if you want to change some options, such as cert store, verify mode and so on, you can pass such parameters within a hash
ssl = OpenSSL::SSL::SSLSocket.new(socket, ctx)

当作为客户端使用 ext/openssl 时,我们假设此更改可能不会有问题。但是,如果您作为服务器使用 ext/openssl 并反映此更改,一些旧客户端(Windows XP 上的 Internet Explorer 6、旧手机上的浏览器等)可能无法连接到服务器。

是否启用此更改由您决定,请考虑权衡。

变通方法

如果您无法更新 Ruby 但必须应对不安全的 SSL/TLS 选项,请应用以下猴子补丁

module OpenSSL
  module SSL
    class SSLContext
      remove_const(:DEFAULT_PARAMS)
      DEFAULT_PARAMS = {
        :ssl_version => "SSLv23",
        :verify_mode => OpenSSL::SSL::VERIFY_PEER,
        :ciphers => %w{
          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-DSS-AES128-GCM-SHA256
          DHE-RSA-AES256-GCM-SHA384
          DHE-DSS-AES256-GCM-SHA384
          ECDHE-ECDSA-AES128-SHA256
          ECDHE-RSA-AES128-SHA256
          ECDHE-ECDSA-AES128-SHA
          ECDHE-RSA-AES128-SHA
          ECDHE-ECDSA-AES256-SHA384
          ECDHE-RSA-AES256-SHA384
          ECDHE-ECDSA-AES256-SHA
          ECDHE-RSA-AES256-SHA
          DHE-RSA-AES128-SHA256
          DHE-RSA-AES256-SHA256
          DHE-RSA-AES128-SHA
          DHE-RSA-AES256-SHA
          DHE-DSS-AES128-SHA256
          DHE-DSS-AES256-SHA256
          DHE-DSS-AES128-SHA
          DHE-DSS-AES256-SHA
          AES128-GCM-SHA256
          AES256-GCM-SHA384
          AES128-SHA256
          AES256-SHA256
          AES128-SHA
          AES256-SHA
          ECDHE-ECDSA-RC4-SHA
          ECDHE-RSA-RC4-SHA
          RC4-SHA
        }.join(":"),
        :options => -> {
          opts = OpenSSL::SSL::OP_ALL
          opts &= ~OpenSSL::SSL::OP_DONT_INSERT_EMPTY_FRAGMENTS if defined?(OpenSSL::SSL::OP_DONT_INSERT_EMPTY_FRAGMENTS)
          opts |= OpenSSL::SSL::OP_NO_COMPRESSION if defined?(OpenSSL::SSL::OP_NO_COMPRESSION)
          opts |= OpenSSL::SSL::OP_NO_SSLv2 if defined?(OpenSSL::SSL::OP_NO_SSLv2)
          opts |= OpenSSL::SSL::OP_NO_SSLv3 if defined?(OpenSSL::SSL::OP_NO_SSLv3)
          opts
        }.call
      }
    end
  end
end

受此更改影响的版本

  • Ruby 1.9.3 patchlevel 550 及更高版本
  • Ruby 2.0.0 patchlevel 594 及更高版本
  • Ruby 2.1.4 及更高版本
  • trunk 修订版 48097 及更高版本

历史

  • 最初发布于 2014-10-27 12:00:00 (UTC)

近期新闻

Ruby 4.0.0 发布

我们很高兴地宣布 Ruby 4.0.0 的发布。Ruby 4.0 引入了“Ruby Box”和“ZJIT”,并增加了许多改进。

naruse 发布于 2025 年 12 月 25 日

Ruby 文档的全新外观

继 ruby-lang.org 重新设计之后,我们还有更多好消息来庆祝 Ruby 成立 30 周年:docs.ruby-lang.org 采用了 Aliki——RDoc 的新默认主题,焕然一新。

Stan Lo 发布于 2025 年 12 月 23 日

重新设计我们的网站标识

我们很高兴地宣布对我们的网站进行全面重新设计。此次更新的设计由 Akatsuka Taeko 创作。

Hiroshi SHIBATA 发布于 2025 年 12 月 22 日

Ruby 4.0.0 preview3 发布

我们很高兴地宣布 Ruby 4.0.0-preview3 的发布。Ruby 4.0 引入了 Ruby::Box 和“ZJIT”,并增加了许多改进。

naruse 发布于 2025 年 12 月 18 日

更多新闻...