Autenticación fallida porque la parte remota ha cerrado la transmisión de transporte

Estoy desarrollando un cliente TCP para conectar el servidor OpenSSL con la autenticación de certificado. Tengo archivos .crt y .key compartidos por el equipo del servidor. Estos certificados son generados por los comandos de OpenSSL.

Estoy usando el objeto SslStream para autenticar el cliente Tcp al llamar SslStream.AuthenticateAsClient método SslStream.AuthenticateAsClient pasando la IP servidor, SslProtocols.Ssl3 y X509CertificateCollection .

Estoy teniendo el siguiente error:

Autenticación fallida porque la ubicación remota ha cerrado la transmisión de transporte

Por favor, ayuda en este tema y gracias de antemano.

Aconsejaría no restringir el SecurityProtocol a TLS 1.1.

La solución recomendada es usar

 System.Net.ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12 | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls 

Otra opción es agregar la siguiente clave de registro:

 Key: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework\v4.0.30319 Value: SchUseStrongCrypto 

Vale la pena señalar que .NET 4.6 utilizará el protocolo correcto de manera predeterminada y no requiere ninguna solución.

Si desea utilizar una versión anterior de .net, cree su propia bandera y ejecútelo.

  // // Summary: // Specifies the security protocols that are supported by the Schannel security // package. [Flags] private enum MySecurityProtocolType { // // Summary: // Specifies the Secure Socket Layer (SSL) 3.0 security protocol. Ssl3 = 48, // // Summary: // Specifies the Transport Layer Security (TLS) 1.0 security protocol. Tls = 192, // // Summary: // Specifies the Transport Layer Security (TLS) 1.1 security protocol. Tls11 = 768, // // Summary: // Specifies the Transport Layer Security (TLS) 1.2 security protocol. Tls12 = 3072 } public Session() { System.Net.ServicePointManager.SecurityProtocol = (SecurityProtocolType)(MySecurityProtocolType.Tls12 | MySecurityProtocolType.Tls11 | MySecurityProtocolType.Tls); } 

Agregar el siguiente código me ayudó a superar el problema.

 ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls11; 

Me encontré con el mismo mensaje de error mientras usaba ChargifyNET.dll para comunicarme con la API de Chargify. Añadiendo chargify.ProtocolType = SecurityProtocolType.Tls12; a la configuración resuelto el problema para mí.

Aquí está el fragmento de código completo:

 public ChargifyConnect GetChargifyConnect() { var chargify = new ChargifyConnect(); chargify.apiKey = ConfigurationManager.AppSettings["Chargify.apiKey"]; chargify.Password = ConfigurationManager.AppSettings["Chargify.apiPassword"]; chargify.URL = ConfigurationManager.AppSettings["Chargify.url"]; // Without this an error will be thrown. chargify.ProtocolType = SecurityProtocolType.Tls12; return chargify; } 

Para VB.NET, puede colocar lo siguiente antes de su solicitud web:

 Const _Tls12 As SslProtocols = DirectCast(&HC00, SslProtocols) Const Tls12 As SecurityProtocolType = DirectCast(_Tls12, SecurityProtocolType) ServicePointManager.SecurityProtocol = Tls12 

Esto resolvió mi problema de seguridad en .NET 3.5.