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.
Respuestas:
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
fuente
SecurityProtocolType.Tls
(y, por lo tanto, TLS 1.0) en .net framework 3.5 o inferiorTLS
era 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.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:
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/284795No 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?
fuente
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.
fuente