2015-09-25 27 views
9

Mam nadzieję, że możesz mi w tym pomóc. Przez cały ranek szukałem wszystkich rozwiązań, które mogłem znaleźć lub pomyśleć o sobie. Witryna, którą próbuję załadować, uruchamia TLS 1.2, podobnie jak kilka innych stron, które próbowałem przetestować, aby upewnić się, że nie jest to problem z TLS1.2. Inne witryny ładowane są w porządku.C# HttpWebRequest Podstawowe połączenie zostało zamknięte: Wystąpił nieoczekiwany błąd podczas wysyłania

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

Bez względu na to, co staram Wciąż otrzymuję wyjątek

Połączenie podstawowe zostało zamknięte: Wystąpił nieoczekiwany błąd na wysyłanie.

Pod Więcej szczegółów znalazłem

Uwierzytelnienie nie powiodło się, ponieważ zdalny został zamknięty strumień transportowy.

Odpowiedz

36

w 4,0 wersji .NET Framework ServicePointManager.SecurityProtocol tylko oferowane two options ustawić:

  • SSL3: Secure Socket Layer (SSL) 3,0 zabezpieczeń.
  • Tls: Transport Layer Security (TLS) Protokół 1,0 bezpieczeństwo

W następnym wydaniu ramach SecurityProtocolType wyliczający został przedłużony z nowszych protokołów TLS, więc jeśli aplikacja może używać th 4.5 wersji można również zastosowanie:

  • Tls11 Określa transport Layer security (TLS) protokół 1,1 bezpieczeństwo
  • Tls12 Określa transport Layer security (TLS) 1.2 protokołu zabezpieczeń.

Więc jeśli jesteś na .NET 4.5 zmienić linię

ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls; 

do

ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12; 

tak że ServicePointManager stworzy strumieni, które wspierają Tls12 połączeń.

Czy zauważyć, że wartości wyliczenie może być używany jako flagi, dzięki czemu można połączyć wiele protokołów z logicznym OR

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

Uwaga
starać się utrzymać liczbę protokołów wspierasz jak najniżej i na bieżąco z dzisiejszymi standardami bezpieczeństwa. Ssll3 nie jest już uważany za bezpieczny, a użycie Tls1.0 SecurityProtocolType.Tls jest w spadku.

+1

Prawdopodobnie chcę "Tls | Tls11 | Tls12' w większości przypadków. –

8

Doświadczyłem tego wyjątku, a także był powiązany z ServicePointManager.SecurityProtocol.

Dla mnie było to spowodowane tym, że ServicePointManager.SecurityProtocol zostało ustawione na Tls | Tls11 (ze względu na niektóre witryny odwiedzane przez aplikację z uszkodzonym TLS 1.2) i podczas odwiedzania TLS 1.Witryna 2-only (testowana pod numerem SSLLabs' SSL Report) nie powiodła się.

Opcja dla .NET 4.5 i wyżej jest umożliwienie wszystkie wersje TLS:

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

NET 4 użytku:

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

Generalnie nie używaj [magicznych stałych] (https://en.wikipedia.org/wiki/Magic_number_ (programowanie) #Unnamed_numerical_constants). –

0

kodeksu WebTestPlugIn

public class Protocols : WebTestPlugin 
{ 

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

    } 

} 
Powiązane problemy