Как я могу игнорировать предупреждения сертификата https в клиенте c# signalr?

Я пытаюсь подключиться к серверу 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 вы можете построить его с WebRequestHandler что есть ServerCertificateValidationCallback делегировать, что позволяет изменить поведение проверки сертификата. С Помощью SignalR HttpClient похоже, ничего этого нет.

2 ответов


вы должны зарегистрировать метод ServerCertificateValidationCallback событие.

этот код просто регистрирует анонимный метод, который возвращает true, если событие произойдет.

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

будьте осторожны, это глобальная настройка. Таким образом, все запросы SSL/tls signalr или 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;
        }
    }

теперь я могу использовать свою пользовательскую реализацию 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;
                }));

Это должно позволить вам проверить сертификат сервера, как вы см. fit, но сохраните область текущего HubConnection вместо того, чтобы влиять на весь HTTP-трафик из вашего приложения.