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

434

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

Саймон Дугре
источник
3
Проверьте это также stackoverflow.com/questions/1600743/…
Оскар Кьеллин
52
Сейчас 2018 год, и этот вопрос был просмотрен 308,056 раз, но до сих пор нет правильного решения этой проблемы !! Я получаю эту проблему случайно, и ни одно из исправлений, упомянутых здесь или в каких-либо других темах, не решило мою проблему.
Найджел Фдс
3
@NigelFds Ошибка The request was aborted: Could not create SSL/TLS secure channelочень общая. В основном говорится, что «инициализация соединения SSL / TLS / HTTPS не удалась по одной из многих возможных причин». Так что, если вы получаете это регулярно в конкретной ситуации, лучше всего задать конкретный вопрос с указанием конкретных деталей об этой ситуации. И проверка просмотра событий для получения дополнительной информации. И / или включите некоторую отладку на стороне клиента .NET для получения более подробной информации (не является ли сертификат сервера ненадежным? Имеется ли несоответствие шифров? Несоответствие версий протоколов SSL / TLS? И т. Д.).
MarnixKlooster ReinstateMonica
4
@MarnixKlooster Я уже проверил все это, это не может быть проблемой с сертификатом, как будто я повторяю его, он работает. И я сомневаюсь, что смогу задать этот вопрос на SO, если кто-то не придет и не отметит его как дубликат или что-то в этом роде.
Найджел Фдс
1
Я борюсь с этим вопросом, может быть, в четвертый раз. Та же самая кодовая база, которую я использую, прекрасно работает как на производстве, так и в среде разработчиков некоторых моих коллег-разработчиков. В прошлый раз мне поручили добавить значение реестра Computer \ HKEY_LOCAL_MACHINE \ SOFTWARE \ WOW6432Node \ Microsoft \ .NETFramework \ v4.7.02046 \ SchUseStrongCrypto [DWORD] = 1. И это работало некоторое время. Я начал работать в другом проекте некоторое время, и теперь я вернулся к этому проекту, и запрос снова не удается, даже с этим исправлением ключа реестра. Очень назойливый.
Мигель

Ответы:

599

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

Пока код работает в 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 об этом.

Саймон Дугре
источник
5
Переход к SecurityProtocolType.Tls12 фактически исправил эту проблему для меня. Смотрите мой ответ ниже.
Брайан Легенд
24
SSLv3 18 лет, и теперь он подвержен эксплойту POODLE - поскольку @LoneCoder рекомендует SecurityProtocolType.Tls12 - подходящая замена для SecurityProtocolType.Ssl3
gary,
4
SecurityProtocolType.Tls может быть лучшей альтернативой, пока для этого не будет найден эксплойт (не все сайты поддерживают Tls12 на момент написания)
gary,
3
PayPal установил дату 30 июня 2017 года, чтобы отключить SSL3 и внедрить TLS1.2. Он уже применяется в их среде песочницы. Paypal-knowledge.com/infocenter/…
Робин Френч
11
Смотрите это тоже. Вам не нужно устанавливать только один тип, вы можете просто добавить его. System.Net.ServicePointManager.SecurityProtocol |= System.Net.SecurityProtocolType.Tls12;
Nae
154

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

ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;

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

ServicePointManager.SecurityProtocol = (SecurityProtocolType)3072;
Андрей З
источник
10
Спасибо! Мне нужно использовать .net 4.0 и не знал, как решить эту проблему. Это похоже на работу здесь. :)
Фабиано
Не работает на Windows Server 2008R2 (и, возможно, также на 2012)
Мисам
@billpg, прочитайте это для более точного ответа
Викрант
Для типов VB (так как этот ответ отображается в Google), эквивалентный кодServicePointManager.SecurityProtocol = DirectCast(3072, SecurityProtocolType)
ConfusionTowers
@Andrej Z работает над .net framework 4. Спасибо.
az
108

Убедитесь, что настройки 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;
hogarth45
источник
4
В чем разница между работами и неудачами, о которых вы упоминали выше?
Чанди Кунху
5
Потрясающие. Мой запрос сработал только после второй попытки, которая не имела смысла, и тогда я увидел ваше сообщение, перенес протокол безопасности перед запросом и вуаля, исправлено. Спасибо @ hogarth45
deanwilliammills
2
Точно! Когда я разместил ServicePointManager как раз перед тем, как запрос был создан, он работал для меня, Спасибо, парень, Ты спас мой день.
1
Прекрасно ... это замечательно
Марьям Багери
1
В нашем случае запрос не удался в первый раз и работал позже. Именно из-за причины, изложенной в этом ответе!
Мохаммад Дехган
34

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

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

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

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

