System.Net.WebRequest hỗ trợ những phiên bản SSL / TLS nào?


81

Bây giờ SSL 3 đã được phát hiện là dễ bị tấn công POODLE :

System.Net.WebRequest sử dụng phiên bản SSL / TLS nào khi kết nối với bất kỳ https Uri nào?

Tôi sử dụng WebRequest để kết nối với một số API của bên thứ ba. Một trong số này hiện đã cho biết họ sẽ chặn bất kỳ yêu cầu nào sử dụng SSL 3. Nhưng WebRequest là một phần của .Net core framework (sử dụng 4.5) nên không rõ nó sử dụng phiên bản nào.


WebRequest sẽ dự phòng cho SSL 3 nếu máy chủ (hoặc người đàn ông ở giữa) yêu cầu nó?
Philip Pittle,

Nếu tôi không nhầm, tôi nghĩ WebRequest xem xét chứng chỉ bảo mật trên máy chủ mà bạn đang cố gắng tải lên và sử dụng bất kỳ lược đồ mã hóa nào trên máy chủ web. Tôi không nghĩ bạn cần thay đổi bất cứ điều gì ở phía khách hàng.
Icemanind

1
Tôi hy vọng rằng chủ sở hữu của API vừa nói rằng họ sẽ không hỗ trợ SSL3 đã nghĩ đến việc đảm bảo máy chủ của họ không yêu cầu máy khách sử dụng SSL3 :)
JK.

@iceman có cách nào để biết từ chứng chỉ nếu nó hỗ trợ SSL3 hay không? Tôi không thấy bất kỳ thuộc tính nào liên quan đến các phiên bản.
JK.

@JK. - Tôi không chắc về các trình duyệt khác, nhưng tôi đang sử dụng Chrome. Trong Chrome, nếu bạn truy cập một trang web HTTPS (chẳng hạn như Wellsfargo.com), bạn sẽ thấy một ổ khóa màu xanh lục gần URL. Nhấp vào ổ khóa đó, sau đó nhấp vào tab kết nối và nó sẽ hiển thị cho bạn. Trong trường hợp của wellfargo.com, Chrome cho biết "Kết nối sử dụng TLS 1.0". IE và các trình duyệt khác sẽ hiển thị điều tương tự.
Icemanind

Câu trả lời:


51

Khi sử dụng System.Net.WebRequest, ứng dụng của bạn sẽ thương lượng với máy chủ để xác định phiên bản TLS cao nhất mà cả ứng dụng của bạn và máy chủ đều hỗ trợ và sử dụng phiên bản này. Bạn có thể xem thêm chi tiết về cách thức hoạt động tại đây:

http://en.wikipedia.org/wiki/Transport_Layer_Security#TLS_handshake

Nếu máy chủ không hỗ trợ TLS, nó sẽ dự phòng cho SSL, do đó, nó có khả năng dự phòng cho SSL3. Bạn có thể xem tất cả các phiên bản .NET 4.5 hỗ trợ tại đây:

http://msdn.microsoft.com/en-us/library/system.security.authentication.sslprotocols(v=vs.110).aspx

Để ngăn ứng dụng của bạn dễ bị POODLE, bạn có thể tắt SSL3 trên máy mà ứng dụng của bạn đang chạy bằng cách làm theo giải thích sau:

/server/637207/on-iis-how-do-i-patch-the-ssl-3-0-poodle-vulnerability-cve-2014-3566


20
Tôi khuyên bạn nên thực hiện các yêu cầu gửi đi như WebRequest và HttpWebRequest an toàn, bạn nên làm theo các bước để tắt dự phòng SSL như được nêu chi tiết trong câu hỏi của tôi tại stackoverflow.com/questions/26389899/… . Về cơ bản, bạn chạy dòng mã này trước: System.Net.ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12; Theo tôi hiểu, bản sửa lỗi đăng ký được nêu chi tiết trong câu trả lời này chỉ áp dụng cho các kết nối đến.
Jordan Rieger

1
Lưu ý rằng bạn chỉ có tùy chọn SecurityProtocolType.Tls(và do đó TLS 1.0) trong khuôn khổ .net 3.5 hoặc thấp hơn
James Westgate

Tôi có thể nhận được hỗ trợ TLS cao hơn bằng cách bỏ qua System.Net.WebRequest và sử dụng một thư viện khác như RestSharp hay đó là khung .net thực tế cần được nâng cấp không?
The Muffin Man

Tôi tin rằng đây là khung .net thực sự cần được nâng cấp. www.passionatecoder.ca
Ehsan

1
@JamesWestgate Tôi có ấn tượng rằng đó TLSlà thứ gì đó thực sự sẽ được triển khai ở cấp hệ điều hành / máy? Đó không phải là nơi lưu lượng HTTP thực tế đang diễn ra? Vì vậy, tôi không nghĩ rằng việc cố gắng yêu cầu mã của bạn sử dụng một TLS cụ thể thực sự được xác định bởi hệ điều hành là rất hợp lý.
Don Cheadle

52

Đây là một câu hỏi quan trọng. Giao thức SSL 3 (1996) bị phá vỡ không thể sửa chữa được bởi cuộc tấn công Poodle được công bố năm 2014. IETF đã công bố "SSLv3 KHÔNG ĐƯỢC sử dụng" . Các trình duyệt web đang từ bỏ nó. Mozilla FirefoxGoogle Chrome đã làm như vậy.

