.Net Framework 4.6.1 не используется по умолчанию для TLS 1.2

Наш клиент недавно обновил протокол безопасности до TLS 1.2. Поэтому мы обновили наше приложение до 4.6.1, ожидая, что протокол безопасности будет по умолчанию на TLS 1.2, но это не так. Есть идеи, почему?


person Harihara Iyer    schedule 09.05.2017    source источник
comment
Откуда ты знаешь, что это не так? Что ты пробовал?   -  person Panagiotis Kanavos    schedule 09.05.2017
comment
TLS 1.2 работает в 4.6.2 по умолчанию - использование HttpClient для получения домашней страницы Google.com (TLS1.2) работает без проблем.   -  person Panagiotis Kanavos    schedule 09.05.2017
comment
Мы получаем эту ошибку при подключении к серверу. Это может быть связано с тем, что сертификат сервера неправильно настроен с HTTP.SYS в случае HTTPS. Однако при добавлении этой строки в метод запуска файла Global.asax эта проблема была исправлена. ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12 | SecurityProtocolType.Ssl3; Но мы хотим знать, зачем нам это устанавливать, если у нас есть приложение в .Net 4.6.1.   -  person Harihara Iyer    schedule 09.05.2017
comment
Какая ошибка? Какой код? Я не могу ничего воспроизвести с консольным приложением, ориентированным на 4.6.1. Если сертификат неверен, вы получите ошибку с любым клиентом, включая браузеры.   -  person Panagiotis Kanavos    schedule 09.05.2017
comment
Нет воспроизведения с консольным приложением, ориентированным на 4.6.1 в Windows 10, вызывающим веб-страницу, которая принимает только TLS1.2 с HttpClient. Фактически, если я принудительно TLS1.1, я получу The request was aborted: Could not create SSL/TLS secure channel..   -  person Panagiotis Kanavos    schedule 09.05.2017
comment
У нас была точно такая же проблема с подключением к Salesforce API, который недавно начал требовать TLS 1.2. Даже с .NET 4.6.1 мы все еще получали соединения TLS 1.0 (которые затем были отклонены). Пришлось вручную указать ServicePointManager.SecurityProtocol, как и вы. Я подозреваю, что проблема связана с тем, как Salesforce API автоматически согласовывает версию TLS.   -  person Neil Laslett    schedule 26.10.2017
comment
См. Мое решение здесь: stackoverflow.com/a/45442874/5785572   -  person Etienne Faucher    schedule 28.06.2018


Ответы (11)


У меня была аналогичная проблема, и это сработало для меня.

  1. откройте Powershell и проверьте поддерживаемые протоколы с помощью [Net.ServicePointManager]::SecurityProtocol

  2. Выполните следующие 2 командлета, чтобы установить . Ключи реестра сильной криптографии .NET Framework:

    установить надежную криптографию на 64-разрядной платформе .Net Framework (версия 4 и выше)

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

    установить надежную криптографию на 32-разрядной платформе .Net Framework (версия 4 и выше)

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

  3. Перезапустите Powershell и еще раз проверьте поддерживаемый протокол, используя [Net.ServicePointManager]::SecurityProtocol

Теперь он также должен отображать Tls12.

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

person Kartik Gupta    schedule 12.09.2017
comment
Это наверняка должно работать с кодом приложения .NET 4.x с установленным .NET 4.6+. - person user24601; 02.03.2018
comment
Сработало у меня - Спасибо! Кстати, если время, пожалуйста, добавьте обратную косую черту между Microsoft и .NetFramework для других: Set-ItemProperty -Path 'HKLM: \ SOFTWARE \ Microsoft \ .NetFramework \ v4.0.30319' -Name 'SchUseStrongCrypto' -Value '1' - Введите DWord .. Обе команды одинаковы. Возможно, на этот счет можно было бы сделать пометку. Еще раз спасибо. - person sean2078; 17.03.2018
comment
Спасибо за комментарии. 64-разрядная версия также должна включать ключ Wow6432node. Починю. - person user24601; 22.03.2018
comment
Мои последние два изменения не были приняты, но вы можете увидеть правильные значения ключей реестра в моем ответе ниже. - person user24601; 28.03.2018
comment
+1, исправили нашу проблему, у нас были вещи в 4.6, и проблема все еще существовала, вероятно, потому, что по умолчанию не было до 4.7. в некоторых других статьях в сети упоминалось, что обновление до версии 4.6 исправило это не для нас. спасибо за быстрое исправление powershell. +1 +1 +1 - person sonjz; 11.04.2018
comment
Несмотря на то, что на наших серверах установлен .Net 4.7, мне все же пришлось применить изменения, упомянутые в этом ответе, чтобы заставить его работать. - person Hoodlum; 11.07.2018
comment
Меня это тоже исправило. Я вызывал командлет C # dll через PowerShell, и это единственный способ заставить его работать. / потраченные впустую часы - person Omzig; 26.12.2018
comment
Не работает для меня на сервере Windows 2008, на котором установлено исправление TLS 1.2. Командная оболочка по-прежнему возвращает Ssl3, Tls - person xr280xr; 09.01.2019
comment
Работал на Windows Server 2016, .Net 4.6.2 после перезапуска IIS - спасибо! - person JGlass; 28.03.2019
comment
Обратите внимание, что для меня с установленным .NET 4.7.2 SecurityProtocol вернул SystemDefault как до, так и после выполнения двух команд. Однако это все еще работало! - person RichardM; 04.11.2019
comment
У меня были те же проблемы, и я просто попробовал эти шаги, но когда я выполняю [Net.ServicePointManager] :: SecurityProtocol после двух командлетов, я все еще вижу только ssl3 и tls. TLS12 там нет - person Walters; 11.08.2020

