Как я могу игнорировать предупреждения сертификата 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-трафик из вашего приложения.