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.
Dans la version 4.0 du framework .Net, le ServicePointManager.SecurityProtocol
uniquement proposé deux options pour définir:
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:
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.
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;
Pour .Net 4, utilisez:
ServicePointManager.SecurityProtocol = (SecurityProtocolType)768 | (SecurityProtocolType)3072;
Code pour WebTestPlugIn
public class Protocols : WebTestPlugin
{
public override void PreRequest(object sender, PreRequestEventArgs e)
{
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;
}
}