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

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


person Simon Dugré    schedule 18.05.2010    source источник
comment
Также проверьте это stackoverflow.com/questions/1600743/   -  person Oskar Kjellin    schedule 18.05.2010
comment
После некоторых изменений в моем коде мы снова попробовали его на Windows XP, и он отлично работает ... но все еще не в Windows 7. Heum!?! : o (   -  person Simon Dugré    schedule 21.05.2010
comment
вот решение, которое я нашел: stackoverflow.com/a/12702022/1716005 HTH   -  person kennydust    schedule 03.10.2012
comment
У меня было аналогичное исключение - см. Отличия stackoverflow.com/questions/8594684/   -  person Mateusz    schedule 04.09.2013
comment
Это 2018 год, и этот вопрос был просмотрен 308056 раз, но до сих пор нет правильного решения для этого !! Я получаю эту проблему случайно, и ни одно из исправлений, упомянутых здесь или в других темах, не решило мою проблему.   -  person Nigel Fds    schedule 03.04.2018
comment
@NigelFds Ошибка The request was aborted: Could not create SSL/TLS secure channel является очень общей. По сути, он говорит, что инициализация соединения SSL / TLS / HTTPS не удалась по одной из многих возможных причин. Так что, если вы получаете его регулярно в определенной ситуации, лучше всего задать конкретный вопрос с конкретными подробностями об этой ситуации. И проверьте просмотр событий для получения дополнительной информации. И / или включите некоторую отладку на стороне клиента .NET, чтобы получить более подробную информацию (не доверяет ли сертификат сервера? Есть ли несоответствие шифра? Несоответствие версии протокола SSL / TLS? И т. Д.).   -  person MarnixKlooster ReinstateMonica    schedule 10.04.2018
comment
@MarnixKlooster Я уже все это проверил, это не может быть проблемой с сертификатом, так как если я попробую еще раз, он работает. И я сомневаюсь, что смогу задать этот вопрос на SO, чтобы кто-нибудь не пришел и не пометил его как дубликат или что-то в этом роде.   -  person Nigel Fds    schedule 11.04.2018
comment
Я пробовал все вышеперечисленное, и ни один из них не работал. Но это мне помогает: в конечном итоге проблема заключалась в порядке ServicePointManager и Webrequest.Create. Эти строки меняются местами, чтобы ServicePointManager был определен до того, как Webrequest.Create устранил проблему. Я до сих пор не знаю, почему добавление ServicePointManager после Create устранило нашу исходную проблему, когда наш сервер перешел на TLS 1.2, но сейчас мы не будем об этом беспокоиться. Исходное сообщение: stackoverflow.com/questions/52296865 /   -  person user2686690    schedule 17.09.2018
comment
У меня была такая же проблема в Windows 7, проблема воспроизводится в Internet Explorer 11, переходя на сайт, у которого есть сертификат, который поддерживает только протокол tls2 (т.е. нет ss3, нет tls и tls 1.1, только tls2). Я понял, что Windows 7 O.S не обновлена, и я не мог выполнить массовое обновление из-за проблем с подключением, поэтому я начал расследование. После двухдневной траты я получил решение. Похоже, что установка MS14-066 (Windows6.1-KB2992611-x64) включает некоторые дополнительные шифры, которых не было в Windows 7 в начале.   -  person Jordi Espada    schedule 18.10.2018
comment
У меня такая же ошибка с Visual Studio 2017 (15.9.3) в Windows 10.   -  person StingyJack    schedule 03.12.2018
comment
@NigelFds. Вы подключаетесь к серверу, который использует подстановочный SSL-сертификат сервера и указание имени сервера?   -  person petko    schedule 25.06.2019
comment
@petko мое приложение подключается ко многим различным API, и почти у всех время от времени возникает эта проблема ... Я чувствую, что проблема заключается в структуре .Net   -  person Nigel Fds    schedule 26.06.2019
comment
@NigelFds, чтобы уточнить: ваша целевая платформа .NET Framework - 4.5.2?   -  person petko    schedule 26.06.2019
comment
@petko да это   -  person Nigel Fds    schedule 28.06.2019
comment
Я борюсь с этой проблемой, может быть, в 4-й раз. Та же самая кодовая база, которую я использую, отлично работает в производственной среде, а также в среде разработки некоторых из моих коллег-разработчиков. В прошлый раз меня проинструктировали добавить в реестр значение Computer \ HKEY_LOCAL_MACHINE \ SOFTWARE \ WOW6432Node \ Microsoft \ .NETFramework \ v4.7.02046 \ SchUseStrongCrypto [DWORD] = 1. И это работало какое-то время. Я начал работать в другом проекте какое-то время, а теперь я вернулся к этому проекту, и запрос снова не выполняется, даже с этим исправлением ключа реестра. Очень назойливый.   -  person Miguel    schedule 12.09.2019
comment
@NigelFds Использование 4.5.2 почти наверняка составляет большую часть проблемы. Среда выполнения определяет параметры протокола безопасности по умолчанию, а в 4.5.x включены только SSL 3.0 и TLS 1.0, а это означает, что если ваше приложение вызывает API с отключенным TLS 1.0, оно завершится ошибкой. Попробуйте более высокую платформу .NET Framework, предпочтительно 4,7 или выше. См. мой ответ для получения дополнительных сведений, особенно если ваше приложение является сайтом ASP.NET.   -  person JLRishe    schedule 02.10.2019
comment
Здесь те же проблемы, эта проблема возникла случайно, не уверен, что это связано с сетью. Использование .net framework 4.7.2, поэтому он не должен иметь отношения к tls1.2   -  person lty    schedule 03.07.2020


Ответы (45)


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

Хотя код работает в 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.

person Simon Dugré    schedule 25.05.2010
comment
Это работает и для нового класса HttpClient. . - person deerchao; 20.03.2013
comment
ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3; тоже может сработать. Я использую Windows 8. - person draw; 07.06.2013
comment
Переход к SecurityProtocolType.Tls12 фактически устранил эту проблему для меня. Смотрите мой ответ ниже. - person Bryan Legend; 15.10.2014
comment
SSLv3 исполнилось 18 лет, и теперь он уязвим для эксплойта POODLE - поскольку @LoneCoder рекомендует SecurityProtocolType.Tls12 является подходящей заменой SecurityProtocolType.Ssl3. - person gary; 16.10.2014
comment
SecurityProtocolType.Tls на самом деле может быть лучшей альтернативой, пока для этого не будет найден эксплойт (не все сайты поддерживают Tls12 на момент написания) - person gary; 20.10.2014
comment
В качестве дополнительной информации, для PayPal мне также нужно было обновить веб-ссылку на мыло. +1 - person BendEg; 10.03.2016
comment
PayPal установил дату 30 июня 2017 года, чтобы отключить SSL3 и внедрить TLS1.2. Он уже применяется в их среде песочницы paypal-knowledge. ru / infocenter / - person Robin French; 10.05.2016
comment
ServicePointManager - это класс в пространстве имен System.Net, а Expect100Continue и SecurityProtocol - статические свойства этого класса. Без директивы using это можно сделать с помощью System.Net.ServicePointManager.SecurityProtocol = System.Net.SecurityProtocolType.Tls12; - person palswim; 14.12.2017
comment
Вы можете отправить запрос GET со своим HttpWebRequest по этому URL-адресу: ssllabs.com/ssltest/viewMyClient.html и сохраните текст ответа на диск, а затем откройте этот файл в браузере. Он сообщит вам о версиях протокола, которые вы выбрали (SecurityProtocolType имеет атрибут FlagsAttribute), а также многие другие сведения о безопасности вашего веб-клиента. - person figolu; 28.12.2017
comment
Github API обновлен до TL только 22 февраля 2018 г. (из-за чего я столкнулся с указанной выше ошибкой): developer.github.com/changes/ - person Wollan; 01.03.2018
comment
Мой планировщик задач выполняется каждый день (не по выходным). Я получаю ту же ошибку, но иногда (2 errors in 2 months). Когда я получаю сообщение об ошибке, через несколько минут я пытаюсь снова вручную, и все в порядке. Я использую WebRequest.Create. Я не использую ServicePointManager - person Kiquenet; 08.03.2018
comment
Вы получаете ошибку всегда (во всех запросах) или иногда? - person PreguntonCojoneroCabrón; 09.03.2018
comment
См. Также это. Вам не нужно устанавливать его исключительно для одного типа, вы также можете просто добавить. System.Net.ServicePointManager.SecurityProtocol |= System.Net.SecurityProtocolType.Tls12; - person Nae; 20.03.2018
comment
Это работает, но ОЧЕНЬ важно, чтобы вы установили параметры ServicePointManager перед выполнением веб-запроса. I.E Код ServicePointManager должен находиться в верхней части вашего кода, чтобы он работал. - person Peter H; 24.08.2018
comment
Даже сейчас, в 2018 году, это правильный ответ. Спасибо за публикацию так давно. - person digitalformula; 12.11.2018
comment
@ PreguntonCojoneroCabrón Я получаю сообщение об ошибке иногда в Windows 7, но neveron в Windows 10. Ваш вопрос, позвольте мне надеяться, что у вас есть идея или решение для этого случая? - person h.m.i.13; 02.04.2019
comment
Это изменение является статическим и глобальным, поэтому вам нужно делать его только один раз, а не для каждого запроса - в идеале в классе запуска. Если вы этого не сделаете, вы можете столкнуться со странным поведением. Я видел эту ошибку только для первого запроса, и последующие запросы были в порядке. Это произошло из-за того, что HttpWebRequest был настроен до вышеупомянутого, поэтому недавно инициализированный HttpWebRequest не подходил для нового протокола до второго запуска. - person Chad Hedgcock; 12.04.2019
comment
Expect100Continue можно установить для конкретного экземпляра HttpWebRequest: _request.ServicePoint.Expect100Continue = false; Я думаю, это лучше, чем изменять его глобально для каждого запроса. - person lisandro101; 11.05.2019
comment
Вам не нужно устанавливать ServicePointManager.Expect100Continue = true;. Он включен по умолчанию (см. здесь). - person Gucu112; 03.07.2019
comment
Вы можете добавить это в конструктор своего теста, и он устранит проблему, даже если реализация находится в другой библиотеке. Решил это за меня! - person Don Rolling; 20.09.2019
comment
Следует отметить, что Microsoft настоятельно не рекомендует делать это. Если вы столкнулись с этой проблемой, скорее всего, это связано с использованием старой версии .NET framework. Я добавил ответ, в котором подробно рассказывается об этом. - person JLRishe; 02.10.2019
comment
У меня была такая же ошибка, и я использовал решение выше, однако мой код работал только тогда, когда я запускал свой код в Visual Studio в качестве администратора. Сообщение об ошибке не меняется, если это проблема с разрешениями, поэтому попробуйте запустить его также от имени администратора. - person Raz; 30.12.2019
comment
Я боролся с этой ошибкой при разработке надстройки MS Access VSTO. Код DLL будет работать, если выполняется через консольное приложение, но та же самая команда не сработает, если выполняется через Access. Оказалось, что консольное приложение использовало .SystemDefault, в то время как Access по какой-то причине установил для него значение Ssl | Tls, ни один из которых не поддерживался сервером. - person Dav; 02.02.2020
comment
теперь это сработало, но теперь я продолжаю получать эту ошибку. Однако он работает на локальном хосте. - person Mike; 27.06.2020
comment
Большое спасибо за добавление использования. Здесь есть бесконечное количество полезных примеров кода, которые просто не работают сразу, потому что using отсутствует, и вы должны сначала их найти в Google ... - person BloodyRain2k; 20.10.2020
comment
Спасибо, я устранял это в течение часа. Мой код работал в Visual Studio, но не при запуске из SSIS. - person MadMarc; 12.03.2021

Решением этой проблемы в .NET 4.5 является

ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;

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

ServicePointManager.SecurityProtocol = (SecurityProtocolType)3072;
person Andrej Z    schedule 22.02.2018
comment
Спасибо! Мне нужно использовать .net 4.0, и я не знал, как это решить. Кажется, здесь это работает. :) - person Fabiano; 04.06.2018
comment
Не работает в Windows Server 2008R2 (и, возможно, в 2012 году) - person Misam; 12.07.2018
comment
@billpg, точнее прочтите это отвечать - person Vikrant; 20.08.2018
comment
Для типов VB (поскольку этот ответ появляется в Google) эквивалентный код ServicePointManager.SecurityProtocol = DirectCast(3072, SecurityProtocolType) - person ConfusionTowers; 22.03.2019