Hai công cụ tuyệt vời để kiểm tra hỗ trợ giao thức trong trình duyệt là kiểm tra ứng dụng khách của SSL Labhttps://www.howsmyssl.com/ . Sau này không yêu cầu Javascript, vì vậy bạn có thể thử nó từ HttpClient của .NET :

// set proxy if you need to
// WebRequest.DefaultWebProxy = new WebProxy("http://localhost:3128");

File.WriteAllText("howsmyssl-httpclient.html", new HttpClient().GetStringAsync("https://www.howsmyssl.com").Result);

// alternative using WebClient for older framework versions
// new WebClient().DownloadFile("https://www.howsmyssl.com/", "howsmyssl-webclient.html");

Kết quả là chết tiệt:

Máy khách của bạn đang sử dụng TLS 1.0, TLS rất cũ, có thể dễ bị tấn công BEAST và không có sẵn bộ mật mã tốt nhất. Các bổ sung như AES-GCM và SHA256 để thay thế MD5-SHA-1 không khả dụng cho máy khách TLS 1.0 cũng như nhiều bộ mật mã hiện đại hơn.

Đó là liên quan. Nó có thể so sánh với Internet Explorer 7 của năm 2006.

Để liệt kê chính xác các giao thức mà máy khách HTTP hỗ trợ, bạn có thể thử các máy chủ thử nghiệm theo phiên bản cụ thể bên dưới:

var test_servers = new Dictionary<string, string>();
test_servers["SSL 2"] = "https://www.ssllabs.com:10200";
test_servers["SSL 3"] = "https://www.ssllabs.com:10300";
test_servers["TLS 1.0"] = "https://www.ssllabs.com:10301";
test_servers["TLS 1.1"] = "https://www.ssllabs.com:10302";
test_servers["TLS 1.2"] = "https://www.ssllabs.com:10303";

var supported = new Func<string, bool>(url =>
{
    try { return new HttpClient().GetAsync(url).Result.IsSuccessStatusCode; }
    catch { return false; }
});

var supported_protocols = test_servers.Where(server => supported(server.Value));
Console.WriteLine(string.Join(", ", supported_protocols.Select(x => x.Key)));

Tôi đang sử dụng .NET Framework 4.6.2. Tôi thấy HttpClient chỉ hỗ trợ SSL 3 và TLS 1.0. Đó là liên quan. Điều này có thể so sánh với Internet Explorer 7 của năm 2006.


Cập nhật: Hóa ra HttpClient không hỗ trợ TLS 1.1 và 1.2, nhưng bạn phải bật chúng theo cách thủ công tại System.Net.ServicePointManager.SecurityProtocol. Xem https://stackoverflow.com/a/26392698/284795

Tôi không biết tại sao nó sử dụng các giao thức không hợp lệ. Đó có vẻ là một lựa chọn thiết lập kém, tương đương với một lỗi bảo mật lớn (tôi cá rằng nhiều ứng dụng không thay đổi mặc định). Làm thế nào chúng tôi có thể báo cáo nó?


Tôi phải sử dụng giao thức nào ?
Kiquenet

8

Tôi cũng đã đưa ra câu trả lời ở đó, nhưng bài báo cập nhật của @Colonel Panic đề cập đến đề xuất buộc TLS 1.2. Trong tương lai, khi TLS 1.2 bị xâm phạm hoặc chỉ bị thay thế, việc mã của bạn bị dính vào TLS 1.2 sẽ bị coi là thiếu sót. Đàm phán với TLS1.2 được bật trong .Net 4.6 theo mặc định. Nếu bạn có tùy chọn nâng cấp nguồn của mình lên .Net 4.6, tôi thực sự khuyên bạn nên thay đổi đó thay vì buộc TLS 1.2.

Nếu bạn buộc TLS 1.2, hãy cân nhắc kỹ việc để lại một số loại breadcrumb sẽ loại bỏ lực lượng đó nếu bạn nâng cấp lên khung 4.6 hoặc cao hơn.


2
"Thương lượng với TLS1.2 được bật trong .Net 4.6 theo mặc định" bạn có tài liệu cho việc này không?
felickz

2
Vào thời điểm đó, chúng tôi đã tìm thấy tài liệu không thuyết phục gợi ý về tính năng này (xem msdn.microsoft.com/en-us/library/… ngay phía trên các ví dụ). Tuy nhiên, chúng tôi đã xác minh điều này bằng cách tạo một chương trình thử nghiệm với máy chủ bị khóa xuống TLS 1.2 và sử dụng webrequest để thử và tải xuống một trang. Sau đó, chúng tôi đã thay đổi các phiên bản khung trên chương trình. Tất cả các phiên bản cấp thấp hơn không thể kết nối, nhưng .Net 4.6 được kết nối mà không có sự cố.
Giáo sư Von Lemongargle,

Cảm ơn bạn đã biết thông tin chi tiết, tôi thấy rất nhiều nhà cung cấp API chỉ ra rằng 4.5 không kết nối với TLS 1.2 nhưng tôi đã cố gắng cung cấp bất kỳ tài liệu chính thức nào và phải dựa vào cộng đồng :)
felickz

Điều này là chính xác và con đường để đi. Chúng tôi có một số máy chủ cũ hơn nói chuyện với các điểm cuối web hiện đang yêu cầu TLS. Tham chiếu dịch vụ web bắt đầu không thành công với lỗi SSL / TLS. Bạn có thể hack registry nhưng nâng cấp máy chủ lên phiên bản .NET mới nhất dễ dàng và an toàn hơn.
Neil Laslett,
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.