2016-02-24 91 views
6

我試圖用無效證書連接到SignalR服務器。不出所料,我得到以下錯誤:如何忽略c#signalr客戶端中的https證書警告?

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. 

如果使用普通的.Net HttpClient您可以用WebRequestHandler具有ServerCertificateValidationCallback委託建造它,允許您更改證書驗證行爲。 SignalR HttpClient似乎沒有這個。

回答

8

您應該註冊一個方法ServerCertificateValidationCallback事件。

此代碼只註冊一個匿名方法,當事件被觸發時返回true。

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

請注意,這是一個全局設置。因此,所有ssl/tls請求信號器或http將使用此設置。

+0

工作,謝謝。 全球不是很好,但我在測試裝配中使用它,所以它已經足夠好了。 – Dan

1

我相信我已經找到了一種似乎可行的方式,但不像通常推薦的ServicePointManager.ServerCertificateValidationCallback方法那樣是全局性的。我開始通過使SignalR「DefaultHttpClient」類的子類,如下所示:

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; 
     } 
    } 

現在我可以用我的自定義HttpClient的執行當我打電話「開始」在我HubConnection爲例說明如下:

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; 
       })); 

這應該允許您按照您認爲合適的方式驗證服務器證書,但將範圍保留在當前的HubConnection上,而不是影響應用中的所有HTTP流量。