2015-10-07 21 views
36

Tôi đang cố gắng thiết lập kết nối SSL/TLS đến máy chủ thử nghiệm với chứng chỉ tự ký. Thông tin liên lạc qua kênh không an toàn đã hoạt động mà không có sự cố.Không thể tạo kênh bảo mật SSL/TLS, mặc dù thiết lập ServerCertificateValidationCallback

Đây là mẫu mã của tôi, mà tôi đã viết dựa trên các giải pháp này: Allowing Untrusted SSL Certificates with HttpClient C# Ignore certificate errors? .NET client connecting to ssl Web API

ServicePointManager.ServerCertificateValidationCallback += (sender, cert, chain, sslPolicyErrors) => true; 

var c = new HttpClient(); 
var r = c.GetAsync("https://10.3.0.1:8443/rest/v1").Result; 
if (r.IsSuccessStatusCode) 
{ 
    Log.AddMessage(r.Content.Get<string>()); 
} 
else 
{ 
    Log.AddMessage(string.Format("{0} ({1})", (int)r.StatusCode, r.ReasonPhrase)); 
} 

cũng đã cố gắng này:

var handler = new WebRequestHandler(); 
handler.ServerCertificateValidationCallback = delegate { return true; }; 
var c = new HttpClient(handler); 
... 

và điều này

ServicePointManager.ServerCertificateValidationCallback = delegate { return true; }; 

nhưng mỗi lần tôi có ngoại lệ:

InnerException: System.Net.Http.HttpRequestException 
    _HResult=-2146233088 
    _message=An error occurred while sending the request. 
    HResult=-2146233088 
    IsTransient=false 
    Message=An error occurred while sending the request. 
    InnerException: System.Net.WebException 
     _HResult=-2146233079 
     _message=The request was aborted: Could not create SSL/TLS secure channel. 
     HResult=-2146233079 
     IsTransient=false 
     Message=The request was aborted: Could not create SSL/TLS secure channel. 
     Source=System 
     StackTrace: 
      at System.Net.HttpWebRequest.EndGetResponse(IAsyncResult asyncResult) 
      at System.Net.Http.HttpClientHandler.GetResponseCallback(IAsyncResult ar) 
     InnerException: 

Tôi làm gì sai? Tại sao tôi không thể kết nối với máy chủ này (có chứng chỉ tự ký không hợp lệ)

Trả lời

82

Bạn đang làm đúng với ServerCertificateValidationCallback. Đây không phải là vấn đề bạn đang phải đối mặt. Vấn đề bạn đang gặp phải rất có thể là phiên bản của giao thức SSL/TLS.

Ví dụ: nếu máy chủ của bạn chỉ cung cấp SSLv3 và TLSv10 và khách hàng của bạn cần TLSv12 thì bạn sẽ nhận được thông báo lỗi này. Những gì bạn cần làm là đảm bảo rằng cả máy khách và máy chủ đều hỗ trợ phiên bản giao thức chung.

Khi tôi cần một khách hàng mà có thể kết nối với nhiều máy chủ càng tốt (chứ không phải là như an toàn càng tốt) Tôi sử dụng này (cùng với việc thiết lập cuộc gọi lại xác nhận):

ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3 | SecurityProtocolType.Tls | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12; 
+1

Tôi gặp sự cố tương tự. Do tấn công POODLE, chúng tôi buộc phải tắt TLS 1.0 trên máy chủ của mình. Khi tôi làm điều này, một ứng dụng của bên thứ ba ngừng hoạt động. Decompiling assambly cho thấy một mã tương tự như của bạn. Nó sử dụng webclientc.SendAsync thay vì GetAsync. Nếu tôi sao chép mã vào một consoleapp để thử nghiệm tôi có thể tạo lại lỗi, và bằng cách thêm ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls11 nó hoạt động. Tôi nghĩ rằng sẽ có một số loại bắt tay giữa máy chủ và máy khách để khám phá phiên bản TLS nào sẽ sử dụng? Tại sao nó không tự động chọn 1.1 khi 1.0 bị tắt? – Engern

+0

Lưu ý rằng phiên bản được khuyến nghị là TLS 1.2.Và có, nếu cả hai bên đã kích hoạt một số phiên bản giao thức, nó sẽ được sử dụng, nhưng nếu một bên chỉ hỗ trợ các giao thức và các phiên bản không được hỗ trợ bởi phía bên kia, kết nối không thể được thiết lập. Để đảm bảo rằng ứng dụng sẽ hoạt động, bạn nên đặt rõ ràng 'ServicePointManager.SecurityProtocol' trên cả hai mặt vì như MSDN cho chúng ta biết, giá trị mặc định có thể khác nhau cho mỗi máy tùy thuộc vào phần mềm và cấu hình của nó. – Wapac

+0

Câu trả lời thú vị! Tôi gặp sự cố khi tôi chuyển từ url trực tiếp của PayPal sang hộp cát có vẻ như sử dụng giao thức bảo mật khác. Sử dụng câu trả lời này khi sử dụng hộp cát PayPal. –

9

