En Ruby 2.1.4, Ruby 2.0.0-p594 y Ruby 1.9.3-p550 cambiamos la configuración
por defecto de ext/openssl.
Con este cambio las opciones inseguras de SSL/TLS ahora están desabilitadas,
y por esto puede darse la posibilidad de tener problemas con las conexiones
de SSL.

## Detalles

OpenSSL implementa protocolos y cifrados que son considerados inseguros al dia
de hoy por circunstancias históricas. Un ejemplo es la vulnerabilidad POODLE
([CVE-2014-3566](http://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2014-3566)),
utilizar OpenSSL con este tipo de vulnerabilidades no garantiza la seguridad
de la comunicación en tu red.
Basados en la discusión del [Bug #9424](https://bugs.ruby-lang.org/issues/9424),
hemos decidido deshabilitar esas opciones inseguras de SSL/TLS por defecto.
Si necesitas cancelar este cambio (mostrado abajo) aplica el parche
inverso para revertirlo.

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)

Pero recuerda, si cancelas este cambio corres el riesgo de comprometer la seguridad
de la comunicación en tu red.

### Librerías empaquetadas de Ruby

Este cambio se refleja en net/http, net/imap y net/pop.
Debido a que DRb y WEBrick reciben la configuración por separado, este cambio no
los afecta.

### Rutinas que usan ext/openssl directamente

Este cambio se refleja cuando un objeto `OpenSSL::SSL::SSLContext` es instanciado
y se llama al método `set_params` de esa instacia.

En particular código como:

<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"># Si quieres cambiar algunas opciones como el modo de verificacion, el almacenamiento del certificado, puedes enviar esos parametros en un 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>

Si utilizas ext/openssl como cliente, asumimos que no debe haber
problema con este cambio.
Pero si utilizas ext/openssl como servidor y aplicas este cambio, es posible
que algunos clientes viejos (Internet Explorer 6 en Windows XP, navegadores
en teléfonos celulares viejos, etc.) no puedan conectarse al servidor.

La decisión de habilitar o no este cambio es tuya, considera las consecuencias.

## Solución Alterna

Si por alguna razón no puedes actualizar Ruby pero tienes que manejar las
opciones inseguras de SSL/TLS, aplica a tu código el siguiente parche:

<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>

## Versiones afectadas por este cambio

* Ruby 1.9.3 patchlevel 550 y posteriores
* Ruby 2.0.0 patchlevel 594 y posteriores
* Ruby 2.1.4 y posteriores
* revisión 48097 y posteriores

## Historia

* Publicado originalmente 2014-10-27 12:00:00 (UTC)
