Publicado por usa el 2014-10-27
Traducción de David Padilla
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), 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, hemos decidido deshabilitar esas opciones inseguras de SSL/TLS por defecto. Si necesitas cancelar este cambio (mostrado abajo) aplica el parche inverso para revertirlo.
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:
ctx = OpenSSL::SSL::SSLContext.new
ctx.set_params # Si quieres cambiar algunas opciones como el modo de verificacion, el almacenamiento del certificado, puedes enviar esos parametros en un hash
ssl = OpenSSL::SSL::SSLSocket.new(socket, ctx)
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:
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
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)