Убедитесь, что настройки 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;
person hogarth45    schedule 21.06.2018
comment
В чем разница между работами и неудачами, о которых вы упомянули выше? - person Chandy Kunhu; 06.07.2018
comment
Потрясающие. Мой запрос сработал только после второй попытки, что не имело смысла, а затем я увидел ваш пост, переместил протокол безопасности перед запросом и, вуаля, исправлен. Спасибо @ hogarth45 - person deanwilliammills; 09.10.2018
comment
Точно! когда я разместил ServicePointManager непосредственно перед созданием запроса, у меня это сработало. Спасибо, чувак, ты спас мне день. - person ; 29.03.2019
comment
В нашем случае запрос не удался в первый раз, а потом сработал. Это произошло именно по причине, указанной в этом ответе! - person Mohammad Dehghan; 06.01.2020
comment
Не могу поверить, что такая глупость, как порядок инициализации, решила эту проблему за меня. SMH. Спасибо @ horgath45 !! - person Steve H.; 02.05.2020
comment
Спасибо, парень! В моем случае интересным было то, что я получил ошибку перед отправкой запроса при попытке вызвать метод request.GetRequestStream () для добавления некоторых данных формы. Порядок установки tls-информации действительно важен. - person Ustin; 02.07.2020
comment
В пользовательском классе C # я изменил: var client = new WebClient (); AddHeader (H, клиент); Кому: var client = new WebClient (); ServicePointManager.Expect100Continue = true; ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12 | SecurityProtocolType.Ssl3; AddHeader (H, клиент); - person Lawrence Patrick; 02.02.2021

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

