如何忽略 c# 信号器客户端中的 https 证书警告

本文关键字:https 证书 警告 客户端 何忽略 信号器 | 更新日期: 2023-09-27 18:36:00

我正在尝试使用无效证书连接到 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.

使用普通的 .Net HttpClient可以使用具有ServerCertificateValidationCallback委托的WebRequestHandler构造它,从而允许更改证书验证行为。 SignalR HttpClient似乎没有这些。

如何忽略 c# 信号器客户端中的 https 证书警告

您应该为ServerCertificateValidationCallback事件注册一个方法。

此代码仅注册一个匿名方法,该方法在触发事件时返回 true。

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

请注意,这是一个全局设置。因此,所有 ssl/tls 请求信令或 http 都将使用此设置。

我相信

我已经找到了一种似乎有效但不像通常推荐的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;
                }));

这应该允许您根据需要验证服务器证书,但将范围保留为当前 HubConnection,而不会影响来自应用程序的所有 HTTP 流量。