2015-05-27 18 views
15

Ho un'applicazione che invia dati a un server utilizzando un POST HTTPS. Io uso un oggetto System.Net.WebClient per fare questo. Ecco una funzione che invia alcuni dati:Come specificare il protocollo SSL da utilizzare per la classe WebClient

private byte[] PostNameValuePairs(string uri, NameValueCollection pairs) 
    { 
     byte[] response; 
     String responsestring = ""; 
     using (WebClient client = new WebClient()) 
     { 
      client.Headers = GetAuthenticationHeader(); 

      string DataSent = GetNameValueCollectionValuesString(pairs); 

      try 
      { 
       response = client.UploadValues(uri, pairs); 
       responsestring = Encoding.ASCII.GetString(response); 
      } 
      catch (Exception e) 
      { 
       responsestring = "CONNECTION ERROR: " + e.Message; 
       return Encoding.ASCII.GetBytes(responsestring); 
      } 
      finally 
      { 
       _communicationLogger.LogCommunication(uri, client.Headers.ToString(), DataSent, responsestring); 
      } 
     } 

     return response; 
    } 

Stiamo passando in un inizio URI con https: //

Questo ha lavorato grande per un lungo periodo di tempo. Oggi abbiamo iniziato a ricevere il seguente errore di connessione: "La connessione sottostante è stata chiusa: si è verificato un errore imprevisto in una trasmissione". Abbiamo risolto alcuni problemi con il proprietario del server e alla fine l'abbiamo ristretto a quanto segue. Hanno apportato una modifica al loro server per bloccare TLS 1.0 e hanno affermato che ora dobbiamo inviare i nostri dati utilizzando TLS 1.1 o 1.2.

Cosa devo impostare nel mio oggetto WebClient (o altrove nella mia funzione) per utilizzare TLS 1.1 o 1.2 invece di TLS 1.0?

Stiamo usando .NET Framework 4.5 se questo fa la differenza.

+1

@CodeCaster, mentre la risposta potrebbe essere la stessa di [questa domanda] (http://stackoverflow.com/q/26389899/372643), non è chiaro che sia un duplicato. Non si fa menzione di 'WebClient' in quell'altra sessione di domande e risposte, quindi spiegare come queste classi sono correlate potrebbe essere utile, e il richiedente e altri lettori potrebbero anche essere interessati a potenziali soluzioni per l'impostazione di questa in base all'istanza, ad esempio . – Bruno

+0

A seconda della piattaforma che stai utilizzando, potresti essere interessato anche a [quest'altra domanda] (http://stackoverflow.com/q/30479973/372643). – Bruno

+0

@Bruno certo, ma anche a questo è stata data una risposta prima. Non sono riuscito a trovarne uno corretto, e [il dupe che ho selezionato] (http://stackoverflow.com/questions/26389899/) spiega tutto molto bene. Questa domanda riaperta è ora incline a _ "usare' System.Net.ServicePointManager.SecurityProtocol' "_ risposte senza alcuna spiegazione adeguata in esse, poiché ce ne sono già centinaia. E in base a [Impostare il SecurityProtocol (Ssl3 o TLS) su .net HttpWebRequest per richiesta] (http://stackoverflow.com/questions/3791629/), non è possibile impostarlo per richiesta. WebClient utilizza comunque HttpWebRequest internamente. – CodeCaster

risposta

29

Dalle altre domande suggerite, sono stato in grado di risolverlo aggiungendo la seguente riga al mio codice:

System.Net.ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12; 

Questo disabilitato TLS 1.0 dal client, e quindi il server ha accettato la connessione.

Spero che questo aiuti qualcun altro con lo stesso problema. Sebbene la risposta sia simile a quelle di altre domande, dalle domande poste non era ovvio che questo era il caso, quindi non ritengo che si tratti di un duplicato.

+0

Il codice che hai condiviso è per applicazioni .NET 4.0 o più recenti. Per le app .NET precedenti, fare riferimento a https://stackoverflow.com/a/44893192/160830 –