Как уже упоминалось другими, существует ряд ключей реестра Windows, которые необходимо настроить для включения TLS 1.2 в существующих приложениях .NET без явной установки версии протокола в коде приложения.

Чтобы сделать . Код .NET 4.x по умолчанию выбирает самый надежный из доступных протоколов (т. е. когда протокол не указан явно указанный в коде) необходимы следующие ключи реестра:

В 32-битной и 64-битной версиях Windows: HKLM\SOFTWARE\Microsoft\.NETFramework\v4.0.30319\SchUseStrongCrypto: 0X00000001

В 64-разрядных версиях Windows: HKLM\SOFTWARE\WOW6432Node\Microsoft\.NETFramework\v4.0.30319\SchUseStrongCrypto: 0X00000001

Значение WOW6432Node равно необходимо для включения TLS 1.2 в 32-битных приложениях при работе в 64-битных системах.

Но вот быстрое и простое решение: https://github.com/TheLevelUp/pos-tls-patcher

Обновление:

Если вы ориентируетесь на .NET 4.6 или 4.7, вас заинтересует Передовые методы обеспечения безопасности транспортного уровня (TLS) с .NET Framework.

Обратите внимание, что связанный выше TLS Patcher во многом соответствует рекомендациям Microsoft для существующих .NET 4.0 и 4.5. приложения, не предназначенные для .NET 4.6 или выше.

person user24601    schedule 02.03.2018
comment
Я думаю, это должен быть принятый ответ. Мы столкнулись с той же проблемой и наблюдали следующее: Обычный EXE EXE работает должным образом. Сборка, размещенная в собственном процессе (например, IIS, надстройка Office), использовала TLS 1.2, только если были выполнены настройки реестра. - person Stefan Egli; 08.03.2018
comment
@StefanEgli Я чувствую твою боль. Не уверен, почему эта информация не документирована лучше. Мы пытаемся рассказать об этом: blog.thelevelup.com/ pci-security-is-your-restaurant-ready - person user24601; 08.03.2018
comment
@StefanEgli также, если вы хотите использовать TLS 1.2 в собственном коде, вам также понадобится набор ключей реестра Schannel: docs.microsoft.com/en-us/windows-server/security/tls/ - person user24601; 08.03.2018
comment
Часть ключа \ 4.0.30319 неверна и должна быть \ v4.0.30319 - person Jake; 18.06.2019

Причина, по которой протокол безопасности не использует по умолчанию TLS 1.2, заключается в том, что в .NET Framework 4.6.1 для этого нет значения по умолчанию. Извините, если это повторяет то, что уже было сказано, но я хотел уточнить, и у меня недостаточно репутации, чтобы комментировать.

В 4.6.2 также нет значения по умолчанию, однако, как и один из упомянутых выше комментаторов, консольное приложение, похоже, по умолчанию использует TLS 1.2. Я пробовал тот же код в проекте веб-сайта, ориентированном на 4.6.2, и он НЕ по умолчанию использовал TLS 1.2.

4.7 и выше имеет значение по умолчанию SecurityProtocolType.SystemDefault.

«Это позволяет сетевым API .NET Framework на основе SslStream (например, FTP, HTTP и SMTP) наследовать протоколы безопасности по умолчанию от операционной системы или от любых пользовательских конфигураций, выполненных системным администратором»