Вместо того, чтобы указывать Ssl3, как в ответе Саймонса, я смог исправить это, перейдя к Tls12 следующим образом:

ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;
new WebClient().DownloadData("https://ct.mob0.com/Styles/Fun.png");
person Bryan Legend    schedule 15.10.2014
comment
Спасибо Lone ... это безумие, как кажется, есть много разных возможных проблем в зависимости от ситуации ... И, как я вижу, реальной документации по этому поводу нет. Что ж, спасибо, чтобы указать на кого-то, у кого может возникнуть такая же проблема. - person Simon Dugré; 15.10.2014
comment
Это сработало для меня. Я столкнулся с ошибкой, когда переключился с офисной локальной сети на домашнюю. Тот же код, тот же ноутбук! - person Amal; 19.08.2017
comment
Вы получаете ошибку всегда (во всех запросах) или иногда? - person PreguntonCojoneroCabrón; 09.03.2018

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

Пример того, как это настроить, находится по адресу: http://support.microsoft.com/kb/901183 < / а>

Под шагом 2 в дополнительной информации

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

person Avitus    schedule 18.05.2010
comment
Я пробовал запустить winhttpcertcfg.exe ... учтите, что у меня Windows 7. Может это что-то меняет? - person Simon Dugré; 19.05.2010
comment
Я не уверен, связано ли это, но этот пост дал мне идею запустить VS в качестве администратора при выполнении этого вызова из VS, и это устранило проблему для меня. - person PFranchise; 16.08.2013
comment
В Windows 7 и более поздних версиях сертификат должен находиться в хранилище для локального компьютера, а не для текущего пользователя, чтобы управлять закрытыми ключами. - person Lukos; 21.04.2015
comment
Ага, это была моя проблема. используйте mmc.exe, добавьте оснастку сертификатов (для меня я выбрал «локальный компьютер»). Щелкните правой кнопкой мыши сертификат, все задачи, управление закрытыми ключами. Добавьте 'всех' (для локальных разработчиков это проще всего - продукту, очевидно, нужен ваш явный пул приложений веб-сайта IIS / пользователь) - person Ian Yates; 04.05.2020

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

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

