Запрос был прерван:Не удалось создать безопасный канал SSL/TLS.

StackOverflow https://stackoverflow.com/questions/2859790

Вопрос

Мы не можем подключиться к 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.Это что-то меняет?

Это было полезно?

Решение

Я наконец нашел ответ (я не отметил мой источник, но он был из поиска);

Хотя код работает в Windows XP, в Windows 7 вы должны добавить это в начале:

// using System.Net;
ServicePointManager.Expect100Continue = true;
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;
// Use SecurityProtocolType.Ssl3 if needed for compatibility reasons

И теперь это работает отлично.


Приложение

Как упомянуто Робин Французский; Если вы получаете эту проблему во время настройки PayPal, обратите внимание, что они не будут поддерживать SSL3, начиная с 3-го декабря 2018 года. Вам нужно будет использовать TLS. Вот PayPal Page об этом.

Другие советы

Решение этого, в .NET 4.5

ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;

Если у вас нет .NET 4.5, то используйте

ServicePointManager.SecurityProtocol = (SecurityProtocolType)3072;

Убедитесь, что настройки ServicePointManager сделаны до создания httpwebrequest, иначе он не будет работать.

Работает:

        ServicePointManager.Expect100Continue = true;
        ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls
               | SecurityProtocolType.Tls11
               | SecurityProtocolType.Tls12
               | SecurityProtocolType.Ssl3;

        HttpWebRequest request = (HttpWebRequest)WebRequest.Create("https://google.com/api/")

Не удается:

        HttpWebRequest request = (HttpWebRequest)WebRequest.Create("https://google.com/api/")

        ServicePointManager.Expect100Continue = true;
        ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls
               | SecurityProtocolType.Tls11
               | SecurityProtocolType.Tls12
               | SecurityProtocolType.Ssl3;

Проблема, имеющая, в том, что пользователь ASPNET не имеет доступа к сертификату. Вы должны дать доступ, используя winhttpcertcfg.exe

Пример о том, как настроить это:http://support.microsoft.com/kb/901183.

Под шагом 2 при более информации

Редактировать: В более поздних версиях IIS эта функция встроена в инструмент Manager сертификата - и может быть доступен правой кнопкой мыши на сертификате и используя опцию для управления закрытыми ключами. Подробнее здесь: https://serverfault.com/questions/131046/how-to-grant-iis-7-5-access-To-a-certificate-in-certificate-store/132791#132791.

Ошибка универсала, и есть много причин, по которым переговоры SSL / TLS могут потерпеть неудачу. Наиболее распространенным является недействительным или просроченным сервером, и вы позаботились об этом, предоставляя свой собственный крючок для проверки сертификата сервера, но не обязательно является единственной причиной. Сервер может потребовать взаимную аутентификацию, она может быть настроена с помощью списков шифров, не поддерживаемых вашим клиентом, у него может быть слишком большой дрейф для рукопожатия, чтобы добиться успеха и многое другое.

Лучшим решением является использование набора инструментов для устранения неполадок Schannel. Schannel - провайдер SSPI, ответственный за SSL и TLS, и ваш клиент будет использовать его для рукопожатия. Взгляни на TLS / SSL Инструменты и настройки.

Также см Как включить регистрацию событий Schannel.

У меня была эта проблема, пытаясь ударить https://ct.mob0.com/styles/fun.png., который является изображением, распространяемым CloudFlare на его CDN, который поддерживает сумасшедшие вещи, такие как SPDY и Weird Redirect SSL SSL.

Вместо того, чтобы указывать SSL3, как в Саймонсе, я смог исправить это, иду на TLS12, как это:

ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;
new WebClient().DownloadData("https://ct.mob0.com/Styles/Fun.png");

Через много долгих часов с этой же проблемой я обнаружил, что учетная запись ASP.NET Клиентская служба работала в разделе не имела доступа к сертификату. Я исправил его, перейдя в пул приложения IIS, который веб-приложение работает под, вступает в расширенные настройки и изменение идентичности на LocalSystem счета от NetworkService.

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

Что-то первоначальный ответ не имел. Я добавил еще несколько кода, чтобы сделать его доказательством пули.

ServicePointManager.Expect100Continue = true;
        ServicePointManager.DefaultConnectionLimit = 9999;
        ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12 | SecurityProtocolType.Ssl3;

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

certificate importation dialog

«Запрос был прерван: не удалось создать исключение SSL / TLS Secure Channel», может возникнуть, если сервер возвращает HTTP 401 несанкционирован Ответ на HTTP-запрос.

