2016-02-24 18 views
6

Tôi đang cố gắng kết nối với máy chủ SignalR bằng chứng chỉ không hợp lệ. Gì ngạc nhiên tôi nhận được lỗi sau:Làm cách nào để bỏ qua cảnh báo chứng chỉ https trong trình khách C# signalr?

System.Net.Http.HttpRequestException : An error occurred while sending the request. 
----> System.Net.WebException : The underlying connection was closed: Could not establish trust relationship for the SSL/TLS secure channel. 
    ----> System.Security.Authentication.AuthenticationException : The remote certificate is invalid according to the validation procedure. 

Với Net bình thường HttpClient bạn có thể xây dựng nó với một WebRequestHandler mà có một đại biểu ServerCertificateValidationCallback, cho phép bạn thay đổi hành vi xác nhận chứng chỉ. SignalR HttpClient dường như không có điều này.

Trả lời

8

Bạn nên đăng ký phương thức cho sự kiện ServerCertificateValidationCallback.

Mã này chỉ đăng ký một phương thức ẩn danh trả về true khi sự kiện được kích hoạt.

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

Hãy cẩn thận, đây là cài đặt chung. Vì vậy, tất cả tín hiệu yêu cầu ssl/tls hoặc http sẽ sử dụng cài đặt này.

+0

Điều đó có hiệu quả, cảm ơn. Toàn cầu không phải là tuyệt vời nhưng tôi đang sử dụng trong một hội đồng thử nghiệm, do đó, nó là đủ tốt. – Dan

1

Tôi tin rằng tôi đã tìm thấy một cách có vẻ như hoạt động nhưng không phải là toàn cầu như phương pháp ServicePointManager.ServerCertificateValidationCallback thường được khuyến nghị. Tôi bắt đầu bằng cách làm cho một lớp con của lớp SignalR "DefaultHttpClient" như sau:

class CustomHttpClient : DefaultHttpClient 
    { 
     private readonly System.Net.Security.RemoteCertificateValidationCallback _serverCertificateValidationCallback; 

     public CustomHttpClient (System.Net.Security.RemoteCertificateValidationCallback serverCertificateValidationCallback) : base() 
     { 
      this._serverCertificateValidationCallback = serverCertificateValidationCallback; 
     } 

     protected override HttpMessageHandler CreateHandler() 
     { 
      var rv = base.CreateHandler() as WebRequestHandler; 
      if (this._serverCertificateValidationCallback != null) 
       rv.ServerCertificateValidationCallback = this._serverCertificateValidationCallback; 
      return rv; 
     } 
    } 

Bây giờ tôi có thể sử dụng tùy chỉnh của tôi HttpClient thực hiện khi tôi gọi là "Start" trên dụ HubConnection của tôi như sau:

var hubConnection = new HubConnection("my server url"); 
var myHub = hubConnection.CreateHubProxy("my hub name"); 
hubConnection.Start(new CustomHttpClient((sender, certificate, chain, sslPolicyErrors) => 
       { 
        //put some validation logic here if you want to. 
        return true; 
       })); 

Điều này sẽ cho phép bạn xác thực chứng chỉ máy chủ khi bạn thấy phù hợp, nhưng giữ phạm vi cho HubConnection hiện tại thay vì ảnh hưởng đến tất cả lưu lượng HTTP từ ứng dụng của bạn.

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