Mensaje de error
The SSL connection could not be established, see inner exception.
También se muestra como
- System.Net.Http.HttpRequestException: The SSL connection could not be established, see inner exception.
El texto es estable desde .NET Core 3.x hasta .NET 10. Los frameworks (Refit, gRPC, los SDK de Azure) pueden envolverlo una vez más, así que la excepción interna puede estar 2 o 3 niveles más abajo.
.NET HttpClient — HttpRequestException wrapping the AuthenticationException or IOException of the TLS handshake
Qué significa
Es el envoltorio genérico de HttpClient para cualquier fallo de TLS durante la conexión. El mensaje en sí no aporta ningún diagnóstico: el motivo real está en InnerException (una AuthenticationException que indica el problema del certificado, o una IOException del transporte). Registrar solo e.Message lo oculta; registra toda la cadena de excepciones.
Por qué ocurre
Falló la validación del certificado
frecuenteCadenas que no son de confianza o incompletas, certificados caducados o un nombre de host que no coincide: la AuthenticationException interna indica el valor de X509ChainStatus o de SslPolicyErrors.
Ningún protocolo ni algoritmo de cifrado en común
ocasionalServidores heredados con TLS 1.0/1.1 o con conjuntos de cifrado obsoletos; en Linux, las excepciones internas muestran el motivo de OpenSSL.
La conexión no era TLS o se cortó
ocasionalPuertos HTTP sin cifrar, proxies o firewalls que cierran la conexión, o servidores que cortan bruscamente el handshake.
Cómo solucionarlo
- 1.
Registrar la cadena de excepciones completa
Recorre InnerException (o registra el objeto de la excepción, no solo Message) para ver la causa real.
csharp catch (HttpRequestException e) { for (Exception? ex = e; ex != null; ex = ex.InnerException) logger.LogError("{Type}: {Message}", ex.GetType().FullName, ex.Message); } - 2.
Relacionar el mensaje interno con su causa
Cada mensaje interno apunta a una solución distinta; las entradas relacionadas de abajo las tratan una por una.
text Inner exception -> look at "...errors in the certificate chain: UntrustedRoot / PartialChain" -> trust store, server chain "...errors in the certificate chain: NotTimeValid" -> dates, clock "...validation procedure: RemoteCertificateNameMismatch" -> host name vs SAN "Cannot determine the frame size or a corrupted frame was received." -> port is not TLS "Received an unexpected EOF or 0 bytes from the transport stream." -> server/proxy closed "SSL Handshake failed with OpenSSL error - SSL_ERROR_SSL." -> protocol/cipher (Linux)
Errores relacionados
The remote certificate is invalid because of errors in the certificate chain: U….NET SslStream / HttpClientThe remote certificate is invalid according to the validation procedure: Remote….NET SslStream / HttpClientCannot determine the frame size or a corrupted frame was received..NET SslStream / HttpClientReceived an unexpected EOF or 0 bytes from the transport stream..NET SslStream / HttpClientSSL Handshake failed with OpenSSL error - SSL_ERROR_SSL..NET on Linux (SslStream over OpenSSL)