Avitus
источник
Я попытался выполнить winhttpcertcfg.exe ... обратите внимание, что я на Windows 7. Может ли это что-то изменить?
Симон Дугре
Я не уверен, что это связано, но этот пост дал мне идею запустить VS от имени администратора при выполнении этого вызова из VS, и это решило проблему для меня.
PFranchise
2
В Windows 7 и более поздних версиях сертификат должен находиться в хранилище для локального компьютера, а не для текущего пользователя, чтобы «управлять личными ключами»
Lukos
1
Да, это была моя проблема. используйте mmc.exe, добавьте оснастку сертификатов (для меня тогда я выбрал «локальный компьютер»). Щелкните правой кнопкой мыши сертификат, все задачи, управляйте закрытыми ключами. Добавьте «все» (для локального разработчика это проще всего - prod, очевидно, нужен ваш явный пул / пользователь приложения на веб-сайте IIS)
Ян Йейтс
@ Ian Йейтс, это решение работает только для меня (у)
Усман Юнас
31

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

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

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

Ремус Русану
источник
Где путь для Schannel event loggingв Windows , 7-8-10 ?
PreguntonCojoneroCabrón
устранять неполадки TLS / SSL программно в C #?
Kiquenet
27

У меня была эта проблема, когда я пытался попасть на 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");
Брайан Легенд
источник
Спасибо, Одинокий ... это безумие, потому что, кажется, есть много разных возможностей проблем в зависимости от ситуации ... И, как я вижу, нет реальной документации по этому поводу. Ну, спасибо, что указал на кого-то, кто может столкнуться с той же проблемой.
Симон Дугре,
Это сработало для меня. Я столкнулся с ошибкой при переключении из офисной локальной сети в домашнюю сеть. Тот же код, тот же ноутбук!
Амаль
Вы получаете ошибку всегда (во всех запросах) или иногда ?
PreguntonCojoneroCabrón
24

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

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

Ник Готч
источник
3
Этот ответ должен иметь больше голосов. После недели исследований это единственное решение, которое сработало для меня. Спасибо!!
user224567893
Это сработало для меня. отлично спасибо
Emy Stats
18

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

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

Но что мне помогло, так это добавление 2 значений в реестр. Вы можете использовать следующий сценарий 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+ не устанавливает это ... Значение протокола автоматически?

просто хорошо
источник
17

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

ServicePointManager.Expect100Continue = true;
        ServicePointManager.DefaultConnectionLimit = 9999;
        ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12 | SecurityProtocolType.Ssl3;
SpoiledTechie.com
источник
8
Я бы не рекомендовал добавленный протокол SSL3.
Питер де Брюин
SSL3 имеет серьезную проблему безопасности под названием «Пудель».
Питер де Брюин
@PeterdeBruijn Tls and Tls11являются устаревшими ?
Kiquenet
1
@Kiquenet - да. С июня 2018 года PCI (Payment Card Industries) не будет разрешать протоколы ниже TLS1.2. (Первоначально это было намечено на 06/2017, но было отложено на год)
GlennG
В семействе 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?
Kiquenet
14

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

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

Шерлок
источник
Клиент продолжал переустанавливать сертификат, чтобы использовать клиентскую программу. Снова и снова им придется переустанавливать сертификат перед использованием программы. Я надеюсь, что этот ответ исправит эту проблему.
Пангамма
11

Исключение «Запрос был прерван: не удалось создать безопасный канал SSL / TLS», если сервер возвращает HTTP 401 Несанкционированный ответ на запрос HTTP.

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

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

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

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

Джон Шнайдер
источник
1
Мой планировщик задач выполняю каждый день (не выходные). Я получаю ту же ошибку, но иногда ( 2 errors in 2 months). Когда я получаю ошибку, через несколько минут я пытаюсь снова вручную, и все в порядке.
Kiquenet
10

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

