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ệ)
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
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
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. –