Мы изменили дефолтные настройки ext/openssl в Ruby 2.1.4, Ruby 2.0.0-p594 и Ruby 1.9.3-p550.
С этими изменениями небезопасные опции SSL/TLS теперь выключены по умолчанию.
Несмотря на эти изменения, проблемы в соединении SSL все еще вероятны.

## Детали

OpenSSL до сих пор реализует протоколы и шифры, исторически признанные небезопасными на сегодняшний день.
Например, POODLE уязвимость ([CVE-2014-3566](http://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2014-3566)).
Если вы продолжите использовать OpenSSL с подобными небезопасными фичами, возможно, вы не сможете обеспечить безопасность
сетевых коммуникаций. Так, основываясь на дискуссии в [Bug #9424](https://bugs.ruby-lang.org/issues/9424),
мы решили отключить подобные опции для SSL/TLS по умолчанию.
Если вам надо отменить эти изменения (показанные ниже), примените обратный патч, чтобы включить эти опции снова.

2.1.4
: [r48098](https://svn.ruby-lang.org/cgi-bin/viewvc.cgi?revision=48098&view=revision)

2.0.0-p594
: [r48110](https://svn.ruby-lang.org/cgi-bin/viewvc.cgi?revision=48110&view=revision)

1.9.3-p550
: [r48121](https://svn.ruby-lang.org/cgi-bin/viewvc.cgi?revision=48121&view=revision)

В любом случае, если вы отмените эти изменения, есть риск, что вы не сможете гарантировать безопасность сетевых коммуникаций.
Вы должны понимать последстивия этих изменений, прежде чем отменять их.

### Встроенные библиотеки Ruby

Это изменение затрагивает net/http, net/imap и net/pop.
С тех пор как DRb и WEBrick настраиваются отдельно, это изменение не затрагивает их.

### Скрипты, которые используют ext/openssl напрямую

Это изменение влияет на метод `set_params` объекта `OpenSSL::SSL::SSLContext`.

Например, в следующем коде:

<figure class="highlight"><pre><code class="language-ruby" data-lang="ruby"><span class="n">ctx</span> <span class="o">=</span> <span class="no">OpenSSL</span><span class="o">::</span><span class="no">SSL</span><span class="o">::</span><span class="no">SSLContext</span><span class="p">.</span><span class="nf">new</span>
<span class="n">ctx</span><span class="p">.</span><span class="nf">set_params</span>  <span class="c1"># если вы хотите изменить какие-либо опции, например, хранилище сертификата, режим проверки и т.п., вы можете передать эти параметры в hash</span>
<span class="n">ssl</span> <span class="o">=</span> <span class="no">OpenSSL</span><span class="o">::</span><span class="no">SSL</span><span class="o">::</span><span class="no">SSLSocket</span><span class="p">.</span><span class="nf">new</span><span class="p">(</span><span class="n">socket</span><span class="p">,</span> <span class="n">ctx</span><span class="p">)</span></code></pre></figure>

Когда ext/openssl используется на стороне клиента, мы предполагаем, что никаких проблем с представленными изменениями быть не должно.
Но, если вы используете ext/openssl на серверной стороне и у вас есть код, приведенный выше, некоторые
старые клиенты (Internet Explorer 6 на Windows XP, браузеры в старых мобильных телефонах и т.п.), возможно не смогут подключиться к серверу.

Применять или не применять данные изменения – решение остается за вами.

## Обходной путь

Если вы не можете обновить Ruby, но хотите отключить небезопасные опции SSL/TLS, примените следующий манкипатч:

<figure class="highlight"><pre><code class="language-ruby" data-lang="ruby"><span class="k">module</span> <span class="nn">OpenSSL</span>
  <span class="k">module</span> <span class="nn">SSL</span>
    <span class="k">class</span> <span class="nc">SSLContext</span>
      <span class="n">remove_const</span><span class="p">(</span><span class="ss">:DEFAULT_PARAMS</span><span class="p">)</span>
      <span class="no">DEFAULT_PARAMS</span> <span class="o">=</span> <span class="p">{</span>
        <span class="ss">:ssl_version</span> <span class="o">=&gt;</span> <span class="s2">"SSLv23"</span><span class="p">,</span>
        <span class="ss">:verify_mode</span> <span class="o">=&gt;</span> <span class="no">OpenSSL</span><span class="o">::</span><span class="no">SSL</span><span class="o">::</span><span class="no">VERIFY_PEER</span><span class="p">,</span>
        <span class="ss">:ciphers</span> <span class="o">=&gt;</span> <span class="sx">%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
        }</span><span class="p">.</span><span class="nf">join</span><span class="p">(</span><span class="s2">":"</span><span class="p">),</span>
        <span class="ss">:options</span> <span class="o">=&gt;</span> <span class="o">-&gt;</span> <span class="p">{</span>
          <span class="n">opts</span> <span class="o">=</span> <span class="no">OpenSSL</span><span class="o">::</span><span class="no">SSL</span><span class="o">::</span><span class="no">OP_ALL</span>
          <span class="n">opts</span> <span class="o">&amp;=</span> <span class="o">~</span><span class="no">OpenSSL</span><span class="o">::</span><span class="no">SSL</span><span class="o">::</span><span class="no">OP_DONT_INSERT_EMPTY_FRAGMENTS</span> <span class="k">if</span> <span class="k">defined?</span><span class="p">(</span><span class="no">OpenSSL</span><span class="o">::</span><span class="no">SSL</span><span class="o">::</span><span class="no">OP_DONT_INSERT_EMPTY_FRAGMENTS</span><span class="p">)</span>
          <span class="n">opts</span> <span class="o">|=</span> <span class="no">OpenSSL</span><span class="o">::</span><span class="no">SSL</span><span class="o">::</span><span class="no">OP_NO_COMPRESSION</span> <span class="k">if</span> <span class="k">defined?</span><span class="p">(</span><span class="no">OpenSSL</span><span class="o">::</span><span class="no">SSL</span><span class="o">::</span><span class="no">OP_NO_COMPRESSION</span><span class="p">)</span>
          <span class="n">opts</span> <span class="o">|=</span> <span class="no">OpenSSL</span><span class="o">::</span><span class="no">SSL</span><span class="o">::</span><span class="no">OP_NO_SSLv2</span> <span class="k">if</span> <span class="k">defined?</span><span class="p">(</span><span class="no">OpenSSL</span><span class="o">::</span><span class="no">SSL</span><span class="o">::</span><span class="no">OP_NO_SSLv2</span><span class="p">)</span>
          <span class="n">opts</span> <span class="o">|=</span> <span class="no">OpenSSL</span><span class="o">::</span><span class="no">SSL</span><span class="o">::</span><span class="no">OP_NO_SSLv3</span> <span class="k">if</span> <span class="k">defined?</span><span class="p">(</span><span class="no">OpenSSL</span><span class="o">::</span><span class="no">SSL</span><span class="o">::</span><span class="no">OP_NO_SSLv3</span><span class="p">)</span>
          <span class="n">opts</span>
        <span class="p">}.</span><span class="nf">call</span>
      <span class="p">}</span>
    <span class="k">end</span>
  <span class="k">end</span>
<span class="k">end</span></code></pre></figure>

## Версии, затронутые изменениями

* Ruby 1.9.3 patchlevel 550 и позднее
* Ruby 2.0.0 patchlevel 594 и позднее
* Ruby 2.1.4 и позднее
* ревизия 48097 и позднее в trunk

## История

* Оригинал опубликован 2014-10-27 12:00:00 (UTC)
