tls the supported requested protocol not example c# ssl .net-4.5 webrequest poodle-attack

the - tls 1.2 c#



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

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

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

Si el servidor no admite TLS, recurrirá a SSL, por lo tanto, 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:

https://serverfault.com/questions/637207/on-iis-how-do-i-patch-the-ssl-3-0-poodle-vulnerability-cve-2014-3566

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

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

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


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

Dos herramientas excelentes para verificar la compatibilidad de protocolos en los navegadores son la prueba de cliente de SSL Lab y https://www.howsmyssl.com/ . Este último no requiere Javascript, por lo que puede probarlo desde el 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á utilizando TLS 1.0, que es muy antiguo, posiblemente susceptible al ataque BEAST, y no tiene los mejores conjuntos 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. Encontré que HttpClient solo admite SSL 3 y TLS 1.0. Eso es preocupante. Esto es comparable a Internet Explorer 7 de 2006.

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

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


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

Si fuerza TLS 1.2, considere dejar algún tipo de ruta que eliminará esa fuerza si actualiza al marco 4.6 o superior.