Message d’erreur
The SSL connection could not be established, see inner exception.
Également affiché sous la forme
- System.Net.Http.HttpRequestException: The SSL connection could not be established, see inner exception.
Le texte n’a pas changé de .NET Core 3.x à .NET 10. Des frameworks (Refit, gRPC, SDK Azure) peuvent l’envelopper une fois de plus : l’exception interne peut alors se trouver deux ou trois niveaux plus bas.
.NET HttpClient — HttpRequestException wrapping the AuthenticationException or IOException of the TLS handshake
Ce que cela signifie
L’enveloppe générique d’HttpClient pour tout échec TLS pendant la connexion. Le message lui-même ne contient aucun diagnostic : la véritable raison se trouve dans InnerException (une AuthenticationException qui nomme le problème de certificat, ou une IOException venant de la couche transport). Journaliser uniquement e.Message la masque ; journalisez toute la chaîne d’exceptions.
Pourquoi cela se produit
La validation du certificat a échoué
fréquenteChaînes non approuvées ou partielles, certificats expirés ou nom d’hôte non concordant : l’AuthenticationException interne nomme la valeur X509ChainStatus ou SslPolicyErrors.
Aucun protocole ni algorithme de chiffrement en commun
occasionnelleDes serveurs anciens en TLS 1.0/1.1 ou avec des suites obsolètes ; sous Linux, les exceptions internes indiquent la raison donnée par OpenSSL.
La connexion n’était pas en TLS ou a été coupée
occasionnelleDes ports qui servent du HTTP en clair, des proxys ou des pare-feu qui ferment la connexion, ou des serveurs qui réinitialisent le handshake.
Comment corriger l’erreur
- 1.
Journaliser toute la chaîne d’exceptions
Parcourez InnerException (ou journalisez l’objet exception, pas seulement Message) pour voir la véritable cause.
csharp catch (HttpRequestException e) { for (Exception? ex = e; ex != null; ex = ex.InnerException) logger.LogError("{Type}: {Message}", ex.GetType().FullName, ex.Message); } - 2.
Relier le message interne à sa cause
Chaque message interne renvoie à un correctif différent ; les entrées associées ci-dessous les traitent un par un.
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)
Erreurs associées
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)