См. Также Как включить ведение журнала событий Schannel.

person Remus Rusanu    schedule 18.05.2010
comment
Где находится путь для Schannel event logging в Windows 7-8-10? - person PreguntonCojoneroCabrón; 09.03.2018
comment
устранять неполадки TLS / SSL программно на C #? - person Kiquenet; 19.04.2018

Одна из основных причин этой проблемы - активная версия .NET Framework. Версия среды выполнения .NET framework влияет на то, какие протоколы безопасности включены по умолчанию.

  • На сайтах ASP.NET версия среды выполнения фреймворка часто указывается в web.config. (см. ниже)
  • В других приложениях версия среды выполнения - это обычно версия, для которой был создан проект, независимо от того, выполняется ли он на компьютере с более новой версией .NET.

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

Framework Version Default Protocols
4.5 and earlier SSL 3.0, TLS 1.0
4.6.x TLS 1.0, 1.1, 1.2, 1.3
4.7+ System (OS) Defaults

Для более старых версий ваш пробег может несколько отличаться в зависимости от того, какие среды выполнения .NET установлены в системе. Например, может возникнуть ситуация, когда вы используете очень старую структуру и TLS 1.0 не поддерживается, или использование 4.6.x и TLS 1.3 не поддерживается.

документация Microsoft настоятельно рекомендует использовать 4.7+ и систему значения по умолчанию:

Мы рекомендуем вам:

  • Настройте таргетинг на .NET Framework 4.7 или более поздние версии в своих приложениях. Установите целевой .NET Framework 4.7.1 или более поздние версии в своих приложениях WCF.
  • Не указывайте версию TLS. Настройте свой код, чтобы ОС определяла версию TLS.
  • Выполните тщательный аудит кода, чтобы убедиться, что вы не указываете версию TLS или SSL.

Для сайтов ASP.NET: проверьте версию targetFramework в вашем элементе <httpRuntime>, поскольку он (если он есть) определяет, какая среда выполнения фактически используется вашим сайтом:

<httpRuntime targetFramework="4.5" />

Лучше:

<httpRuntime targetFramework="4.7" />
person JLRishe    schedule 02.10.2019
comment
Добавленный в ‹httpRuntime› был исправлением для меня. - person BrianK; 27.01.2021
comment
У меня была такая же проблема в одном из моих проектов (раньше все было нормально). Оказалось, это потому, что веб-сайты идут в ногу со временем и больше не поддерживают старые протоколы безопасности. Я обновил фреймворк своего проекта с 4 до 4.6.1, и он снова заработал без каких-либо изменений кода. - person Skyfish; 21.04.2021
comment
Это устранило проблему для меня в 3 моих веб-приложениях. - person nshathish; 25.05.2021

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

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

person Nick Gotch    schedule 04.12.2014
comment
Этот ответ должен получить больше голосов. После недели исследований это единственное решение, которое сработало для меня. Спасибо!! - person user224567893; 20.01.2017
comment
Мне также потребовались дни постоянно растущего разочарования, прежде чем я нашел этот пост, который также решил эту проблему для меня. В моем случае AppPool работал как ApplicationPoolIdentity, что является настройкой по умолчанию, но изменение его на LocalSystem решило проблему. - person Hanno; 01.09.2020

Подход с настройкой

ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12

Кажется, все в порядке, потому что Tls1.2 - это последняя версия защищенного протокола. Но я решил посмотреть глубже и ответить, действительно ли нам нужно это жестко кодировать.

Технические характеристики: Windows Server 2012R2 x64.

Из Интернета сообщается, что .NetFramework 4.6+ по умолчанию должен использовать Tls1.2. Но когда я обновил свой проект до 4.6, ничего не произошло. Я нашел некоторую информацию, которая говорит, что мне нужно вручную внести некоторые изменения, чтобы включить Tls1.2 по умолчанию.

https://support.microsoft.com/en-in/help/3140245/update-to-enable-tls-1-1-and-tls-1-2-as-default-secure-protocols-in-wi

Но предлагаемое обновление Windows не работает для версии R2

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

