¿Qué versiones de SSL / TLS admite System.Net.WebRequest?

81

Ahora que se ha descubierto que SSL 3 es vulnerable al ataque POODLE :

¿Qué versiones de SSL / TLS utiliza System.Net.WebRequest cuando se conecta a cualquier Uri https?

Utilizo WebRequest para conectarme a varias API de terceros. Uno de estos ahora ha dicho que bloqueará cualquier solicitud que use SSL 3. Pero WebRequest es parte del marco central .Net (usando 4.5) por lo que no es obvio qué versión usa.

JK.
fuente
¿La WebRequest recurrirá a SSL 3 si el servidor (o el intermediario) lo solicita?
Philip Pittle
Si no me equivoco, creo que WebRequest mira el certificado de seguridad en el servidor que está intentando extraer y usa cualquier esquema de cifrado que esté en el servidor web. No creo que tengas que cambiar nada del lado del cliente.
Icemanind
1
Espero que los propietarios de la API que acaban de decir que no admitirán SSL3 hayan pensado en asegurarse de que su servidor no solicite que el cliente use SSL3 :)
JK.
@iceman ¿alguna forma de saber desde un certificado si es compatible con SSL3 o no? No veo ninguna propiedad relacionada con las versiones.
JK.
@JK. - No estoy seguro de otros navegadores, pero estoy usando Chrome. En Chrome, si va a un sitio web HTTPS (como Wellsfargo.com, por ejemplo), verá un candado verde cerca de la URL. Haga clic en ese candado, luego haga clic en la pestaña de conexión y se le mostrará. En el caso de wellsfargo.com, Chrome dice "La conexión usa TLS 1.0". IE y otros navegadores deberían mostrar lo mismo.
Icemanind

Respuestas:

51

Al usar System.Net.WebRequest, su aplicación negociará con el servidor para determinar la versión TLS más alta que tanto su aplicación como el servidor admiten, y utilizarla. Puede ver más detalles sobre cómo funciona esto aquí:

http://en.wikipedia.org/wiki/Transport_Layer_Security#TLS_handshake

Si el servidor no admite TLS, recurrirá a SSL, por lo que podría recurrir a SSL3. Puede ver todas las versiones que admite .NET 4.5 aquí:

http://msdn.microsoft.com/en-us/library/system.security.authentication.sslprotocols(v=vs.110).aspx

Para evitar que su aplicación sea vulnerable a POODLE, puede deshabilitar SSL3 en la máquina en la que se ejecuta su aplicación siguiendo esta explicación:

/server/637207/on-iis-how-do-i-patch-the-ssl-3-0-poodle-vulnerability-cve-2014-3566

Gareth Williams
fuente
20
Sugeriría que para hacer que las solicitudes salientes como WebRequest y HttpWebRequest sean seguras, debe seguir los pasos para deshabilitar el respaldo SSL como se detalla en mi pregunta en stackoverflow.com/questions/26389899/… . Básicamente, primero ejecuta esta línea de código: System.Net.ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12; Según tengo entendido, la corrección de registro detallada en esta respuesta solo se aplica a las conexiones entrantes.
Jordan Rieger
1
Tenga en cuenta que solo tiene la opción de SecurityProtocolType.Tls(y, por lo tanto, TLS 1.0) en .net framework 3.5 o inferior
James Westgate
¿Podría obtener un mayor soporte de TLS abandonando System.Net.WebRequest y usando otra biblioteca como RestSharp o es el marco .net real el que debe actualizarse?
The Muffin Man
Creo que este es el marco .net real que debe actualizarse. www.passionatecoder.ca
Ehsan
1
@JamesWestgate Tenía la impresión de que TLSera algo que realmente se implementaría a nivel de sistema operativo / máquina. ¿No es ahí donde se produce el tráfico HTTP real? Así que no creo que tenga sentido intentar decirle a su código que use un TLS en particular que está realmente determinado por el sistema operativo.
Don Cheadle
52

Esta es una pregunta importante. El protocolo SSL 3 (1996) se rompe irreparablemente por el ataque Poodle publicado en 2014. El IETF ha publicado "SSLv3 NO DEBE utilizarse" . Los navegadores web lo están abandonando. Mozilla Firefox y Google Chrome ya lo han hecho.

Dos excelentes herramientas para verificar el soporte de protocolos en los navegadores son la prueba del cliente de SSL Lab y https://www.howsmyssl.com/ . Este último no requiere Javascript, por lo que puede probarlo desde HttpClient de .NET :

