2010-06-12 36 views
9

Ứng dụng của tôi phải nói chuyện với các máy chủ khác nhau qua https và cài đặt mặc định của ServicePointManager.SecurityProtocol = TLS đã phục vụ tôi tốt cho đến ngày nay. Bây giờ tôi có một số máy chủ (như System.Net hiển thị nhật ký theo dõi) không trả lời thông báo bắt tay TLS ban đầu nhưng vẫn giữ kết nối cơ bản mở cho đến khi hết thời gian chờ, ném một ngoại lệ hết thời gian chờ. Tôi đã thử đặt thời gian chờ của HttpWebRequest tối đa 5 phút, với cùng một kết quả. Có lẽ những máy chủ này đang chờ một cái bắt tay SSL3 vì cả IE và Firefox đều có thể kết nối với những máy chủ này sau một thời gian trễ 30-40 giây. Dường như có một số cơ chế dự phòng trong .NET làm giảm TLS thành SSL3, nhưng nó không khởi động vì một lý do nào đó.Làm thế nào để sử dụng SSL3 thay vì TLS trong một HttpWebRequest cụ thể?

FWIW, đây là thông điệp bắt tay yêu cầu của tôi đang gửi (thường xuyên TLS 1.0 KHÁCH HÀNG Hello message):

00000000 : 16 03 01 00 57 01 00 00-53 03 01 4C 12 39 B4 F9 : ....W...S..L.9.. 
00000010 : A3 2C 3D EE E1 2A 7A 3E-D2 D6 0D 2E A9 A8 6C 03 : .,=..*z>......l. 
00000020 : E7 8F A3 43 0A 73 9C CE-D7 EE CF 00 00 18 00 2F : ...C.s........./ 
00000030 : 00 35 00 05 00 0A C0 09-C0 0A C0 13 C0 14 00 32 : .5.............2 
00000040 : 00 38 00 13 00 04 01 00-00 12 00 0A 00 08 00 06 : .8.............. 
00000050 : 00 17 00 18 00 19 00 0B-00 02 01 00    : ............  

Có cách nào để sử dụng SSL3 thay vì TLS trong một đặc biệt HttpWebRequest, hoặc buộc một fallback ? Dường như cài đặt của ServicePointManager là toàn cầu và tôi thực sự ghét phải làm giảm cài đặt giao thức bảo mật thành SSL3 cho toàn bộ ứng dụng.

+0

Bạn có thực sự kiểm tra giả thuyết của mình bằng cách thay đổi cài đặt kết nối thành SSL3 không? – Amnon

+0

Vâng, giả thuyết đã chứng minh là chính xác. Các host là Netware, và có vẻ như chính sách của Netware liên quan đến các yêu cầu không được nhận ra/không hợp lệ, không trả lời hoặc đưa ra bất kỳ thông báo lỗi nào, có lẽ là giảm bề mặt tấn công. –

Trả lời

12

Thực tế, các cài đặt ServicePointManager là mỗi tên miền ứng dụng. Điều này cho phép tôi khắc phục sự cố bằng cách tạo một miền ứng dụng riêng được thiết lập để chỉ sử dụng SSL3, làm cho đối tượng thu thập dữ liệu của tôi MarshalByRefObject (cả hai số WebClientWebRequest là so sánh theo, nhưng tốt hơn để giảm số lượng cuộc gọi cross-appdomain) và tạo ra nó ở đó. Làm việc hoàn hảo kết hợp với một chương trình phát hiện dựa trên thời gian chờ.

+0

Bạn viết đoạn mã này ở đâu? 'System.Net.ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls' –

+0

@AnishV hoặc đối tượng mà nó có thể quan tâm: đối tượng' ServicePointManager' xuất phát từ không gian tên 'System.Net' và duy trì trạng thái giống tĩnh. Vì vậy, chỉ "sử dụng" không gian tên đó & thực thi 'ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12 | SecurityProtocolType.Tls11; '* once * trước khi thực thi (các) hoạt động liên quan thực hiện thủ thuật. – kmonsoor

3

.NET chứa các điều khoản để tự động thương lượng xuống các phiên bản thấp hơn của giao thức. Giá trị của ServicePointManager.SecurityProtocol xác định hành vi. Nó có thể có 3 giá trị khác nhau: SecurityProtocol.Ssl3, SecurityProtocol.Tls, or SecurityProtocol.Ssl3 | SecurityProtocol.Tls. Mặc dù toàn cầu, nó có thể được thay đổi khi cần thiết.

Tôi không thể xác định giải pháp mà không có quyền truy cập vào máy chủ có cùng hành vi lỗi. Về đề xuất duy nhất tôi có thể thực hiện là cố gắng kết nối với cài đặt Ssl3 | Tls và nếu điều đó không hoạt động thì hãy thử lại với cài đặt Ssl3. Hãy thử giảm thời gian chờ và bắt ngoại lệ thời gian chờ và sau đó thử lại.

EDIT

Phần lớn những gì tôi đã viết trong phiên bản trước của câu trả lời này là sai.

+3

Trong một ứng dụng nhiều luồng, việc thay đổi các thiết lập chung không phải là một ý tưởng hay và 'ServicePointManager.SecurityProtocol' cần giữ nguyên trong suốt thời gian yêu cầu, vì vậy tôi đã làm theo cách khác. –

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