По умолчанию SecurityProtocol в .NET 4.5

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

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

Есть ли способ изменить это значение по умолчанию, помимо изменения кода?

Наконец, поддерживает ли .NET 4.0 до TLS 1.0 ? т.е. мне нужно обновить клиентские проекты до версии 4.5 для поддержки TLS 1.2 .

Мотивация заключается в том, чтобы удалить поддержку SSLv3 на стороне клиента, даже если сервер поддерживает ее (у меня уже есть сценарий powershell, чтобы отключить это в реестре компьютеров) и поддерживать самый высокий протокол TLS, поддерживаемый сервером.

Обновление: глядя на class ServicePointManager в .NET 4.0 я не вижу перечислимых значений для TLS 1.0 и 1.1 . В .NET 4.0/4.5 по умолчанию используется SecurityProtocolType.Tls|SecurityProtocolType.Ssl3 . Надеюсь, это значение по умолчанию не будет SSLv3 отключив SSLv3 в реестре.

Тем не менее, я решил, что мне нужно обновить все приложения до .NET 4.5 и явно добавить SecurityProtocolType.Tls | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12; SecurityProtocolType.Tls | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12; в любом случае ко всему загрузочному коду всех приложений.

Это сделает исходящие запросы к различным apis и сервисам, чтобы не переходить на SSLv3 и должен выбрать самый высокий уровень TLS .

Является ли этот подход разумным или излишним? У меня много приложений для обновления, и я хочу, чтобы их будущие доказательства, так как я слышал, что даже TLS 1.0 может быть устаревшим в ближайшем будущем некоторыми провайдерами.

Как клиент, отправляющий исходящие запросы к API, отключает ли SSL3 в реестре даже в среде .NET? По умолчанию я вижу, что TLS 1.1 и 1.2 не включены, мы должны включить его через реестр? RE http://support.microsoft.com/kb/245030 .

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

Извините, что это сообщение превратилось в несколько вопросов, за которыми последовали ответы «возможно».

Некоторые из тех, кто оставляют комментарии, отметили, что установка System.Net.ServicePointManager.SecurityProtocol на определенные значения означает, что ваше приложение не сможет использовать будущие версии TLS, которые могут стать значениями по умолчанию для будущих обновлений .NET. Вместо указания фиксированного списка протоколов вы можете вместо этого включать или отключать протоколы, которые вы знаете и заботитесь, оставляя любые другие, как есть.

Чтобы включить TLS 1.1 и 1.2, не влияя на другие протоколы:

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

Обратите внимание на использование |= для включения этих флагов, не отключая других.

Чтобы отключить SSL3, не затрагивая другие протоколы:

 System.Net.ServicePointManager.SecurityProtocol &= ~SecurityProtocolType.Ssl3; 

По умолчанию System.Net.ServicePointManager.SecurityProtocol в .NET 4.0/4.5 является SecurityProtocolType.Tls|SecurityProtocolType.Ssl3 .

.NET 4.0 поддерживает до TLS 1.0 то время как .NET 4.5 поддерживает до TLS 1.2

Однако приложение, ориентированное на .NET 4.0 может поддерживать до TLS 1.2 если .NET 4.5 установлен в той же среде. .NET 4.5 устанавливается поверх .NET 4.0 , заменяя System.dll .

Я проверил это, соблюдая правильный протокол безопасности, установленный в трафике с помощью fiddler4 и вручную задав перечисленные значения в проекте .NET 4.0 :

 ServicePointManager.SecurityProtocol = (SecurityProtocolType)192 | (SecurityProtocolType)768 | (SecurityProtocolType)3072; 

Справка:

 namespace System.Net { [System.Flags] public enum SecurityProtocolType { Ssl3 = 48, Tls = 192, Tls11 = 768, Tls12 = 3072, } } 

Если вы попытаетесь взломать среду с установленным ТОЛЬКО .NET 4.0 , вы получите исключение:

Необработанное исключение: System.NotSupportedException: запрошенный протокол безопасности не поддерживается. в System.Net.ServicePointManager.set_SecurityProtocol (SecurityProtocolType v alue)

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

Поэтому я решил, что лучший способ удалить поддержку SSLv3 – это:

  1. Обновление всех приложений до .NET 4.5
  2. Добавьте следующий код расширения для переопределения стандартного и будущего подтверждения:

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

* Кто-то исправит меня, если этот хак неверен, но начальные тесты я вижу, что он работает

Вы можете переопределить поведение по умолчанию в следующем реестре:

 Key : HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework\v4.0.30319 Value: SchUseStrongCrypto Data : 1 

Для получения дополнительной информации см. Реализацию ServicePointManager .