Set-ItemProperty -Path 'HKLM:\SOFTWARE\Wow6432Node\Microsoft\.NetFramework\v4.0.30319' -Name 'SchUseStrongCrypto' -Value '1' -Type DWord
Set-ItemProperty -Path 'HKLM:\SOFTWARE\Microsoft\.NetFramework\v4.0.30319' -Name 'SchUseStrongCrypto' -Value '1' -Type DWord

Это то, что я искал. Но все же я не могу ответить на вопрос, почему NetFramework 4.6+ не устанавливает это ... значение протокола автоматически?

person simply good    schedule 28.10.2019
comment
вам нужно перезапустить сервер после внесения этих изменений? - person Sharon; 01.12.2020
comment
@Sharon Если вы говорите о машине - нет, просто перезапуска приложения / хоста должно быть достаточно - person simply good; 26.01.2021
comment
В моем случае помогло добавление ключей реестра. Дополнительная информация с сайта docs.microsoft.com/en-us / dotnet / framework / network-programming / Значение 1 заставляет ваше приложение использовать надежную криптографию. Сильная криптография использует более безопасные сетевые протоколы (TLS 1.2, TLS 1.1 и TLS 1.0) и блокирует незащищенные протоколы. Значение 0 отключает сильную криптографию. Достаточно было перезапустить мое приложение. - person bugybunny; 23.02.2021
comment
@bugybunny спасибо, обновлю ответ - person simply good; 07.04.2021

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

ServicePointManager.Expect100Continue = true;
        ServicePointManager.DefaultConnectionLimit = 9999;
        ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12 | SecurityProtocolType.Ssl3;
person SpoiledTechie.com    schedule 01.06.2016
comment
Я бы не рекомендовал добавленный протокол SSL3. - person Peter de Bruijn; 21.02.2017
comment
SSL3 имеет серьезную проблему безопасности под названием «Пудель». - person Peter de Bruijn; 09.03.2018
comment
@PeterdeBruijn Tls and Tls11 устарели? - person Kiquenet; 10.04.2018
comment
@Kiquenet - да. С июня 2018 года PCI (индустрии платежных карт) не разрешит протоколы ниже TLS1.2. (Изначально это было запланировано на 06/2017, но было отложено на год) - person GlennG; 13.04.2018
comment
В семействе SSL / TLS есть пять протоколов: SSL v2, SSL v3, TLS v1.0, TLS v1.1 и TLS v1.2: github.com/ssllabs/research/wiki/ SSL v2 unsecure, SSL v3 is insecure when used with HTTP (the POODLE attack), TLS v1.0, TLS v1.1 obsoletes Единственным допустимым вариантом будет ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12? - person Kiquenet; 13.04.2018

Запрос был прерван: не удалось создать исключение безопасного канала SSL / TLS, если сервер возвращает ответ HTTP 401 Unauthorized на запрос HTTP.

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

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

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

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

person Jon Schneider    schedule 19.08.2014
comment
Мой планировщик задач выполняется каждый день (не по выходным). Я получаю ту же ошибку, но иногда (2 errors in 2 months). Когда я получаю сообщение об ошибке, через несколько минут я пытаюсь снова вручную, и все в порядке. - person Kiquenet; 08.03.2018

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

диалоговое окно импорта сертификата

person Sherlock    schedule 11.07.2012
comment
Клиенту постоянно приходилось переустанавливать сертификат, чтобы использовать клиентскую программу. Снова и снова им приходилось переустанавливать сертификат перед использованием программы. Я надеюсь, что этот ответ решит эту проблему. - person Pangamma; 20.10.2017

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

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

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

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

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

  • HKLM \ SOFTWARE \ Policies \ Microsoft \ Cryptography \ Configuration \ 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

person Jon Schneider    schedule 31.08.2016
comment
В моем случае этот ответ полезен. Кроме того, поскольку я подозревал, что на моем клиентском ПК отсутствуют некоторые комплекты шифров, я воспользовался ярлыком и установил это обновление Windows напрямую, чтобы испытать удачу (support.microsoft.com/en-hk/help/3161639, требуется перезагрузка Windows) перед запуском поиска анализатора сообщений, и оказалось, что мне повезло, и он решил мою проблему, спасая себя поиском. - person sken130; 30.03.2018
comment
Обратите внимание, что когда вы тестируете ссылку HTTPS в браузерах, таких как Firefox, даже если вы получаете другой шифр, чем тот, который предоставляется любым данным Центром обновления Windows, обновление Windows все равно стоит попробовать, потому что установка новых шифров повлияет на согласование шифров. между клиентским ПК и сервером, что увеличивает надежду на совпадение. - person sken130; 30.03.2018
comment
По существу ответ на мою проблему. Две вещи, которые помогли мне найти необходимые изменения. 1. Наборы шифров, поддерживаемые веб-сервером: ssllabs.com/ssltest 2. Разные наборы шифров Поддержка версий Windows: docs.microsoft.com/ en-us / windows / win32 / secauthn / - person Paul B.; 02.12.2019

Это работает для меня в веб-клиенте 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;
    }
}
person Arun Prasad E S    schedule 04.10.2017
comment
Может ли переопределение ServerCertificateValidationCallback ввести новую дыру в безопасности? - person ; 05.02.2018

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

