2015-09-25 17 views
9

Spero che tu possa aiutarmi con questo. Sono stato su Google per tutta la mattinata e ho provato tutte le soluzioni che riuscivo a trovare o pensare a me stesso. Il sito che sto tentando di caricare esegue TLS1.2 come alcuni altri siti con cui ho provato a verificare che non si trattasse di un problema TLS1.2. Gli altri siti sono stati caricati correttamente.C# HttpWebRequest La connessione sottostante è stata chiusa: si è verificato un errore imprevisto in una trasmissione

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

Non importa quello che cerco Continuo a ricevere l'eccezione

La connessione sottostante è stata chiusa: un errore imprevisto si è verificato un invio.

Sotto ulteriori dettagli ho trovato

autenticazione non è riuscita perché il partito a distanza ha chiuso il flusso di trasporto.

risposta

36

Nella versione 4.0 del framework .Net l'ServicePointManager.SecurityProtocol unico offerto two options per impostare:

  • SSL3: protocollo Secure Socket Layer (SSL) 3.0 di sicurezza.
  • Tls: Transport Layer Security (TLS) protocollo di 1.0 di sicurezza

Nella prossima versione del quadro dell'enumeratore SecurityProtocolType ottenuto esteso con i protocolli TLS più recenti, quindi se la vostra applicazione può utilizzare esimo 4,5 versione è anche possibile uso:

  • TLS11: Specifica il Transport layer Security (TLS), il protocollo di sicurezza 1.1
  • Tls12: Specifica il Transport layer Security (TLS) 1.2 protocollo di sicurezza.

Quindi, se siete su .Net 4.5 cambiare la vostra linea

ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls; 

a

ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12; 

in modo che il ServicePointManager creerà flussi che supportano Tls12 connessioni.

si nota che i valori di enumerazione possono essere utilizzati come bandiere in modo da poter combinare più protocolli con un OR logico

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

Nota
Cercate di mantenere il numero di protocolli che si supporta il più basso possibile e aggiornato con gli standard di sicurezza odierni. Ssll3 non è più considerato sicuro e l'utilizzo di Tls1.0 SecurityProtocolType.Tls è in declino.

+1

Probabilmente voglio 'Tls | Tls11 | Tls12' nella maggior parte dei casi. –

8

Ho riscontrato questa eccezione ed era anche correlato a ServicePointManager.SecurityProtocol.

Per me, questo era perché ServicePointManager.SecurityProtocol era stato impostato su Tls | Tls11 (a causa di determinati siti Web in cui l'applicazione visita TLS 1.2 interrotto) e alla visita di un TLS 1.Sito Web 2-only (testato con SSLLabs' SSL Report), non è riuscito.

Un'opzione per .NET 4.5 e superiori è quello di consentire tutte le versioni TLS:

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

Per .Net 4 uso:

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

Generalmente, non usare [costanti magiche] (https://en.wikipedia.org/wiki/Magic_number_ (programming) #Unnamed_numerical_constants). –

0

Codice in WebTestPlugIn

public class Protocols : WebTestPlugin 
{ 

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

    } 

}