HttpClient получает Не удалось создать исключение безопасного канала SSL / TLS - PullRequest
0 голосов
/ 24 января 2019

У меня есть простой тестовый клиент, написанный на .NET Framework 4.5.2, который я пытаюсь подключиться к веб-сервису REST клиента.

Сам код довольно прост:

using (var requestHandler = new WebRequestHandler())
{
    requestHandler.ClientCertificates.Add(myCertificate);

    var url = new Uri(myBaseUrl);

    using (var client = new HttpClient(requestHandler) {BaseAddress = url})
    {
        ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;

        var endPoint = $"api/MyController/Ticket/12345";

        var response = client.GetAsync(endPoint).Result;
        response.EnsureSuccessStatusCode();

        var content = response.Content.ReadAsStringAsync().Result;

        Console.WriteLine(JToken.Parse(content).ToString(Formatting.Indented));
    }
}

Чтобы проверить это, я запускаю IIS 10.0 на своем локальном компьютере и настраиваю SSL / TLS через реестр:

\HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.2\Server\Enabled=1

Когда TLS 1.1 включен и TLS 1.2 отключен, если я запускаюМой клиент устанавливает ServicePointManager.SecurityProtocol в TLS 1.1, все работает.

Когда TLS 1.1 включен и TLS 1.2 отключен, если я запускаю свой клиент, устанавливающий ServicePointManager.SecurityProtocol в TLS 1.2, я получаю исключение:

MyTest: System.AggregateException: One or more errors occurred. 
---> System.Net.Http.HttpRequestException: An error occurred while sending the request. 
---> System.Net.WebException: The request was aborted: Could not create SSL/TLS secure channel.
   at System.Net.HttpWebRequest.EndGetResponse(IAsyncResult asyncResult)
   at System.Net.Http.HttpClientHandler.GetResponseCallback(IAsyncResult ar)
   --- End of inner exception stack trace ---
   --- End of inner exception stack trace ---
   at System.Threading.Tasks.Task.ThrowIfExceptional(Boolean includeTaskCanceledExceptions)
   at System.Threading.Tasks.Task`1.GetResultCore(Boolean waitCompletionNotification)
   at System.Threading.Tasks.Task`1.get_Result()
---> (Inner Exception #0) System.Net.Http.HttpRequestException: An error occurred while sending the request. 
---> System.Net.WebException: The request was aborted: Could not create SSL/TLS secure channel.
   at System.Net.HttpWebRequest.EndGetResponse(IAsyncResult asyncResult)
   at System.Net.Http.HttpClientHandler.GetResponseCallback(IAsyncResult ar)
   --- End of inner exception stack trace ---<---

Это именно то, что я ожидал.

И если я отредактирую реестр, чтобы включить TLS 1.2 и отключить 1.1, перезагрузите компьютер и попробуйте снова, если я запустил свой клиент, установив ServicePointManager.SecurityProtocol в TLS1.2, все работает.

И если я запускаю свой клиент с настройкой ServicePointManager.SecurityProtocol для TLS 1.1, я получаю исключение.

Все из которых убедительноСкажи мне, что мой тестовый клиент в целом правильный.Он правильно устанавливает TLS.

Итак, я помещаю это на компьютер клиента и пытаюсь подключиться к его веб-сервису.

У нас есть тестовый веб-сервис, работающий на компьютере, на котором я запускаю клиентна, так что у нас есть только одна конфигурация системы для работы.

Когда я запускаю клиент, указывая TLS 1.2 (что они хотят использовать), я получаю исключение:

MyTest: System.AggregateException: One or more errors occurred. 
---> System.Net.Http.HttpRequestException: An error occurred while sending the request. 
---> System.Net.WebException: The request was aborted: Could not create SSL/TLS secure channel.
   at System.Net.HttpWebRequest.EndGetResponse(IAsyncResult asyncResult)
   at System.Net.Http.HttpClientHandler.GetResponseCallback(IAsyncResult ar)
   --- End of inner exception stack trace ---
   --- End of inner exception stack trace ---
   at System.Threading.Tasks.Task.ThrowIfExceptional(Boolean includeTaskCanceledExceptions)
   at System.Threading.Tasks.Task`1.GetResultCore(Boolean waitCompletionNotification)
   at System.Threading.Tasks.Task`1.get_Result()
---> (Inner Exception #0) System.Net.Http.HttpRequestException: An error occurred while sending the request. ---> System.Net.WebException: The request was aborted: Could not create SSL/TLS secure channel.
   at System.Net.HttpWebRequest.EndGetResponse(IAsyncResult asyncResult)
   at System.Net.Http.HttpClientHandler.GetResponseCallback(IAsyncResult ar)
   --- End of inner exception stack trace ---<---

Поэтому я пробую свой клиент, используя SSL 3, TLS 1.0, TLS 1.1 и TLS 1.2.Независимо от того, что я пытаюсь, я получаю Не могу создать безопасный канал SSL / TLS .

Помните - это попытка получить доступ к веб-сервису, запущенному на компьютере, на котором я запускаю клиент.

Я проверил реестр, и, похоже, у них включен TLS 1.2.И я знаю, что они перезагрузились с тех пор, как внесли изменения в реестр.

Они работают под управлением IIS7 в 64-битном Windows Server 2008 R2 Datacenter.

Похоже, откуда я сижу, какTLS 1.2 не включен на их компьютере, несмотря на реестр и перезагрузку.

Любые идеи?

===

Просто чтобы сбить с толку, когда я получаю доступ ксайт через Chrome, он работает просто отлично.

Рассматривая сведения о безопасности в Инструментах разработчика Chrome, мы видим:


Эта страница безопасна (действительный HTTPS)

  • Сертификат - действительный и доверенный

Соединение с этим сайтом использует действующий сертификат доверенного сервера, выданный ...

  • Ресурсы - все сервера надежно

Все ресурсы на этой странице обслуживаются надежно.

  • Соединение - устаревшие настройки соединения

Соединение сэтот сайт использует TLS 1.2 (надежный протокол), RSA (устаревший обмен ключами) и AES_128_CBV с HMAC-SHA1 (устаревший шифр).


Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...