Вы можете определить, происходит ли это, включая систему трассировки System.net для вашего клиентского приложения, как описано в Этот ответ.

После того, как эта конфигурация журнала работает, запустите приложение и воспроизведите ошибку, затем посмотрите на вывод журнала для строки, как это:

System.Net Information: 0 : [9840] Connection#62912200 - Received status line: Version=1.1, StatusCode=401, StatusDescription=Unauthorized.

В моей ситуации я не мог установить конкретное печенье, которое ожидается, что сервер, приводя к серверу, отвечающую на запрос с ошибкой 401, что, в свою очередь, привело к исключительному значению «Не удалось создать SSL / TLS безопасный канал».

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

ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3;

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

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

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

Этот работает для меня в MVC WebClient

    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;
        }
    }

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

Если вы установите значение 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 ...

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

Чтобы исследовать эту возможность, вы можете скачать Анализатор сообщений Microsoft., и используйте его, чтобы запустить след на переговоров SSL, который возникает при попытке выполнения подключения HTTPS на сервер (в вашем приложении C #).

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

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

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

  • HKLM Software Policies Microsoft Cryptography Configuration SSL 00010002
  • HKLM System CreateControlset Control Cryptography Конфигурация local ssl 00010002

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

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

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

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

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

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

Это можно установить в:

Панель управления -> Сеть и Интернет -> Опции Интернета -> Advanced

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

  • Используйте SSL 2.0
  • Используйте SSL 3.0
  • Используйте TLS 1.0
  • Используйте TLS 1.1
  • Используйте TLS 1.2

enter image description here

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

<httpRuntime targetFramework="4.5.2" />

и не:

<httpRuntime targetFramework="4.6.1" />

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

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

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

У меня был такой же проблема и найден Этот ответ работал правильно для меня. Ключ 3072. Эта ссылка Предоставляет детали по исправлению «3072».

ServicePointManager.SecurityProtocol = (SecurityProtocolType)3072;

XmlReader r = XmlReader.Create(url);
SyndicationFeed albums = SyndicationFeed.Load(r);

В моем случае два канала требуют исправления:

https://www.fbi.gov/feeds/fbi-in-the-news/atom.xml
https://www.wired.com/feed/category/gear/latest/rss

System.net.WebException: запрос был прерван: не удалось создать SSL / TLS Secure Channel.

В нашем случае мы где используем поставщик программного обеспечения, поэтому у нас не было доступа к изменению кода .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

Попробуй это:

ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;

То Топ-голосованный ответ вероятно, будет достаточно для большинства людей. Однако в некоторых обстоятельствах вы можете продолжать получать «Не удалось создать ошибку SSL / TLS Secure Channel» даже после принуждения TLS 1.2. Если это так, вы можете проконсультироваться Это полезная статья Для дополнительных шагов по устранению неисправностей. Для суммирования: Независимость от проблемы версии TLS / SSL, клиент и сервер должны согласовать «зашифров». Во время фазы «Рукопожатия» соединения SSL клиент перечисляет свои поддерживаемые шифры-люксы для сервера, чтобы проверить свой собственный список. Но на некоторых окнах, некоторые общие шифры могут быть отключены (по-видимому, из-за того, что благодаря целеустремленным попыткам ограничить поверхность атаки), уменьшая вероятность того, что клиент и сервер, соглашаясь на шифр. Если они не могут согласиться, то вы можете увидеть «Код Fatal Alert 40» в просмотру событий и «не удалось создавать SSL / TLS Secure Channel» в вашей программе .NET.

Вышеупомянутая статья объясняет, как перечислить все потенциально поддерживаемые сборы шифров машины и включить дополнительные шифры с помощью реестра Windows. Чтобы помочь проверить, какие шифры включены на клиенту, попробуйте посетить Эта диагностическая страница в мси. (Использование трассировки System.net может дать более окончательные результаты.) Чтобы проверить, какие сборы шифры поддерживаются сервером, попробуйте Этот онлайн-инструмент (Предполагая, что сервер доступен в Интернет). Это должно пойти, не сказав, что Регистрация редактирования должна быть сделана с осторожностью, Особенно, где участвует сеть. (Является ли ваша машина для удаленного размещенного VM? Если вы должны были сломать сеть, вообще будет доступно VM?)

В случае моей компании мы включили несколько дополнительных люксов «Ecdhe_Ecdsa» через редактирование реестра, чтобы исправить немедленную проблему и охранять против будущих проблем. Но если вы не можете (или не будете) редактировать реестр, то многочисленные обходные пути (не обязательно красивые) приходят на ум. Например: ваша программа .NET может делегировать свой трафик SSL в отдельный Python Program (которая может работать, по той же причине, что Chrome запросы могут быть успешны, где запросы MSIE не удаются на затронутом машине).

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

Как дать ASP.NET доступ к закрытому ключу в сертификате в магазине сертификата?

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

Событие ID 36888 (Schannel) поднят:

The following fatal alert was generated: 40. The internal error state is 808.

Наконец это было связано с исправлением Windows. В моем случае: KB3172605 и KB3177186

Предлагаемое решение на VMware Forum было добавить запись реестра в Windows. После добавления следующего реестра все работает нормально.

HKEY_LOCAL_MACHINE System CurrentControlset Control SecurityProviders Schannel Keyexchangealgorithms diffie-hellman

"ClientMinkeybitLength" = DWORD: 00000200

Видимо, это связано с отсутствующим значением в рукопожатии HTTPS на стороне клиента.

Перечислите свой Windows Etfix:

wmic qfe list

Решение резьба:

https://communities.vmware.com/message/2604912#2604912.

Надеюсь, это помогает.

Ни один из ответов не работал для меня.

Это то, что работало:

Вместо того, чтобы инициализация моего X509Certifiacte2 так:

   var certificate = new X509Certificate2(bytes, pass);

Я сделал это так:

   var certificate = new X509Certificate2(bytes, pass, X509KeyStorageFlags.MachineKeySet | X509KeyStorageFlags.PersistKeySet | X509KeyStorageFlags.Exportable);

Обратите внимание X509KeyStorageFlags.Exportable !!

Я не изменил остаток кода ( WebRequest сам):

// I'm not even sure the first two lines are necessary:
ServicePointManager.Expect100Continue = true; 
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;

request = (HttpWebRequest)WebRequest.Create(string.Format("https://{0}.sii.cl/cvc_cgi/dte/of_solicita_folios", server));
request.Method = "GET";
request.Referer = string.Format("https://hercules.sii.cl/cgi_AUT2000/autInicio.cgi?referencia=https://{0}.sii.cl/cvc_cgi/dte/of_solicita_folios", servidor);
request.UserAgent = "Mozilla/4.0";
request.ClientCertificates.Add(certificate);
request.CookieContainer = new CookieContainer();

using (HttpWebResponse response = (HttpWebResponse)request.GetResponse())
{
    // etc...
}

На самом деле я даже не уверен, что первые две строки необходимы ...

Этот вопрос может иметь много ответов, поскольку это о общее сообщение об ошибке. Мы столкнулись с этим вопросом на некоторых наших серверах, но не наших машинах развития. После вытаскивания большинства наших волос мы нашли, что это была ошибка Microsoft.

https://support.microsoft.com/en-us/help/4458166/applications-that-threly-on-tls----2-strong-encryption-Experious-connect

По сути, MS предполагает, что вы хотите, чтобы ослабленное шифрование, но ОС задерживается только для разрешения TLS 1.2, поэтому вы получаете страшное «Запрос был прерван: не удается создать SSL / TLS Secure Change».

Есть три исправления.

1) Патч ОС с правильным обновлением: http://www.catalog.update.microsoft.com/search.aspx?q=kb4458166.

2) Добавьте настройку в файл app.config / web.config.

3) Добавьте настройку реестра, которая уже была упомянута в другом ответе.

Все они упоминаются в статье базы знаний, которые я разместил.

Вы можете попробовать установить демонстративную сертификат (некоторые поставщики SSL предлагают их бесплатно на месяц), чтобы быть уверенным, если проблема связана с действительностью сертификатов или нет.

Пока это относительно «живая» ссылка, я думал, что добавлю новый вариант. Эта возможность заключается в том, что служба больше не поддерживает SSL 3.0 из-за проблемы с атакой пуделя. Проверьте оператор Google на этом. Я столкнулся с этой проблемой с несколькими веб-сервисами одновременно и понял, что что-то должно происходить. Я перешел на TLS 1.2, и все снова работает.

http://googleonlinesecurity.blogspot.com/2014/10/this-poodle-bites-exploing-ssl-30.html.

Это происходило для меня только на одном сайте, и оказывается, что у него только шифр RC4. В предшествующих усилиях для затвердевания сервера я отключил шифр RC4, как только я повторно включал эту проблему, был решен.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top