<httpRuntime targetFramework="4.5.2" />

и не:

<httpRuntime targetFramework="4.6.1" />
person Terje Solem    schedule 15.08.2017
comment
У меня была такая же проблема, и я добавил более подробный ответ ниже, в котором подробно описаны все тонкости этой проблемы. . - person JLRishe; 02.10.2019

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

В вышеупомянутой статье объясняется, как составить список всех потенциально поддерживаемых комплектов шифров машины и включить дополнительные комплекты шифров через реестр Windows. Чтобы проверить, какие наборы шифров включены на клиенте, попробуйте посетить эту диагностическую страницу в MSIE. (Использование трассировки System.Net может дать более точные результаты.) Чтобы проверить, какие наборы шифров поддерживаются сервером, попробуйте это онлайн-инструмент (при условии, что сервер доступен в Интернете). Само собой разумеется, что редактирование реестра должно выполняться с осторожностью, особенно когда речь идет о сети. (Является ли ваш компьютер виртуальной машиной с удаленным размещением? Если бы вы нарушили работу сети, была бы виртуальная машина вообще доступна?)

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

person APW    schedule 01.06.2019
comment
Это чувство, когда я наводю указатель мыши на ссылку на эту полезную статью, чтобы увидеть, что это может быть, и это ссылка на статью в моем собственном блоге. ???? - person Jon Schneider; 14.07.2021

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

ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3;

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

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

  • Это глобальный параметр в вашем домене приложения, и если у вас есть одновременные действия, вы не можете надежно установить для него одно значение, выполнить свое действие, а затем вернуть его обратно. Во время этого маленького окна может произойти другое действие, на которое может повлиять.
  • Правильная настройка - оставить значение по умолчанию. Это позволяет .NET продолжать использовать наиболее безопасное значение по умолчанию с течением времени и обновлением фреймворков. Установка TLS12 (который является наиболее безопасным на момент написания этой статьи) будет работать сейчас, но через 5 лет может начать вызывать загадочные проблемы.
  • Если вам действительно нужно установить значение, вам следует подумать о том, чтобы сделать это в отдельном специализированном приложении или домене приложения и найти способ обмена данными между ним и вашим основным пулом. Поскольку это единое глобальное значение, попытка управлять им в загруженном пуле приложений приведет только к проблемам. Этот ответ: https://stackoverflow.com/a/26754917/7656 предоставляет возможное решение посредством настраиваемого прокси-сервера. . (Обратите внимание, что я лично не реализовал это.)
person Tyler Forsythe    schedule 16.09.2016
comment
Вопреки вашему общему практическому правилу, я добавлю, что существует исключение, когда вы ДОЛЖНЫ установить для него TLS 1.2, вместо того, чтобы позволять запускать по умолчанию. Если вы используете фреймворк старше .NET 4.6 и отключите небезопасные протоколы на своем сервере (SSL или TLS 1.0 / 1.1), то вы не сможете отправлять запросы, если не принудительно установите для программы TLS 1.2. - person Paul; 08.03.2017

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

Если вы установите значение 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 ...
person TCC    schedule 25.04.2014
comment
Ух ты! Спасибо, что упомянули об этом. Во-первых, не мог поверить в это и сначала попробовал кучу разных вещей. Затем, наконец, установите таймаут на 10 секунд, и исключение исчезнет! Это решение для меня. (у) - person derFunk; 11.08.2014

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

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

Это помогло мне:

System.Net.ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;
person Merlyn007    schedule 26.01.2021
comment
Для меня это тоже решило проблему. - person Patrick; 27.02.2021

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

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

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

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

person aghost    schedule 02.12.2015
comment
Причина, по которой это сработало, могла заключаться в том, что разные версии .NET поддерживают разные версии протокола SSL / TLS. Дополнительная информация: blogs.perficient.com/ microsoft / 2016/04 / tsl-1-2-and-net-support - person Jon Schneider; 23.08.2016

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

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

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

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

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

введите описание изображения здесь

person cnom    schedule 10.05.2017
comment
есть ли проблема с отметкой всех из них? - person Nigel Fds; 03.04.2018
comment
никаких проблем, насколько я знаю ... кроме того, что ssl больше не рекомендуется ... они не считаются достаточно безопасными. - person cnom; 03.04.2018
comment
как это сделать программно в PowerShell? - person Kiquenet; 07.04.2018
comment
Это то, что влияет на более старые версии Windows. Проведите небольшое исследование, выясните, какие параметры безопасности используются в настоящее время. На сегодняшний день перейдите по этой ссылке: tecadmin.net/enable-tls- на-windows-server-and-iis - person Tod; 14.05.2019

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

person bplus    schedule 27.02.2018
comment
Увы, не мне! - person benedict_w; 12.04.2018

