2015-05-27 15 views
15

Tôi có một ứng dụng gửi dữ liệu đến máy chủ bằng cách sử dụng POST HTTPS. Tôi sử dụng một đối tượng System.Net.WebClient để làm điều này. Đây là một chức năng sẽ gửi một số dữ liệu:Cách chỉ định giao thức SSL để sử dụng cho lớp 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; 
    } 

Chúng tôi đang đi qua trong một sự khởi đầu với https URI: //

này đã làm việc tuyệt vời cho một thời gian dài. Hôm nay, chúng tôi bắt đầu nhận được lỗi kết nối sau: "Kết nối cơ bản đã bị đóng: Đã xảy ra lỗi không mong muốn khi gửi". Chúng tôi đã thực hiện một số khắc phục sự cố với chủ sở hữu máy chủ và cuối cùng họ đã thu hẹp nó xuống dưới đây. Họ đã thực hiện thay đổi đối với máy chủ của họ để chặn TLS 1.0 và cho biết bây giờ chúng tôi cần gửi dữ liệu của mình bằng TLS 1.1 hoặc 1.2.

Tôi cần phải đặt gì trong đối tượng WebClient của mình (hoặc ở nơi khác trong chức năng của tôi) để làm cho nó sử dụng TLS 1.1 hoặc 1.2 thay vì TLS 1.0?

Chúng tôi đang sử dụng .NET Framework 4.5 nếu điều đó tạo nên sự khác biệt.

+1

@CodeCaster, trong khi câu trả lời có thể giống với [câu hỏi này] (http://stackoverflow.com/q/26389899/372643), không rõ nó trùng lặp hay không. Không có đề cập đến 'WebClient' ở tất cả các câu hỏi và giải thích khác, vì vậy giải thích cách các lớp này có liên quan có thể hữu ích, và người hỏi và những người đọc khác cũng có thể quan tâm đến các giải pháp tiềm năng để thiết lập điều này trên cơ sở từng trường hợp. . – Bruno

+0

Tùy thuộc vào nền tảng bạn đang sử dụng, bạn cũng có thể quan tâm đến [câu hỏi khác này] (http://stackoverflow.com/q/30479973/372643). – Bruno

+0

@Bruno chắc chắn, nhưng điều đó cũng đã được trả lời trước đó. Mặc dù vậy, tôi không thể tìm thấy một cái tên phù hợp và [dupe tôi chọn] (http://stackoverflow.com/questions/26389899/) giải thích tất cả điều này khá tốt. Câu hỏi mở lại này bây giờ dễ bị _ "sử dụng' System.Net.ServicePointManager.SecurityProtocol' "_ trả lời mà không có bất kỳ lời giải thích thích hợp trong họ, như đã có hàng trăm. Và theo [Đặt SecurityProtocol (Ssl3 hoặc TLS) trên .net HttpWebRequest theo yêu cầu] (http://stackoverflow.com/questions/3791629/), bạn không thể đặt nó theo yêu cầu. WebClient sử dụng HttpWebRequest nội bộ anyway. – CodeCaster

Trả lời

29

Từ những câu hỏi khác đề nghị, tôi đã có thể giải quyết nó bằng cách thêm dòng sau vào mã của tôi:

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

này tàn tật TLS 1.0 từ khách hàng, và sau đó máy chủ chấp nhận kết nối.

Hy vọng điều này sẽ giúp người khác có cùng vấn đề. Mặc dù câu trả lời là tương tự như những câu hỏi khác, nó không rõ ràng từ những câu hỏi được hỏi rằng đây là trường hợp, vì vậy tôi không cảm thấy rằng đây là một bản sao.

+0

Mã bạn đã chia sẻ là dành cho các ứng dụng .NET 4.0 trở lên. Đối với các ứng dụng .NET cũ hơn, hãy tham khảo https://stackoverflow.com/a/44893192/160830 –

Các vấn đề liên quan