Запрос был прерван: не удалось создать безопасный канал SSL / TLS - PullRequest
302 голосов
/ 18 мая 2010

Мы не можем подключиться к HTTPS-серверу, используя WebRequest из-за этого сообщения об ошибке:

The request was aborted: Could not create SSL/TLS secure channel.

Мы знаем, что на сервере нет действительного сертификата HTTPS с использованным путем, но для обхода этой проблемы мы используем следующий код, который мы взяли из другого сообщения StackOverflow:

private void Somewhere() {
    ServicePointManager.ServerCertificateValidationCallback += new RemoteCertificateValidationCallback(AlwaysGoodCertificate);
}

private static bool AlwaysGoodCertificate(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors policyErrors) {
   return true;
}

Проблема в том, что сервер никогда не проверяет сертификат и не работает с вышеуказанной ошибкой. Кто-нибудь знает, что мне делать?


Я должен упомянуть, что мы с коллегой провели тесты несколько недель назад, и они работали нормально с чем-то похожим на то, что я написал выше. Единственное «основное отличие», которое мы обнаружили, заключается в том, что я использую Windows 7, а он - Windows XP. Это что-то меняет?

Ответы [ 36 ]

9 голосов
/ 04 октября 2017

Этот работает для меня в веб-клиенте MVC

    public string DownloadSite(string RefinedLink)
    {
        try
        {
            Uri address = new Uri(RefinedLink);

            ServicePointManager.ServerCertificateValidationCallback = delegate { return true; };
            ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3;

            System.Net.ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12;

            using (WebClient webClient = new WebClient())
            {
                var stream = webClient.OpenRead(address);
                using (StreamReader sr = new StreamReader(stream))
                {
                    var page = sr.ReadToEnd();

                    return page;
                }
            }

        }
        catch (Exception e)
        {
            log.Error("DownloadSite - error Lin = " + RefinedLink, e);
            return null;
        }
    }
9 голосов
/ 17 сентября 2016

Корень этого исключения в моем случае заключался в том, что в какой-то момент кода вызывалось следующее:

ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3;

Это действительно плохо. Он не только инструктирует .NET использовать небезопасный протокол, но и влияет на каждый новый (и аналогичный) запрос WebClient, сделанный впоследствии в вашем домене приложения. (Обратите внимание, что входящие веб-запросы не затрагиваются в вашем приложении ASP.NET, но новые запросы WebClient, такие как общение с внешней веб-службой, выполняются).

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

  • Это глобальная настройка в вашем домене приложения, и если у вас есть одновременная активность, вы не можете надежно установить для нее одно значение, выполнить действие и затем сбросить его. Во время этого небольшого окна может произойти другое действие, и оно может быть затронуто.
  • Правильная настройка - оставить значение по умолчанию. Это позволяет .NET продолжать использовать любое безопасное значение по умолчанию с течением времени, и вы обновляете фреймворки. Установка его в TLS12 (который является наиболее безопасным на момент написания этой статьи) будет работать сейчас , но через 5 лет может начать вызывать загадочные проблемы.
  • Если вам действительно нужно установить значение, вам следует рассмотреть возможность сделать это в отдельном специализированном приложении или домене приложения и найти способ общения между ним и вашим основным пулом. Поскольку это единое глобальное значение, попытка управлять им в загруженном пуле приложений приведет только к проблемам. Этот ответ: https://stackoverflow.com/a/26754917/7656 предоставляет возможное решение посредством пользовательского прокси. (Обратите внимание, я лично не реализовал это.)
7 голосов
/ 31 августа 2016

Другой возможной причиной ошибки The request was aborted: Could not create SSL/TLS secure channel является несоответствие между сконфигурированными значениями cipher_suites вашего клиентского ПК и значениями, которые сервер настроил как желающие и способные принять . В этом случае, когда ваш клиент отправляет список значений cipher_suites, которые он может принять в своем исходном сообщении SSL Client handshaking /gotiation «Client Hello», сервер видит, что ни одно из предоставленных значений не является приемлемым, и может возвратить «Alert» "ответ вместо перехода к шагу" Server Hello "при установлении связи SSL.

