2016-02-24 9 views
6

無効な証明書でSignalRサーバに接続しようとしています。当然のことながら、私は次のエラーを取得する:通常の.NETとの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. 

あなたが証明書の検証動作を変更することができ、ServerCertificateValidationCallbackデリゲートを持っているWebRequestHandlerでそれを構築することができHttpClient。 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; 
     } 
    } 

次のように私は私のHubConnectionインスタンス上で「スタート」を呼び出すときに今、私は私のカスタムのHttpClient実装を使用することができます。

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

これにより、サーバー証明書を検証し、アプリケーションからのすべてのHTTPトラフィックに影響を及ぼすのではなく、スコープを現在のHubConnectionに保つ必要があります。

関連する問題