2015-05-27 12 views
15

Mam aplikację, która wysyła dane do serwera za pomocą POST HTTPS. Do tego celu używam obiektu System.Net.WebClient. Oto funkcja, która wysyła jakieś dane:Jak określić protokół SSL do użycia dla klasy 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; 
    } 

Jesteśmy przechodzącą w początku URI https: //

Zostało to działa świetnie przez długi czas. Dzisiaj zaczęliśmy uzyskiwać następujący błąd połączenia: "Połączenie podstawowe zostało zamknięte: Wystąpił nieoczekiwany błąd podczas wysyłania". Zrobiliśmy trochę rozwiązywania problemów z właścicielem serwera i ostatecznie zawęziły to do następujących. Dokonali zmiany na swoim serwerze, aby zablokować TLS 1.0, i powiedzieli, że teraz musimy wysłać nasze dane przy użyciu TLS 1.1 lub 1.2.

Co muszę ustawić w moim obiekcie WebClient (lub w innym miejscu w mojej funkcji), aby użyć TLS 1.1 lub 1.2 zamiast TLS 1.0?

Korzystamy z .NET Framework 4.5, jeśli to robi różnicę.

+1

@CodeCaster, podczas gdy odpowiedź może być taka sama jak [to pytanie] (http://stackoverflow.com/q/26389899/372643), nie jest jasne, czy jest duplikatem. W żadnym innym pytaniu i odpowiedzi nie ma żadnej wzmianki o "WebClient", więc wyjaśnienie, w jaki sposób te klasy są powiązane, może być przydatne, a osoba pytająca i inni czytelnicy mogą być również zainteresowani potencjalnymi rozwiązaniami do ustawienia tego na podstawie poszczególnych instancji, na przykład . – Bruno

+0

W zależności od platformy, z której korzystasz, może Cię również zainteresować [to inne pytanie] (http://stackoverflow.com/q/30479973/372643). – Bruno

+0

@Bruno na pewno, ale na to też odpowiedziano wcześniej. Nie mogłem jednak znaleźć właściwego, a [wybrana przeze mnie] (http://stackoverflow.com/questions/26389899/) wyjaśnia to całkiem dobrze. To ponownie otwarte pytanie jest teraz podatne na używanie "System.Net.ServicePointManager.SecurityProtocol" "_ odpowiedzi bez żadnego odpowiedniego wyjaśnienia w nich, ponieważ istnieją już setki. I zgodnie z [Ustaw SecurityProtocol (Ssl3 lub TLS) na .net HttpWebRequest na żądanie] (http://stackoverflow.com/questions/3791629/), nie można ustawić go na żądanie. WebClient mimo wszystko wewnętrznie korzysta z HttpWebRequest. – CodeCaster

Odpowiedz

29

Od sugerowanych innych pytań, udało mi się go rozwiązać dodając następującą linię do mojego kodu:

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

Ten wyłączone TLS 1.0 od klienta, a następnie serwer zaakceptował połączenia.

Mam nadzieję, że pomoże to komuś innemu z tym samym problemem. Chociaż odpowiedź jest podobna do tych innych pytań, z zadanych pytań nie wynikało jednoznacznie, więc nie uważam, że jest to duplikat.

+0

Kod, który udostępniono dla aplikacji .NET 4.0 lub nowszych. W przypadku starszych aplikacji .NET zobacz https://stackoverflow.com/a/44893192/160830 –

Powiązane problemy