Чтобы исследовать эту возможность, вы можете загрузить Microsoft Message Analyzer и использовать его для запуска трассировки по согласованию SSL, которое происходит, когда вы пытаетесь и не можете установить HTTPS-соединение с сервером (в вашем Приложение C #).

Если вы можете установить успешное HTTPS-соединение из другой среды (например, упомянутой вами машины с Windows XP - или, возможно, нажав URL-адрес HTTPS в браузере не от Microsoft, который не использует настройки набора шифров ОС (например, Chrome или Firefox), запустите другую трассировку Message Analyzer в этой среде, чтобы зафиксировать, что происходит при успешном согласовании SSL.

Надеюсь, вы увидите некоторое различие между двумя сообщениями Client Hello, которые позволят вам точно определить, что из-за неудачного согласования SSL вызывает его сбой. Тогда вы сможете внести изменения в конфигурацию Windows, что позволит ей добиться успеха. IISCrypto - отличный инструмент для этого (даже для клиентских ПК, несмотря на название «IIS»).

Следующие два раздела реестра Windows управляют значениями cipher_suites, которые будет использовать ваш компьютер:

  • HKLM \ SOFTWARE \ Policies \ Microsoft \ Cryptography \ Конфигурация \ SSL \ 00010002
  • HKLM \ SYSTEM \ CurrentControlSet \ Control \ Cryptography \ Configuration \ Local \ SSL \ 00010002

Вот полное описание того, как я исследовал и решил один из примеров этой разновидности проблемы Could not create SSL/TLS secure channel: http://blog.jonschneider.com/2016/08/fix-ssl-handshaking-error-in-windows.html

7 голосов
/ 26 апреля 2014

Как вы можете сказать, существует множество причин, по которым это может произойти. Думал, я бы добавил причину, с которой столкнулся ...

Если вы установите значение WebRequest.Timeout на 0, это исключение, которое выдается. Ниже приведен код, который у меня был ... (За исключением того, что вместо жестко заданного значения 0 для значения тайм-аута у меня был параметр, который был случайно установлен на 0).

WebRequest webRequest = WebRequest.Create(@"https://myservice/path");
webRequest.ContentType = "text/html";
webRequest.Method = "POST";
string body = "...";
byte[] bytes = Encoding.ASCII.GetBytes(body);
webRequest.ContentLength = bytes.Length;
var os = webRequest.GetRequestStream();
os.Write(bytes, 0, bytes.Length);
os.Close();
webRequest.Timeout = 0; //setting the timeout to 0 causes the request to fail
WebResponse webResponse = webRequest.GetResponse(); //Exception thrown here ...
6 голосов
/ 10 мая 2017

В случае, если клиент является машиной Windows, возможной причиной может быть то, что протокол tls или ssl, требуемый службой, не активирован.

Это может быть установлено в:

Панель управления -> Сеть и Интернет -> Свойства обозревателя -> Дополнительно

Прокрутите настройки до «Безопасность» и выберите между

  • Использовать SSL 2.0
  • Использовать SSL 3.0
  • Использовать TLS 1.0
  • Использовать TLS 1.1
  • Использовать TLS 1.2

enter image description here

6 голосов
/ 02 декабря 2015

Я боролся с этой проблемой весь день.

Когда я создал новый проект с .NET 4.5, я, наконец, заставил его работать.

Но если я опустился до 4.0, у меня снова возникла та же проблема, и она стала необратимой для этого проекта (даже когда я попытался обновить до 4.5).

Странно нет другого сообщения об ошибке, кроме "Запрос был прерван: не удалось создать безопасный канал SSL / TLS." обнаружил эту ошибку

5 голосов
/ 15 августа 2017

У меня была эта проблема, потому что мой web.config имел:

<httpRuntime targetFramework="4.5.2" />

а не:

<httpRuntime targetFramework="4.6.1" />
4 голосов
/ 27 февраля 2018

Если вы запускаете код из Visual Studio, попробуйте запустить Visual Studio от имени администратора. Исправлена ​​проблема для меня.

3 голосов
/ 26 июля 2018

System.Net.WebException: запрос был прерван: не удалось создать Безопасный канал SSL / TLS.

В нашем случае мы использовали поставщика программного обеспечения, поэтому у нас не было доступа для изменения кода .NET. Очевидно, что .NET 4 не будет использовать TLS v 1.2, если нет изменений.

Исправлением для нас было добавление ключа SchUseStrongCrypto в реестр. Вы можете скопировать / вставить приведенный ниже код в текстовый файл с расширением .reg и выполнить его. Он послужил нашим «патчем» к проблеме.

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\.NETFramework\v4.0.30319]
"SchUseStrongCrypto"=dword:00000001

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework\v4.0.30319]
"SchUseStrongCrypto"=dword:00000001
3 голосов
/ 14 ноября 2017

В моем случае служебная учетная запись, на которой запущено приложение, не имела разрешения на доступ к закрытому ключу. Как только я дал это разрешение, ошибка исчезла

  1. ММС
  2. Сертификаты
  3. Развернуть до персонального
  4. выберите сертификат
  5. щелкните правой кнопкой мыши
  6. Все задания
  7. Управление закрытыми ключами
  8. Добавить
...