2015-05-27 6 views
15

Ich habe eine Anwendung, die Daten mithilfe eines HTTPS-POST an einen Server sendet. Ich verwende dazu ein System.Net.WebClient-Objekt. Hier ist eine Funktion, die einige Daten sendet:So geben Sie das SSL-Protokoll zur Verwendung für die WebClient-Klasse an

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

Wir passieren, werden in einen URI Anfang mit https: //

Dies wurde für eine lange Zeit arbeiten groß. Heute haben wir den folgenden Verbindungsfehler erhalten: "Die zugrunde liegende Verbindung wurde geschlossen: Bei einem Sendevorgang ist ein unerwarteter Fehler aufgetreten". Wir haben mit dem Besitzer des Servers eine Fehlersuche durchgeführt und sie schließlich auf Folgendes eingeschränkt. Sie änderten ihren Server, um TLS 1.0 zu blockieren, und sagten, dass wir nun unsere Daten entweder mit TLS 1.1 oder 1.2 senden müssen.

Was muss ich in meinem WebClient-Objekt (oder an einer anderen Stelle in meiner Funktion) festlegen, damit TLS 1.1 oder 1.2 anstelle von TLS 1.0 verwendet wird?

Wir verwenden .NET Framework 4.5, wenn dies einen Unterschied macht.

+1

@CodeCaster, während die Antwort möglicherweise die gleiche wie [diese Frage] (http://stackoverflow.com/q/26389899/372643) ist, ist es nicht klar, es ist ein Duplikat. In diesen anderen Q & A wird überhaupt kein "WebClient" erwähnt. Daher könnte es nützlich sein zu erklären, wie diese Klassen zusammenhängen, und der Fragesteller und andere Leser könnten auch an möglichen Lösungen interessiert sein, um dies z. B. pro Instanz festzulegen . – Bruno

+0

Abhängig von der Plattform, die Sie verwenden, könnten Sie auch an [dieser anderen Frage interessiert sein] (http://stackoverflow.com/q/30479973/372643). – Bruno

+0

@Bruno sicher, aber auch das wurde schon beantwortet. Ich konnte jedoch keinen richtigen finden, und [der Betrogene, den ich ausgewählt habe] (http://stackoverflow.com/questions/26389899/) erklärt alles ziemlich gut. Diese erneut geöffnete Frage ist jetzt anfällig für die Verwendung von System.Net.ServicePointManager.SecurityProtocol' _ _ Antworten ohne eine ordnungsgemäße Erklärung in ihnen, da es bereits Hunderte von. Und gemäß [Setzen Sie das SecurityProtocol (Ssl3 oder TLS) auf die .net HttpWebRequest pro Anfrage] (http://stackoverflow.com/questions/3791629/), können Sie es nicht pro Anfrage einstellen. WebClient verwendet HttpWebRequest trotzdem intern. – CodeCaster

Antwort

29

Von den vorgeschlagenen Fragen konnte ich es lösen, indem die folgende Zeile in meinem Code hinzufügen:

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

Diese deaktiviert TLS 1.0 vom Client, und dann akzeptiert der Server die Verbindung.

Hoffe das hilft jemand anderem mit dem gleichen Problem. Obwohl die Antwort ähnlich zu diesen anderen Fragen ist, war es aus den gestellten Fragen nicht offensichtlich, dass dies der Fall war, so dass ich nicht denke, dass dies ein Duplikat ist.

+0

Der Code, den Sie freigegeben haben, ist für .NET 4.0-Anwendungen oder neuer. Informationen zu älteren .NET-Anwendungen finden Sie unter https://Stackoverflow.com/a/44893192/160830 –

Verwandte Themen