У меня была такая же проблема, и я обнаружил, что этот ответ работал у меня правильно. Ключ - 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
person joeydood    schedule 27.05.2018
comment
Это решение работает, даже если вы используете старую платформу 4.0 .NET. - person Antti; 25.04.2021

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
person capdragon    schedule 26.07.2018
comment
Вот PS для быстрого редактирования: New-ItemProperty -Path "HKLM:\SOFTWARE\Microsoft\.NETFramework\v4.0.30319" -Name "SchUseStrongCrypto" -Value "1" -Type DWord - person Tilo; 29.08.2018
comment
Вот PS для быстрого редактирования2: New-ItemProperty -Path "HKLM:\SOFTWARE\Wow6432Node\Microsoft\.NETFramework\v4.0.30319" -Name "SchUseStrongCrypto" -Value "1" -Type DWord - person Tilo; 29.08.2018

Ни один из ответов не помог мне.

Вот что сработало:

Вместо инициализации моего 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...
}

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

person sports    schedule 30.04.2019
comment
В моем случае эта проблема возникла ТОЛЬКО при размещении процесса в IIS (то есть веб-приложение, выполняющее вызов в другом месте). - Это исправлено! Спасибо, что поделился! - person Efrain; 18.09.2019

Это исправлено для меня, добавьте сетевую службу в разрешения. Щелкните сертификат правой кнопкой мыши> Все задачи> Управление закрытыми ключами ...> Добавить ...> Добавить «Сетевая служба».

person jayasurya_j    schedule 06.04.2018

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

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

person OfirD    schedule 30.10.2019

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

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

person Danny Cullen    schedule 15.05.2015
comment
Ага, то же самое. Чтобы исправить это, я сделал то, что сказал ответ Ника Готча: изменил идентификатор пула приложений на LocalSystem. Это решило проблему для меня. - person Judah Gabriel Himango; 02.11.2016

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

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

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

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

1) Исправьте ОС с помощью соответствующего обновления: http://www.catalog.update.microsoft.com/Search.aspx?q=kb4458166

2) Добавьте параметр в файл app.config / web.config.

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

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

person Michael Silver    schedule 24.09.2018
comment
Кроме того, убедитесь, что вы устанавливаете ServicePointManager.SecurityProtocol только один раз в своем приложении. Мы обнаружили в нашем приложении второй вызов (который довольно сложен с дополнительными сборками, загружаемыми во время выполнения), который устанавливал его на SSL3, который затем выдавал то же сообщение об ошибке. - person Michael Silver; 24.10.2018

ни один из этого ответа не работает для меня, google chrome и почтальон работают и рукопожатие сервера, но т.е. и .net не работают. в Google Chrome на вкладке безопасности> соединение показывает, что зашифровано и аутентифицировано с использованием набора шифров ECDHE_RSA с P-256 и AES_256_GCM для установления связи с сервером.

введите здесь описание изображения

Я устанавливаю IIS Crypto и в списке наборов шифров на сервере Windows 2012 R2 не могу найти < strong> ECDHE_RSA с набором шифров P-256 и AES_256_GCM. затем я обновляю окна до последней версии, но проблема не решается. наконец, после поисков я понял, что Windows Server 2012 R2 не поддерживает GSM правильно и обновил мой сервер до Windows Server 2016, и моя проблема решена.

person sina alizadeh    schedule 31.05.2020

Наконец-то нашел для меня решение.

Попробуйте добавить следующую строку перед вызовом https url (для .Net framework 4.5):

ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;

person Priyank Sharma    schedule 16.06.2021

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

person Mark Reid    schedule 11.06.2015
comment
Не используйте ссылки при ответе, так как они могут не работать в будущем, укажите в своем ответе наиболее важные аспекты. - person Rodrigo López; 11.06.2015

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

Идентификатор события 36888 (Schannel) возникает:

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

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

Предлагаемое решение на форуме vmware заключалось в добавлении записи в реестр в Windows. После добавления следующего реестра все работает нормально.

[HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ Control \ SecurityProviders \ SCHANNEL \ KeyExchangeAlgorithms \ Diffie-Hellman]

«ClientMinKeyBitLength» = двойное слово: 00000200

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

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

wmic qfe list

Тема решения:

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

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

person Hernán Dario Velásquez García    schedule 28.09.2017

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

person twk    schedule 18.05.2010
comment
Установка сертификата наверняка сработает на моем компьютере, но я пытаюсь пройти аутентификацию по внешнему сертификату на сервере, к которому у меня нет доступа, кроме доступа к API с помощью WebRequest, но я должен пройти аутентификацию в зоне https ... - person Simon Dugré; 19.05.2010
comment
Итак, загрузите их сертификат и установите его как надежный на компьютере приложения. - person twk; 21.05.2010
comment
Хорошо ... Может быть, я буду выглядеть немного новичком, но почему и как? - person Simon Dugré; 21.05.2010

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

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

person Jeff Lehmer    schedule 29.10.2014

У меня возникла проблема с загрузкой видео в Wistia через приложение командной строки. Наш системный администратор решил проблему, включив дополнительные комплекты шифров с использованием IIScrypto, которые были указаны в результатах сканирования SSL-лабораторий для upload.wistia.com.

TLS_DHE_RSA_WITH_AES_128_GCM_SHA256 (0x9e) DH 2048 бит FS 128 TLS_DHE_RSA_WITH_AES_256_GCM_SHA384 (0x9f) DH 2048 бит FS 256

person PutoTropical    schedule 05.09.2019

