2015-09-25 2 views
9

Я надеюсь, что вы можете мне помочь. Я все утро ходил в Гуглинг и пробовал все решения, которые я мог найти или подумать о себе. Сайт, который я пытаюсь загрузить, запускает TLS1.2, а также некоторые другие сайты, с которыми я пытался протестировать, чтобы убедиться, что это не проблема TLS1.2. Остальные сайты загружены штрафом.C# HttpWebRequest Подключенное соединение было закрыто: произошла непредвиденная ошибка при отправке

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; 
} 

Независимо от того, что я стараюсь, я получаю исключение

Базовое соединение закрыто: Непредвиденная ошибка посыла.

Под более подробно я нашел

Аутентификация не удалась, поскольку удаленная сторона закрыла транспортный поток.

ответ

36

В версии платформы .NET 4.0, ServicePointManager.SecurityProtocol только предложил two options установить:

  • SSL3: Secure Socket Layer (протокол SSL) 3,0 безопасности.
  • Tls: Transport Layer Security (TLS) Протокол 1,0 безопасности

В следующем выпуске рамочной программы SecurityProtocolType переписчик был продлен с новыми протоколами Tls, поэтому, если ваше приложение может использовать й 4.5 версии вы также можете использование:

  • Tls11: Определяет Transport Layer Security (TLS) протокол безопасности 1.1
  • Tls12: Определяет Transport Layer Security (TLS) 1.2 протокола безопасности.

Так что, если вы на .Net 4.5 изменить линию

ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls; 

в

ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12; 

так, что ServicePointManager будет создавать потоки, которые поддерживают Tls12 соединения.

ли заметить, что значения перечисления могут быть использованы в качестве флагов, так что вы можете объединить несколько протоколов с логическим ИЛИ

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

Примечание
Старайтесь, чтобы количество протоколов, которые поддерживают как можно более низкой и современные стандарты безопасности. Ssll3 больше не считается безопасным, и использование Tls1.0 SecurityProtocolType.Tls находится в упадке.

+1

Вы, наверное, хочу 'Tls | Tls11 | Tls12' в большинстве случаев. –

8

У меня возникло это исключение, и оно также было связано с ServicePointManager.SecurityProtocol.

Для меня это было связано с тем, что ServicePointManager.SecurityProtocol был установлен в Tls | Tls11 (из-за определенных веб-сайтов, посетивших приложение со сломанным TLS 1.2) и при посещении TLS 1.2-only (проверено с SSLLabs' SSL Report), это не удалось.

Вариант для .NET 4.5 и выше, чтобы включить все версии TLS:

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

Для .Net 4 использования:

ServicePointManager.SecurityProtocol = (SecurityProtocolType)768 | (SecurityProtocolType)3072; 
+4

Как правило, не используйте [магические константы] (https://en.wikipedia.org/wiki/Magic_number_ (программирование) #Unnamed_numerical_constants). –

0

Код для WebTestPlugIn

public class Protocols : WebTestPlugin 
{ 

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

    } 

}