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 :
File.WriteAllText("howsmyssl-httpclient.html", new HttpClient().GetStringAsync("https://www.howsmyssl.com").Result);
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?