Для пользователей SOAP / WCF эта ошибка также может возникать, когда сервер отклоняет вашу конфигурацию WS-Security. Информация об ошибке, которую получает клиент, очень расплывчата, но администратор сервера, вероятно, сможет определить причину.

Как только пример этого находится в профиле UsernameToken, где сообщение считается просроченным к <wsu:Created> времени, не является допустимой датой и временем ISO 8601 либо из-за неправильного форматирования, не из-за UTC, либо из-за несоответствия времени сервера.

<wsse:UsernameToken wsu:Id="Example-1">
   <wsse:Username> ... </wsse:Username>
   <wsse:Password Type="..."> ... </wsse:Password>
   <wsse:Nonce EncodingType="..."> ... </wsse:Nonce>
   <wsu:Created>2021-01-31T19:00:00.0000000Z</wsu:Created>
</wsse:UsernameToken>
person Nickson    schedule 09.03.2021

По умолчанию .NET ServicePointManager.SecurityProtocol использует SSLv3 и TLS. Если вы обращаетесь к серверу Apache, существует переменная конфигурации с именем SSLProtocol, которая по умолчанию имеет значение TLSv1.2. Вы можете настроить ServicePointManager.SecurityProtocol на использование соответствующего протокола, поддерживаемого вашим веб-сервером, или изменить конфигурацию Apache, чтобы разрешить использование всех протоколов, подобных этому _ 4_ all.

person Paul    schedule 17.11.2017
comment
НЕ использовать SSLv3? - person PreguntonCojoneroCabrón; 09.03.2018

Недавно я столкнулся с той же проблемой. Моя среда работает под .NET 4.6.1 с VB.NET. Вот как я это исправил:

ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3
ServicePointManager.ServerCertificateValidationCallback = New RemoteCertificateValidationCallback(AddressOf util.ValidateServerCertificate)

а функция util.ValidateServerCertificate:

Public Function ValidateServerCertificate(ByVal sender As Object, ByVal certificate As X509Certificate, ByVal chain As X509Chain, ByVal sslPolicyErrors As SslPolicyErrors) As Boolean
    Return True
End Function
person cavalcanteg    schedule 06.07.2018

Если вы не хотите, не можете легко или не можете быстро исправить свой код, вместо этого вы можете принудительно использовать TLS 1.2 своим кодом .NET в платформе.

Это не мое приложение, но оно помогло исправить наше старое приложение .NET 4.5 (работающее на Server 2008r2), чтобы оно снова работало со шлюзом Paypal Payflow. Должно быть, они начали принудительное подключение к TLS 1.2 на обратных вызовах шлюза потока платежей между 25.06.18 и 08.07.18.

Подробности: https://github.com/TheLevelUp/pos-tls-patcher Загрузить : https://github.com/TheLevelUp/pos-tls-patcher/releases

person cvocvo    schedule 09.07.2018

У меня был сертификат в магазине и в досье. Я попытался подключиться к файлу и получил это сообщение об ошибке. Когда я использовал тот, что был в магазине, он работал. Я предполагаю, что какой-то конфликт возник в результате наличия сертификата, когда я хотел использовать тот, который находится в файле. (Другой сервис на той же машине использовал сертификат в магазине, и я разработал другой сервис, используя сертификат в файле. Работал как шарм на dev до тестирования).

person Jon    schedule 10.05.2019

Я получаю ту же ошибку в приложении .NET 4.5.2 Winform на Windows 2008 Server.

Я попробовал следующее исправление:

ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls1|SecurityProtocolType.Tls11| SecurityProtocolType.Tls12;

Но это не сработало, и количество повторений ошибки по-прежнему сохранялось.

Согласно одному из ответов выше, обязательно ли переопределить ключ SchUseStrongCrypto в реестре. Есть ли побочные эффекты, если я установлю этот ключ.

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
person siddharth    schedule 16.07.2020

Удаление этого параметра из реестра помогло мне в Windows Server 2012 [HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ Control \ SecurityProviders \ SCHANNEL \ KeyExchangAlgorithms

введите описание изображения здесь

person Zireael    schedule 10.02.2021

В большинстве ответов выше упоминаются алгоритмы сеанса или алгоритмы обмена ключами.

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

Я понял это, добавив раздел в конфигурацию моего приложения.

<system.diagnostics>
    <trace autoflush="true" />
    <sources>
        <source name="System.Net">
            <listeners>
                <add name="System.Net" />
            </listeners>
        </source>
        <source name="System.Net.Sockets">
            <listeners>
                <add name="System.Net" />
            </listeners>
        </source>
        <source name="System.Net.Cache">
            <listeners>
                <add name="System.Net" />
            </listeners>
        </source>
    </sources>
    <sharedListeners>
        <add
            name="System.Net"
            type="System.Diagnostics.TextWriterTraceListener"
            initializeData="System.Net.trace.log"
        />
    </sharedListeners>
    <switches>
        <add name="System.Net" value="Verbose" />
        <add name="System.Net.Sockets" value="Verbose" />
        <add name="System.Net.Cache" value="Verbose" />
    </switches>
</system.diagnostics>

А затем ошибка в журнале привела меня к этому решению

person MYriad    schedule 16.07.2021