Создайте текстовый файл с расширением .reg и следующим содержимым:

 Windows Registry Editor Version 5.00 [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 

Или загрузите его из следующего источника:

https://tls1test.salesforce.com/s/NET40-Enable-TLS-1_2.reg

Дважды щелкните, чтобы установить …

Я обнаружил, что, когда я укажу только TLS 1.2, он будет продолжать переговоры до 1.1. System.Net.ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;

Я указал это в методе запуска Global.asax для моего веб-приложения .net 4.5.

Механизм изменения реестра работал для меня после борьбы. Фактически моя заявка работала как 32bit. Поэтому мне пришлось изменить значение по пути.

 HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft.NETFramework\v4.0.30319 

Тип значения должен быть DWORD и значением выше 0. Использовать 1. Настройки реестра, чтобы получить приложение .Net 4.0, использует TLS 1.2 при условии, что .Net 4.5 установлен в машине.

У меня возникла проблема, когда мой клиент обновил TLS с 1.0 до 1.2. Мое приложение использует .net framework 3.5 и запускается на сервере. Поэтому я исправил это следующим образом:

  1. Исправить программу

Перед вызовом HttpWebRequest.GetResponse () добавьте эту команду:

 ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3 | SecurityProtocolType.Tls | SecurityProtocolTypeExtensions.Tls11 | SecurityProtocolTypeExtensions.Tls12; 

Расширения 2 библиотеки DLL, добавив 2 новых classа: System.Net и System.Security.Authentication

  namespace System.Net { using System.Security.Authentication; public static class SecurityProtocolTypeExtensions { public const SecurityProtocolType Tls12 = (SecurityProtocolType)SslProtocolsExtensions.Tls12; public const SecurityProtocolType Tls11 = (SecurityProtocolType)SslProtocolsExtensions.Tls11; public const SecurityProtocolType SystemDefault = (SecurityProtocolType)0; } } namespace System.Security.Authentication { public static class SslProtocolsExtensions { public const SslProtocols Tls12 = (SslProtocols)0x00000C00; public const SslProtocols Tls11 = (SslProtocols)0x00000300; } } 
  1. Обновление пакета Microsoft

Загрузите пакет:

  • Для Windows 2008 R2: windows6.1-kb3154518-x64.msu
  • Для Windows 2012 R2: windows8.1-kb3154520-x64.msu

Для загрузки партии и более подробной информации вы можете посмотреть здесь:

https://support.microsoft.com/en-us/help/3154518/support-for-tls-system-default-versions-included-in-the-.net-framework-3.5.1-on-windows-7 -sp1-и-сервер-2008-r2-sp1

Я работаю под .NET 4.5.2, и я не был доволен ни одним из этих ответов. Поскольку я говорю с системой, которая поддерживает TLS 1.2, и, увидев, что SSL3, TLS 1.0 и TLS 1.1 все повреждены и небезопасны для использования, я не хочу включать эти протоколы. В .NET 4.5.2 по умолчанию включены протоколы SSL3 и TLS 1.0, которые я вижу в коде, ServicePointManager.SecurityProtocol . В .NET 4.7 существует новый SystemDefault протокола SystemDefault , который явно передает выбор протокола для ОС, где я считаю, что полагаться на настройки реестра или других параметров конфигурации системы. Однако это не поддерживается в .NET 4.5.2. В интересах написания передового кода, который будет принимать правильные решения, даже если TLS 1.2 неизбежно нарушается в будущем или когда я обновляюсь до .NET 4.7+ и передаю больше ответственности за выбор подходящего протокола для ОС , Я принял следующий код:

 SecurityProtocolType securityProtocols = ServicePointManager.SecurityProtocol; if (securityProtocols.HasFlag(SecurityProtocolType.Ssl3) || securityProtocols.HasFlag(SecurityProtocolType.Tls) || securityProtocols.HasFlag(SecurityProtocolType.Tls11)) { securityProtocols &= ~(SecurityProtocolType.Ssl3 | SecurityProtocolType.Tls | SecurityProtocolType.Tls11); if (securityProtocols == 0) { securityProtocols |= SecurityProtocolType.Tls12; } ServicePointManager.SecurityProtocol = securityProtocols; } 

Этот код обнаружит, когда включен известный небезопасный протокол, и в этом случае мы удалим эти небезопасные протоколы. Если никаких других явных протоколов не останется, мы будем принудительно активировать TLS 1.2, как единственный известный защищенный протокол, поддерживаемый .NET на данный момент времени. Этот код является передовым, поскольку он будет учитывать новые типы протоколов, которые он не знает о том, чтобы быть добавленными в будущем, и он также будет хорошо SystemDefault с новым состоянием SystemDefault в .NET 4.7, то есть мне не придется повторно посетить этот код в будущем. Я настоятельно рекомендую использовать такой подход, а не жестко кодировать любые конкретные протоколы безопасности безоговорочно, иначе вам придется перекомпилировать и заменить своего клиента новой версией, чтобы перейти на новый протокол безопасности, когда TLS 1.2 неизбежно нарушается, или, скорее всего, вам придется оставить существующие небезопасные протоколы в течение многих лет на вашем сервере, что сделает вашу организацию целью для атак.

Следующий код:

  • протоколы с поддержкой печати
  • распечатать доступные протоколы
  • включите TLS1.2, если платформа поддерживает его, и если он не включен, чтобы начать с
  • отключить SSL3, если он включен
  • печать результата

Другие протоколы не будут затронуты. Это делает его совместимым с будущими протоколами (Tls1.3 и т. Д.).

Код

  Console.WriteLine("Runtime: " + System.Diagnostics.FileVersionInfo.GetVersionInfo(typeof(int).Assembly.Location).ProductVersion); Console.WriteLine("Enabled protocols: " + ServicePointManager.SecurityProtocol); Console.WriteLine("Available protocols: "); Boolean platformSupportsTls12 = false; foreach (SecurityProtocolType protocol in Enum.GetValues(typeof(SecurityProtocolType))) { Console.WriteLine(protocol.GetHashCode()); if (protocol.GetHashCode() == 3072){ platformSupportsTls12 = true; } } Console.WriteLine("Is Tls12 enabled: " + ServicePointManager.SecurityProtocol.HasFlag((SecurityProtocolType)3072)); // enable Tls12, if possible if (!ServicePointManager.SecurityProtocol.HasFlag((SecurityProtocolType)3072){ if (platformSupportsTls12){ Console.WriteLine("Platform supports Tls12, but it is not enabled. Enabling it now."); ServicePointManager.SecurityProtocol |= (SecurityProtocolType)3072; } else { Console.WriteLine("Platform does not supports Tls12."); } } if (ServicePointManager.SecurityProtocol.HasFlag(SecurityProtocolType.Ssl3)) { Console.WriteLine("Ssl3SSL3 is enabled. Disabling it now."); // disable SSL3. Has no negative impact if SSL3 is already disabled. The enclosing "if" if just for illustration. System.Net.ServicePointManager.SecurityProtocol &= ~SecurityProtocolType.Ssl3; } Console.WriteLine("Enabled protocols: " + ServicePointManager.SecurityProtocol); 

Вывод

48 – SSL3, 192 – TLS1, 768 – TLS1.1, 3072 – TLS1.2

 Runtime: 4.7.2114.0 Enabled protocols: Ssl3, Tls Available protocols: 0 48 192 768 3072 Is Tls12 enabled: False Platform supports Tls12, but it is not enabled. Enabling it now. Ssl3 is enabled. Disabling it now. Enabled protocols: Tls, Tls12 

Для полноты, вот сценарий Powershell, который устанавливает вышеупомянутые ключи реестра:

 new-itemproperty -path "HKLM:\SOFTWARE\Microsoft\.NETFramework\v4.0.30319" -name "SchUseStrongCrypto" -Value 1 -PropertyType "DWord"; new-itemproperty -path "HKLM:\SOFTWARE\Wow6432Node\Microsoft\.NETFramework\v4.0.30319" -name "SchUseStrongCrypto" -Value 1 -PropertyType "DWord" 

Решение BEST для этой проблемы, по-видимому, заключается в обновлении до, как минимум, .NET 4.6 или новее, которое автоматически выберет сильные протоколы, а также сильные шифры.

Если вы не можете выполнить обновление до .NET 4.6, совет настройки

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

И используя настройки реестра:

HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft.NETFramework \ v4.0.30319 – SchUseStrongCrypto = DWORD из 1 HKEY_LOCAL_MACHINE \ SOFTWARE \ Wow6432Node \ Microsoft.NETFramework \ v4.0.30319 – SchUseStrongCrypto = DWORD of 1

Результаты использования чего-то, кроме TLS 1.0, и сильного шифра.

В моем тестировании только настройка в Wow6432Node имела какое-то значение, хотя мое тестовое приложение было создано для Any CPU.

Альтернатива жесткому кодированию ServicePointManager.SecurityProtocol или явный ключ SchUseStrongCrypto, как указано выше:
Вы можете сказать .NET использовать настройки SCHANNEL по умолчанию с помощью ключа SystemDefaultTlsVersions,
например:

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

Для ключа: HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft.NETFramework \ v4.0.30319 Значение: SchUseStrongCrypto

Вы должны установить значение 1.

  • Самоподписанный SSL-прием на Android
  • Как установить разрешение на чтение файла закрытого ключа сертификата X.509 из .NET.
  • Предупреждения Firefox «Неверное подключение» при посещении уважаемых сайтов HTTPS при использовании учетной записи ребенка
  • Инициализация SSLContext
  • Как игнорировать создание пути PKIX не удалось: sun.security.provider.certpath.SunCertPathBuilderException?
  • Как сделать HTTPS POST с Android?
  • Не удалось добавить сертификат SSL при привязке к порту
  • Определение данных сертификата TLS с помощью Microsoft Edge
  • html5 Websocket с SSL
  • Как обрабатывать недопустимые SSL-сертификаты с помощью Apache HttpClient?
  • Сертификаты клиента Java через HTTPS / SSL
  • Давайте будем гением компьютера.