web-dev-qa-db-fra.com

C # HttpWebRequest La connexion sous-jacente a été fermée: une erreur inattendue s'est produite lors d'un envoi

J'ai cherché sur Google et essayé toutes les solutions que je pouvais trouver ou penser à moi-même. Le site que j'essaie de charger exécute TLS1.2, à l'instar de quelques autres sites que j'ai essayé de tester pour vérifier que ce n'était pas un problème de TLS1.2. Les autres sites chargés bien.

byte[] buffer = Encoding.ASCII.GetBytes(
    "mod=www&ssl=1&dest=account_settings.ws"
    + "&username=" + username.Replace(" ", "20%")
    + "&password=" + password.Replace(" ", "20%"));

ServicePointManager.MaxServicePointIdleTime = 1000;
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls;

HttpWebRequest WebReq =
    (HttpWebRequest)WebRequest.Create(
        "https://secure.runescape.com/m=weblogin/login.ws");

WebReq.Method = "POST";
WebReq.KeepAlive = false;

WebReq.Referer =
    "https://secure.runescape.com/m=weblogin/loginform.ws"
    + "?mod=www&ssl=1&expired=0&dest=account_settings.ws";

WebReq.ContentType = "application/x-www-form-urlencoded";
WebReq.ContentLength = buffer.Length;
Stream PostData = WebReq.GetRequestStream();
PostData.Write(buffer, 0, buffer.Length);
PostData.Close();
HttpWebResponse WebResp = (HttpWebResponse)WebReq.GetResponse();
Stream Answer = WebResp.GetResponseStream();
StreamReader _Answer = new StreamReader(Answer);
reply = _Answer.ReadToEnd();
curAccount++;
if (reply.Contains("Login Successful"))
{
     eturn true;
}
else
{
     eturn false;
}

Peu importe ce que j'essaie, je continue à recevoir l'exception

La connexion sous-jacente a été fermée: une erreur inattendue s'est produite lors d'un envoi.

Sous plus de détails j'ai trouvé

L'authentification a échoué car la partie distante a fermé le flux de transport.

28
Rob

Dans la version 4.0 du framework .Net, le ServicePointManager.SecurityProtocol uniquement proposé deux options pour définir:

  • Ssl3: protocole de sécurité Secure Socket Layer (SSL) 3.0.
  • Tls: protocole de sécurité TLS (Transport Layer Security) 1.0

Dans la prochaine version du framework, l'énumérateur SecurityProtocolType a été étendu avec les nouveaux protocoles Tls. Ainsi, si votre application peut utiliser la version 4.5, vous pouvez également utiliser:

  • Tls11: spécifie le protocole de sécurité TLS (Transport Layer Security) 1.1
  • Tls12: spécifie le protocole de sécurité TLS (Transport Layer Security) 1.2.

Donc, si vous êtes sur .Net 4.5, changez votre ligne

ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls;

à

ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;

afin que ServicePointManager crée des flux prenant en charge les connexions Tls12.

Notez que les valeurs d’énumération peuvent être utilisées comme indicateurs afin que vous puissiez combiner plusieurs protocoles avec un OU logique.

ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls | 
                                       SecurityProtocolType.Tls11 |
                                       SecurityProtocolType.Tls12;

Remarque
Essayez de maintenir le nombre de protocoles que vous prenez en charge aussi bas que possible et à jour avec les normes de sécurité actuelles. Ssll3 n'est plus considéré comme sécurisé et l'utilisation de Tls1.0 SecurityProtocolType.Tls est en déclin.

84
rene

J'ai vécu cette exception, qui était également liée à ServicePointManager.SecurityProtocol.

Pour moi, c'était parce que ServicePointManager.SecurityProtocol avait été réglé sur Tls | Tls11 (à cause de certains sites Web, l'application visite avec TLS 1.2 endommagé) et lors de la visite d'un site Web uniquement TLS 1.2 (testé avec rapport SSL de SSLLabs ), il a échoué.

Une option pour .NET 4.5 et versions ultérieures consiste à activer toutes les versions de TLS:

ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls
                                     | SecurityProtocolType.Tls11
                                     | SecurityProtocolType.Tls12;
15
Simon Shine

Pour .Net 4, utilisez:

ServicePointManager.SecurityProtocol = (SecurityProtocolType)768 | (SecurityProtocolType)3072;
7
Barun

Code pour WebTestPlugIn

public class Protocols : WebTestPlugin
{

    public override void PreRequest(object sender, PreRequestEventArgs e)
    {
        ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;

    }

}
1
venkata ravi