https://docs.microsoft.com/en-us/dotnet/api/system.net.servicepointmanager.securityprotocol?view=netframework-4.7#System_Net_ServicePointManager_SecurityProtocol

person Gabe    schedule 20.12.2017

Мы столкнулись с аналогичной проблемой при размещении нашего приложения .NET 4.6.2 в IIS.

Мы могли бы решить проблему, добавив элемент httpRuntime в web.config. Без этого наша служба не использовала TLS 1.2 по умолчанию.

<httpRuntime targetFramework="4.6.2" />

Для получения дополнительной информации см. https://docs.microsoft.com/en-us/dotnet/api/system.web.configuration.httpruntimesection?view=netframework-4.7.2

person Tobias Schwarzinger    schedule 28.02.2019
comment
Хорошая находка! Это решило и для нас, поскольку у нас его не было. - person Philmatic; 10.01.2020

MSDN: Свойство ServicePointManager.SecurityProtocol

Это свойство выбирает версию протокола Secure Sockets Layer (SSL) или Transport Layer Security (TLS), которая будет использоваться для новых подключений, использующих только схему HTTPS; существующие соединения не изменяются. Обратите внимание, что для этого свойства специально не указано значение по умолчанию.

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

Взято из здесь

person Camille G.    schedule 09.05.2017
comment
Протокол безопасности по умолчанию для .NET 4.6.1 - это не TLS 1.2 - вы должны установить для него значение ServicePointManager.SecurityProtocol, чтобы добавить поддержку - person Camille G.; 09.05.2017
comment
Как это отвечает на вопрос? OP говорит, что TLS1.2 не работал, когда должен - person Panagiotis Kanavos; 09.05.2017
comment
Я понимаю вопрос, так как ничего не сделал и ожидал, что TLS 1.2 сработает - person Camille G.; 09.05.2017
comment
ответ не имеет отношения. Комментарий может быть, если он сопровождался ссылкой. В 4.6.2 TLS1.2 включен по умолчанию - person Panagiotis Kanavos; 09.05.2017
comment
Речь идет о .Net 4.6.1 - person Camille G.; 09.05.2017
comment
Да - откуда вы знаете, что 4.6.1 не включает TLS1.2 по умолчанию? Ответ в том виде, в каком он был опубликован, не говорит об этом. Скорее наоборот - он говорит, что 4.6+ по умолчанию будет использовать более сильный алгоритм. - person Panagiotis Kanavos; 09.05.2017
comment
@PanagiotisKanavos Я обновил процитированный отрывок из MSDN - person Camille G.; 09.05.2017
comment
@PanagiotisKanavos мы только что создали два новых экземпляра Windows Server 2016, обновили наш код до версии 4.6.2, но он все еще не использовал TLSv1.2, только после добавления двух записей в реестр и перезапуска IIS он начал использовать TLSv1.2 - person JGlass; 28.03.2019

Я тоже столкнулся с проблемой. Когда локальное приложение пыталось подключиться к серверу, поддерживающему TLS 1.1 и TLS 1.2, оно получало исключение «Существующее соединение было принудительно закрыто удаленным хостом» или когда TLS 1.1 / 1.2 не были включены должным образом, оно использовалось для получения исключения Win32Exception: Клиент и сервер не могут общаться, потому что у них нет общего алгоритма "

Ниже приведены все ключи и значения реестра, необходимые для 64-разрядной ОС Windows. Если у вас 32-битная ОС (x86), просто удалите последние 2 строки. TLS 1.0 будет отключен сценарием реестра. Требуется перезагрузка ОС.

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols]

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\SSL 2.0]

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\SSL 2.0\Client]
"DisabledByDefault"=dword:00000001
"enabled"=dword:00000000

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\SSL 2.0\server]
"disabledbydefault"=dword:00000001
"enabled"=dword:00000000

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\ssl 3.0]

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\ssl 3.0\client]
"disabledbydefault"=dword:00000001
"enabled"=dword:00000000

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\ssl 3.0\server]
"disabledbydefault"=dword:00000001
"enabled"=dword:00000000

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\tls 1.0]

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\tls 1.0\client]
"disabledbydefault"=dword:00000001
"enabled"=dword:00000000

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\tls 1.0\server]
"disabledbydefault"=dword:00000001
"enabled"=dword:00000000

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\tls 1.1]

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\tls 1.1\client]
"disabledbydefault"=dword:00000000
"enabled"=dword:00000001

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\tls 1.1\server]
"disabledbydefault"=dword:00000000
"enabled"=dword:00000001

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\tls 1.2]

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\tls 1.2\client]
"disabledbydefault"=dword:00000000
"enabled"=dword:00000001

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\tls 1.2\server]
"disabledbydefault"=dword:00000000
"enabled"=dword:00000001

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

[HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\.NETFramework\v4.0.30319]
"SchUseStrongCrypto"=dword:00000001
person Michael T.    schedule 24.07.2018

На основании следующей ссылки

https://docs.microsoft.com/en-us/dotnet/framework/network-programming/tls

я добавил

AppContext.SetSwitch("Switch.System.Net.DontEnableSystemDefaultTlsVersions", false);

в мой код, и это устранило проблему для меня. Это означает, что по умолчанию будет использоваться самый высокий уровень, поддерживаемый ОС, что является таким же поведением, которое вы получаете по умолчанию в версии 4.7 и выше.

person SirClutzz    schedule 06.02.2020

Я сделал следующие шаги, чтобы использовать последний протокол безопасности TLS v.1.2:

Отключите старые протоколы SSL2.0, SSL3.0, TLS1.0, TLS1.1, включите TLS1.2 и включите сильную криптографию для .NET Framework в реестре.

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\SSL 2.0\Server]
"DisabledByDefault"=dword:00000001
"Enabled"=dword:00000000

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\SSL 2.0\Client]
"DisabledByDefault"=dword:00000001
"Enabled"=dword:00000000

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\SSL 3.0\Server]
"DisabledByDefault"=dword:00000001
"Enabled"=dword:00000000

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\SSL 3.0\Client]
"DisabledByDefault"=dword:00000001
"Enabled"=dword:00000000

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.0\Server]
"DisabledByDefault"=dword:00000001
"Enabled"=dword:00000000

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.0\Client]
"DisabledByDefault"=dword:00000001
"Enabled"=dword:00000000

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.1\Server]
"DisabledByDefault"=dword:00000001
"Enabled"=dword:00000000

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.1\Client]
"DisabledByDefault"=dword:00000001
"Enabled"=dword:00000000

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.2\Server]
"DisabledByDefault"=dword:00000000
"Enabled"=dword:00000001

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.2\Client]
"DisabledByDefault"=dword:00000000
"Enabled"=dword:00000001

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

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework\v4.0.30319]
"SystemDefaultTlsVersions"=dword:00000001
"SchUseStrongCrypto"=dword:00000001
person yuro    schedule 30.01.2019

Я использовал это в своем коде на начальной странице. Приложение представляет собой веб-формы в VB.NET с .NET Framework 4.6.1.

System.Net.ServicePointManager.SecurityProtocol =  System.Net.SecurityProtocolType.Tls12
person Glada    schedule 07.03.2018
comment
Это фактически перезаписывает все другие версии, не говоря уже о том, что это не отвечает на вопрос. - person kuskmen; 08.03.2018
comment
Пожалуйста, не кодируйте протокол безопасности жестко в коде приложения. Вы хотите следовать рекомендациям в ответах выше, которые также встроены в Microsoft Рекомендации по TLS с .NET - person user24601; 16.03.2018
comment
Странный. У меня была база кода, начатая в Framework 3.5, которая разделяла dll как с веб-сайта, так и с .exe. DLL, веб-сайт и .exe были обновлены до Framework 4.6.2. .Exe работал нормально и использовал TLS 1.2. На сайте нет. Мне пришлось явно указать версию протокола в этом посте, чтобы сайт заработал. - person Matthew Allen; 07.05.2018

Я попробовал следующий код в своем api, который не работает для интеграции учетной записи Kaltura (поскольку Kaltura API обновлен до TLS 1.2), и он начал работать. .Net framework - это 4.5.2 и сервер: Windows Server 2008 R2, на котором размещено приложение.

#region To handle TLS (Transport Layer Security) Version and support
            var assembly = Assembly.GetExecutingAssembly();
            var attributes = assembly.GetCustomAttributes(typeof(TargetFrameworkAttribute), false);
            var version = (TargetFrameworkAttribute)attributes[0];

            SecurityProtocolType flag;
            if (Enum.TryParse("Tls11", out flag))
                ServicePointManager.SecurityProtocol |= flag;
            if (Enum.TryParse("Tls12", out flag))
                ServicePointManager.SecurityProtocol |= flag;
#endregion

Спасибо.

person Jayoti Parkash    schedule 23.09.2019

  1. Обновите Windows и WinHTTP
  2. Убедитесь, что TLS 1.2 включен в качестве протокола для SChannel на уровне операционной системы.
  3. Обновите и настройте .NET Framework для поддержки TLS 1.2.

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

person 윤두준    schedule 09.09.2020