Змінено налаштування за замовчуванням ext/openssl

Опублікував usa 27-10-2014
Переклав: Andrii Furmanets

Ми змінили налаштування за замовчуванням ext/openssl в Ruby 2.1.4, Ruby 2.0.0-p594 та Ruby 1.9.3-p550. З цією зміною, небезпечні опції SSL/TLS тепер вимкнено за замовчуванням. Однак, через цю зміну, є можливість деяких проблем у з’єднанні SSL.

Деталі

OpenSSL все ще реалізує протоколи та шифри, які вважаються небезпечними сьогодні через історичні обставини. Як вразливість POODLE (CVE-2014-3566), якщо ви продовжуєте використовувати OpenSSL з такими небезпечними функціями, ви можете не змогти зберегти безпеку мережевого зв’язку. Тому, на основі обговорення в Помилка #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  # якщо ви хочете змінити деякі опції, такі як сховище сертифікатів, режим перевірки тощо, ви можете передати такі параметри в хеші
ssl = OpenSSL::SSL::SSLSocket.new(socket, ctx)

При використанні ext/openssl як клієнтської сторони, ми припускаємо, що може не бути проблеми з цією зміною. Однак, якщо ви використовуєте ext/openssl як серверну сторону та відображаєте цю зміну, деякі старі клієнти (Internet Explorer 6 на Windows XP, браузери в старих мобільних телефонах, тощо) можуть не змогти підключитися до сервера.

Ваше рішення, чи вмикати цю зміну чи ні, розгляньте компроміси.

Обхідний шлях

Якщо ви не можете оновити Ruby, але вам потрібно впоратися з небезпечними опціями SSL/TLS, застосуйте наступний monkey-patch:

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 рівень патчу 550 та пізніші
  • Ruby 2.0.0 рівень патчу 594 та пізніші
  • Ruby 2.1.4 та пізніші
  • ревізія 48097 та пізніші trunk

Історія

  • Спочатку опубліковано 2014-10-27 12:00:00 (UTC)

Останні новини

Вийшов Ruby 4.0.0

Ми раді повідомити про випуск Ruby 4.0.0. Ruby 4.0 представляє “Ruby Box” та “ZJIT”, а також додає багато покращень.

Опублікував naruse 25-12-2025

Новий вигляд документації Ruby

Слідом за ре-дизайном ruby-lang.org, ми маємо більше новин, щоб відсвяткувати 30-річчя Ruby: docs.ruby-lang.org має повністю новий вигляд завдяки Aliki — новій темі за замовчуванням для...

Опублікував Stan Lo 23-12-2025

Більше новин...