Джон Шнайдер
источник
1
В моем случае этот ответ полезен. Кроме того, так как я подозревал, что мой клиентский компьютер пропустил некоторые комплекты шифров, я воспользовался ярлыком и установил это обновление Windows непосредственно, чтобы попытать счастья ( support.microsoft.com/en-hk/help/3161639 , требуется перезагрузка Windows) перед тем, как действительно запустить Анализатор сообщений поиска, и оказалось, что мне повезло, и это решило мою проблему, сохранив себе поиск.
sken130
1
Обратите внимание, что при тестировании HTTPS-ссылки в браузерах, таких как Firefox, даже если вы получаете другой шифр, чем тот, который предоставляется в любом данном Центре обновления Windows, Центр обновления Windows все еще стоит попробовать, потому что установка новых шифров повлияет на согласование шифров. между клиентским ПК и сервером, тем самым увеличивая надежду найти совпадение.
sken130
Точнее ответь на мою проблему. Две вещи, которые помогли мне найти изменения. 1. Наборы шифров, поддерживаемые веб-сервером: ssllabs.com/ssltest 2. Наборы шифров, поддерживаемые различными версиями Windows: docs.microsoft.com/en-us/windows/win32/secauthn/…
Пол Б.
10

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

ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3;

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

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

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

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

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

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

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

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

ППВ
источник
9

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

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

  • .NET Framework 4.5 и более ранние версии - SSL 3.0, TLS 1.0
  • .NET Framework 4.6.x - TLS 1.0, 1.1, 1.2, 1.3
  • .NET Framework 4.7+ - настройки системы (ОС) по умолчанию

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

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

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

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

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

<httpRuntime targetFramework="4.5" />

Лучше:

<httpRuntime targetFramework="4.7" />
JLRishe
источник
8

Этот работает для меня в веб-клиенте 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;
        }
    }
Арун Прасад Е.С.
источник
2
Будет ли переопределять ServerCertificateValidationCallback ввести новую дыру в безопасности?
7

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

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

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

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

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

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

cnom
источник
какая-то проблема в том, чтобы пометить их всех?
Найджел Фдс
никаких проблем, насколько я знаю ... за исключением того, что ssl больше не рекомендуется ... они не считаются достаточно безопасными.
cnom
как это сделать программно в powershell?
Kiquenet
Это то, что влияет на старые версии Windows. Проведите небольшое исследование, выясните, какие параметры безопасности используются в настоящее время. На сегодняшний день смотрите эту ссылку: tecadmin.net/enable-tls-on-windows-server-and-iis
Tod
7

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

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

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

bplus
источник
Увы не для меня!
benedict_w
Это единственный, который помог в моем случае! Спасибо!!!
Александр Остриков
6

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

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

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

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

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

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
capdragon
источник
3
Здесь PS для быстрого редактирования: New-ItemProperty -Path "HKLM:\SOFTWARE\Microsoft\.NETFramework\v4.0.30319" -Name "SchUseStrongCrypto" -Value "1" -Type DWord
Тило
2
Вот PS для быстрого редактирования2: New-ItemProperty -Path "HKLM:\SOFTWARE\Wow6432Node\Microsoft\.NETFramework\v4.0.30319" -Name "SchUseStrongCrypto" -Value "1" -Type DWord
Тило
4

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

ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;
Мухаммед Авайс
источник
Я добавил эту строку. Иногда это терпит неудачу, и я получаю ту же ошибкуSystem.Net.WebException: The request was aborted: Could not create SSL/TLS secure channel.
Джозеф Кацман
4

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

jayasurya_j
источник
3

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

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

Дэнни Каллен
источник
Да, то же самое. Чтобы исправить это, я сделал то, что сказал ответ Ника Готча: изменил удостоверение пула приложений на LocalSystem. Это решило это для меня.
Иуда Габриэль Химанго
1
Спасибо за это
Денис Питчер
3

У меня возникла та же проблема, и я обнаружил, что этот ответ работает правильно для меня. Ключ 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
joeydood
источник
3

На этот вопрос может быть много ответов, поскольку речь идет об общем сообщении об ошибке. Мы столкнулись с этой проблемой на некоторых наших серверах, но не на наших машинах для разработки. После удаления большинства наших волос мы обнаружили, что это ошибка 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) Добавьте параметр реестра, который уже упоминался в другом ответе.

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

Майкл Сильвер
источник
Кроме того, убедитесь, что вы устанавливаете ServicePointManager.SecurityProtocol только один раз в своем приложении. Мы обнаружили второй вызов в нашем приложении (довольно сложный с необязательными сборками, загружаемыми во время выполнения), который устанавливал для него SSL3, который затем выдал то же сообщение об ошибке.
Майкл Сильвер
3

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

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

HeyJude
источник
2

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

Марк Рейд
источник
1
Не используйте ссылки в ответе, так как они могут не сработать в будущем. Укажите наиболее важные аспекты этого ответа
Родриго Лопес,