Just như một theo dõi cho bất cứ ai vẫn chạy vào này - tôi đã thêm các tùy chọn ServicePointManager.SecurityProfile như đã nêu trong các giải pháp:

ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3 | SecurityProtocolType.Tls | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12; 

Và tôi tiếp tục nhận được cùng “yêu cầu đã bị hủy bỏ: không thể tạo SSL/TLS kênh bảo mật "lỗi. Tôi đã cố gắng kết nối với một số máy chủ thoại cũ có giao diện HTTPS SOAP API (tức là thư thoại, hệ thống điện thoại IP, v.v ... được cài đặt cách đây vài năm). Chúng chỉ hỗ trợ các kết nối SSL3 khi chúng được cập nhật lần cuối vài năm trước.

Một người sẽ nghĩ rằng bao gồm SSl3 trong danh sách SecurityProtocols sẽ thực hiện thủ thuật tại đây, nhưng không. Cách duy nhất tôi có thể buộc các kết nối là để chỉ bao gồm các giao thức SSL3 và không có những người khác:

ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3; 

Sau đó kết nối đi qua - có vẻ như một lỗi với tôi nhưng điều này đã không bắt đầu ném lỗi cho đến khi thời gian gần đây trên các công cụ Tôi cung cấp cho các máy chủ đã được ra khỏi đó trong nhiều năm - Tôi tin rằng Microsoft đã bắt đầu tung ra những thay đổi hệ thống đã cập nhật hành vi này để buộc kết nối TLS trừ khi không có thay thế khác.

Dù sao - nếu bạn vẫn gặp sự cố này đối với một số trang web/máy chủ cũ, bạn nên thử.

+0

Chúng tôi có mô-đun CUCMPowerShell để sử dụng Cisco Unified Communications AXL api qua PowerShell và câu trả lời của bạn đã giúp chúng tôi khắc phục sự cố này bằng cách thêm '[System.Net.ServicePointManager] :: SecurityProtocol = [System.Net.SecurityProtocolType] :: Ssl3'. Cảm ơn bạn! Mã đầy đủ có thể được nhìn thấy trong [Invoke-CUCMSOAPAPIFunction] (https://github.com/Tervis-Tumbler/CUCMPowerShell/blob/master/CUCMPowerShell.psm1#L181) –

+0

cảm ơn - điều này làm việc cho tôi! –

+1

@Jeff - Xem bài viết được liên kết. Tôi nghĩ rằng nó có thể giải thích tại sao Ssl3 không hoạt động và gợi ý hai cách để kích hoạt lại Ssl3. https://docs.microsoft.com/en-us/dotnet/framework/migration-guide/mitigation-tls-protocols – Scott

5

Chúng tôi đã được giải quyết cùng một vấn đề chỉ là ngày hôm nay, và tất cả những gì bạn cần làm là tăng cường phiên bản thời gian chạy của .NET

4.5.2 đã không làm việc cho chúng tôi với vấn đề trên, trong khi 4.6.1 là OK

Nếu bạn cần phải giữ cho phiên bản .NET, sau đó thiết lập

ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3 | SecurityProtocolType.Tls | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12; 
+1

Biến thể nào bạn đã sử dụng và chính xác như thế nào? –

+1

Tôi có một ứng dụng .NET 4.5 bắt đầu từ hôm nay, sẽ không hoạt động với một trang SSL cụ thể. Nếu tôi thay đổi thành 4.6.1 nó hoạt động tốt, nhưng tôi thực sự không thể thay đổi. Tôi không chắc phải làm gì: | – Tsury

0

Nếu bạn đang sử dụng một tên miền mới, và bạn đã thực hiện tất cả các bên trên và bạn vẫn gặp lỗi tương tự, hãy kiểm tra xem bạn có xóa bộ đệm DNS trên máy tính của mình hay không. Clear your DNS để biết thêm chi tiết.

Windows® 8

Để xóa bộ nhớ cache DNS của bạn nếu bạn sử dụng Windows 8, thực hiện các bước sau:

Trên bàn phím của bạn, nhấn Win + X để mở WinX Menu.

Bấm chuột phải vào Dấu nhắc Lệnh và chọn Chạy với tư cách Quản trị viên.

Chạy lệnh sau:

ipconfig/flushdns

Nếu lệnh thành công, hệ thống sẽ trả về thông báo sau:

cấu hình Windows IP đỏ mặt thành công resolver cache DNS.

Windows® 7

Để xóa bộ nhớ cache DNS của bạn nếu bạn sử dụng Windows 7, thực hiện các bước sau:

Bấm Start.

Nhập cmd trong hộp văn bản tìm kiếm menu Bắt đầu.

Bấm chuột phải vào Dấu nhắc Lệnh và chọn Chạy với tư cách Quản trị viên.

Chạy lệnh sau:

ipconfig/flushdns

Nếu lệnh thành công, hệ thống sẽ trả về thông báo sau: cấu hình Windows IP đỏ mặt thành công resolver cache DNS.

+0

'ipconfig/flushdns' trong C#? – Kiquenet

+0

Đây là ngôn ngữ dòng lệnh không phải là C#. – Aviva

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