Aller au contenu
ecdsa.com
.NET SslStream / HttpClient.NET

Message d’erreur

Received an unexpected EOF or 0 bytes from the transport stream.

Également affiché sous la forme

  • System.IO.IOException: Received an unexpected EOF or 0 bytes from the transport stream.

HttpClient l’enveloppe dans « The SSL connection could not be established, see inner exception. » Les journaux des applications .NET Framework présentent couramment la même situation sous la forme « Authentication failed because the remote party has closed the transport stream. »

.NET SslStream / HttpClient — IOException: the peer closed the connection during the TLS handshake

Ce que cela signifie

L’autre côté (ou un équipement intermédiaire) a fermé la connexion TCP alors que SslStream était en plein handshake TLS, sans envoyer d’alerte TLS. .NET n’a rien d’autre à signaler que la fermeture du flux. Le plus souvent, le serveur a refusé le handshake sans rien dire, ou un proxy ou un pare-feu l’a interrompu.

Pourquoi cela se produit

Comment corriger l’erreur

  1. 1.

    Tester le handshake depuis la même machine

    Si openssl s_client est lui aussi coupé, le problème vient du réseau ou du serveur ; s’il réussit, comparez les versions de protocole et le SNI avec le client .NET.

    bash
    # Does a plain TLS handshake from the same host work?
    openssl s_client -connect api.example.com:443 -servername api.example.com -brief </dev/null
    openssl s_client -connect api.example.com:443 -servername api.example.com -tls1_2 -brief </dev/null
  2. 2.

    Utiliser le proxy requis

    Configurez le proxy sur le gestionnaire HTTP (ou via HTTPS_PROXY sous Linux) lorsque le réseau n’autorise pas les connexions directes.

    csharp
    // Use the corporate proxy explicitly (HttpClient also honours HTTPS_PROXY / system settings)
    var handler = new SocketsHttpHandler { Proxy = new WebProxy("http://proxy.example.net:3128"), UseProxy = true };
    using var client = new HttpClient(handler);
  3. 3.

    .NET Framework : activer TLS 1.2

    Reciblez vers la version 4.7 ou ultérieure pour que le système d’exploitation choisisse le protocole, ou ajoutez TLS 1.2 à ServicePointManager.SecurityProtocol en attendant de pouvoir le faire.

    csharp
    // .NET Framework 4.x apps compiled for old targets may still offer only TLS 1.0:
    // target 4.7+ (OS defaults) or, as a stop-gap, enable TLS 1.2 explicitly
    System.Net.ServicePointManager.SecurityProtocol |= System.Net.SecurityProtocolType.Tls12;

Erreurs associées

Parcourir toute la base de données des erreurs de signature