.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