// set proxy if you need to
// WebRequest.DefaultWebProxy = new WebProxy("http://localhost:3128");

File.WriteAllText("howsmyssl-httpclient.html", new HttpClient().GetStringAsync("https://www.howsmyssl.com").Result);

// alternative using WebClient for older framework versions
// new WebClient().DownloadFile("https://www.howsmyssl.com/", "howsmyssl-webclient.html");

El resultado es condenatorio:

Su cliente está usando TLS 1.0, que es muy antiguo, posiblemente susceptible al ataque BEAST, y no tiene las mejores suites de cifrado disponibles. Las adiciones como AES-GCM y SHA256 para reemplazar MD5-SHA-1 no están disponibles para un cliente TLS 1.0 ni para muchos conjuntos de cifrado más modernos.

Eso es preocupante. Es comparable al Internet Explorer 7 de 2006.

Para enumerar exactamente qué protocolos admite un cliente HTTP, puede probar los servidores de prueba específicos de la versión a continuación:

var test_servers = new Dictionary<string, string>();
test_servers["SSL 2"] = "https://www.ssllabs.com:10200";
test_servers["SSL 3"] = "https://www.ssllabs.com:10300";
test_servers["TLS 1.0"] = "https://www.ssllabs.com:10301";
test_servers["TLS 1.1"] = "https://www.ssllabs.com:10302";
test_servers["TLS 1.2"] = "https://www.ssllabs.com:10303";

var supported = new Func<string, bool>(url =>
{
    try { return new HttpClient().GetAsync(url).Result.IsSuccessStatusCode; }
    catch { return false; }
});

var supported_protocols = test_servers.Where(server => supported(server.Value));
Console.WriteLine(string.Join(", ", supported_protocols.Select(x => x.Key)));

Estoy usando .NET Framework 4.6.2. Descubrí que HttpClient solo admite SSL 3 y TLS 1.0. Eso es preocupante. Esto es comparable al Internet Explorer 7 de 2006.


Actualización: Resulta que HttpClient es compatible con TLS 1.1 y 1.2, pero debe activarlos manualmente en System.Net.ServicePointManager.SecurityProtocol. Ver https://stackoverflow.com/a/26392698/284795

No sé por qué usa malos protocolos listos para usar. Parece una mala elección de configuración, equivalente a un error de seguridad importante (apuesto a que muchas aplicaciones no cambian el valor predeterminado). ¿Cómo podemos denunciarlo?

Coronel Panic
fuente
¿Qué protocolo debo utilizar ?
Kiquenet
8

También puse una respuesta allí, pero el artículo al que se refiere la actualización de @Colonel Panic sugiere forzar TLS 1.2. En el futuro, cuando TLS 1.2 se vea comprometido o simplemente reemplazado, tener su código pegado a TLS 1.2 se considerará una deficiencia. La negociación a TLS1.2 está habilitada en .Net 4.6 de forma predeterminada. Si tiene la opción de actualizar su fuente a .Net 4.6, le recomiendo encarecidamente que cambie el forzado de TLS 1.2.

Si fuerza TLS 1.2, considere seriamente dejar algún tipo de ruta de navegación que elimine esa fuerza si actualiza a 4.6 o superior.

Profesor Von Lemongargle
fuente
2
"La negociación a TLS1.2 está habilitada en .Net 4.6 de forma predeterminada" ¿tiene documentación para esto?
felickz
2
En ese momento, encontramos documentación no concluyente que insinuaba esta característica (consulte msdn.microsoft.com/en-us/library/… justo encima de los ejemplos). Sin embargo, lo verificamos creando un programa de prueba con un servidor que estaba bloqueado en TLS 1.2 y usamos una búsqueda web para intentar descargar una página. Luego cambiamos las versiones del marco en el programa. Todas las versiones de nivel inferior no pudieron conectarse, pero .Net 4.6 se conectó sin problemas.
Prof Von Lemongargle
Gracias por los detalles, veo tantos proveedores de API que señalan que 4.5 no se conecta a TLS 1.2, pero tuve problemas para proporcionar documentación oficial y tuve que confiar en la comunidad :)
felickz
Esto es correcto y el camino a seguir. Tenemos varios servidores más antiguos que se comunican con puntos finales web que ahora insisten en TLS. Las referencias de servicios web comenzaron a fallar con errores de SSL / TLS. Puede piratear el registro, pero actualizar el servidor a la última versión .NET es más fácil y seguro.
Neil Laslett