Mensagem de erro
The SSL connection could not be established, see inner exception.
Também aparece como
- System.Net.Http.HttpRequestException: The SSL connection could not be established, see inner exception.
O texto é o mesmo do .NET Core 3.x ao .NET 10. Frameworks (Refit, gRPC, SDKs do Azure) podem encapsulá-lo mais uma vez, então a exceção interna pode estar dois ou três níveis abaixo.
.NET HttpClient — HttpRequestException wrapping the AuthenticationException or IOException of the TLS handshake
O que significa
É o invólucro genérico do HttpClient para qualquer falha de TLS durante a conexão. A mensagem em si não traz diagnóstico: o motivo real está em InnerException (uma AuthenticationException que indica o problema do certificado, ou uma IOException do transporte). Registrar no log apenas e.Message esconde esse motivo; registre a cadeia de exceções inteira.
Por que acontece
A validação do certificado falhou
comumCadeias não confiáveis ou incompletas, certificados expirados ou divergência de nome de host: a AuthenticationException interna indica o valor de X509ChainStatus ou de SslPolicyErrors.
Nenhum protocolo ou cifra em comum
ocasionalServidores legados com TLS 1.0/1.1 ou com cipher suites obsoletas; no Linux, as exceções internas mostram o motivo do OpenSSL.
A conexão não era TLS ou foi cortada
ocasionalPortas de HTTP não criptografado, proxies ou firewalls que fecham a conexão, ou servidores que redefinem a conexão durante o handshake.
Como corrigir
- 1.
Registrar no log a cadeia de exceções completa
Percorra InnerException (ou registre no log o objeto da exceção, não só Message) para ver a 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.
Associar a mensagem interna à causa dela
Cada mensagem interna aponta para uma correção diferente; as entradas relacionadas abaixo tratam delas uma a uma.
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)
Erros 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)