.net openssl x509certificate sslstream

.net - La autenticación falló porque la parte remota ha cerrado la secuencia de transporte



openssl x509certificate (6)

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 usará el protocolo correcto de forma predeterminada y no requiere ninguna solución.

Estoy desarrollando un cliente TCP para conectar el servidor OpenSSL con la autenticación del certificado. He usado 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 SslStream.AuthenticateAsClient llamando SslStream.AuthenticateAsClient método SslStream.AuthenticateAsClient pasando IP servidor, SslProtocols.Ssl3 y X509CertificateCollection .

Estoy teniendo el siguiente error:

La autenticación falló porque la parte remota ha cerrado la secuencia de transporte


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. Agregar chargify.ProtocolType = SecurityProtocolType.Tls12; a la configuración me resolvió el problema.

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.


Si desea utilizar una versión anterior de .net, cree su propia bandera y envíela.

// // 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); }


using (var client = new HttpClient(handler)) { ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12 | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls; var response = await client.SendAsync(new HttpRequestMessage(HttpMethod.Get, apiEndPoint)).ConfigureAwait(false); await response.Content.ReadAsStringAsync().ConfigureAwait(false); }

Esto funciono para mi