tls the servicepointmanager servercertificatevalidationcallback secure not net example create could aborted .net httpwebrequest ssl

.net - servicepointmanager - the request was aborted could not create ssl tls secure channel httpwebrequest



¿Cómo usar SSL3 en lugar de TLS en una HttpWebRequest en particular? (2)

Mi aplicación tiene que hablar con diferentes hosts a través de https, y la configuración predeterminada de ServicePointManager.SecurityProtocol = TLS me ha servido hasta el día de hoy. Ahora tengo algunos hosts que (como muestra el registro de seguimiento de System.Net ) no responden al mensaje de saludo de TLS inicial, pero mantienen la conexión subyacente abierta hasta que se agota el tiempo de espera, lanzando una excepción de tiempo de espera. Intenté configurar el tiempo de espera de HttpWebRequest hasta 5 minutos, con el mismo resultado. Es de suponer que estos hosts están esperando un protocolo de enlace SSL3, ya que tanto IE como Firefox pueden conectarse a estos hosts después de un retraso de 30-40 segundos. Parece que hay algún mecanismo alternativo en .NET que degrada TLS a SSL3, pero no se activa por alguna razón.

FWIW, aquí está el mensaje de saludo que está enviando mi solicitud (un mensaje habitual HLS CLIENTE 1.0 TLS):

00000000 : 16 03 01 00 57 01 00 00-53 03 01 4C 12 39 B4 F9 : ....W...S..L.9.. 00000010 : A3 2C 3D EE E1 2A 7A 3E-D2 D6 0D 2E A9 A8 6C 03 : .,=..*z>......l. 00000020 : E7 8F A3 43 0A 73 9C CE-D7 EE CF 00 00 18 00 2F : ...C.s........./ 00000030 : 00 35 00 05 00 0A C0 09-C0 0A C0 13 C0 14 00 32 : .5.............2 00000040 : 00 38 00 13 00 04 01 00-00 12 00 0A 00 08 00 06 : .8.............. 00000050 : 00 17 00 18 00 19 00 0B-00 02 01 00 : ............

¿Hay alguna manera de usar SSL3 en lugar de TLS en una HttpWebRequest particular, o forzar un repliegue? Parece que la configuración de ServicePointManager es global, y realmente odiaría tener que degradar la configuración del protocolo de seguridad a SSL3 para toda la aplicación.


.NET contiene disposiciones para negociar automáticamente versiones inferiores del protocolo. El valor de ServicePointManager.SecurityProtocol determina el comportamiento. Puede tomar 3 valores diferentes: SecurityProtocol.Ssl3, SecurityProtocol.Tls, or SecurityProtocol.Ssl3 | SecurityProtocol.Tls SecurityProtocol.Ssl3, SecurityProtocol.Tls, or SecurityProtocol.Ssl3 | SecurityProtocol.Tls . Aunque global, se puede cambiar según sea necesario.

No puedo identificar una solución sin tener acceso a un servidor con el mismo comportamiento erróneo. La única sugerencia que puedo hacer es intentar conectarme con el Ssl3 | Tls Configuración de Ssl3 | Tls , y si eso no funciona, Ssl3 intentar con la configuración de Ssl3 . Intente reducir el tiempo de espera y atrapar la excepción de tiempo de espera y luego vuelva a intentarlo.

EDITAR

Mucho de lo que escribí en la versión anterior de esta respuesta era incorrecto.


En realidad, la configuración de ServicePointManager es por dominio de aplicación. Esto me permitió solucionar el problema creando un dominio de app separado configurado para usar solo SSL3, haciendo que mi objeto de recopilación de datos MarshalByRefObject (tanto WebClient como WebRequest sean marshal-by-ref, pero es mejor para reducir el número de llamadas entre dominios de aplicación cruzada) y crearlo allí. Funcionó perfectamente combinado con un esquema de detección basado en tiempo de espera.