По умолчанию 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 script, чтобы отключить это в реестре компьютеров) и поддерживать самый высокий протокол TLS, поддерживаемый сервером.

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

Однако я решил обновить все приложения до .NET 4.5 и явно добавить 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 (серверному подразделению) и браузерам (клиентский раздел).

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

Ответ 1

По умолчанию 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:

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

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

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

Ответ 2

Некоторые из тех, кто оставляют комментарии, отметили, что установка 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;

Ответ 3

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

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

а также

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

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

Ответ 4

Создайте текстовый файл с расширением .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

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

Ответ 5

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

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

Ответ 6

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

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

Тип значения должен быть DWORD и значением выше 0. Использовать беттер 1. Registry settings to get .Net 4.0 app use TLS 1.2 provided .Net 4.5 is installed in the machine.

Ответ 7

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

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

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

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

Расширения 2 библиотеки DLL, добавив 2 новых класса: 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
  • Для окон 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-and-server-2008-r2-sp1

Ответ 8

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

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

Константы:

  • 48 - это SSL3
  • 192 - это TLS1
  • 768 - это TLS1.1
  • 3072 - это TLS1.2

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

Код

// print initial status
    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.");
        }
    }

// disable ssl3
   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);

Выход

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

Ответ 9

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

Ответ 10

Microsoft недавно опубликовала лучшие практики вокруг этого. https://docs.microsoft.com/en-us/dotnet/framework/network-programming/tls

Резюме

Цель .Net Framework 4.7, удалить любой код, устанавливающий SecurityProtocol, таким образом, ОС обеспечит вам наиболее безопасное решение.

NB. Вам также необходимо убедиться, что в вашей ОС поддерживается и включена последняя версия TLS.

OS                          TLS 1.2 support

Windows 10                  \_ Supported, and enabled by default.
Windows Server 2016         /   
Windows 8.1                 \_ Supported, and enabled by default.
Windows Server 2012 R2      /
Windows 8.0                 \_ Supported, and enabled by default.
Windows Server 2012         /
Windows 7 SP1               \_ Supported, but not enabled by default*.
Windows Server 2008 R2 SP1  /
Windows Server 2008         -  Support for TLS 1.2 and TLS 1.1 requires an update. See Update to add support for TLS 1.1 and TLS 1.2 in Windows Server 2008 SP2.
Windows Vista               -  Not supported.

* To enable TLS1.2 via the registry see https://docs.microsoft.com/en-us/windows-server/security/tls/tls-registry-settings#tls-12 

    Path: HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS1.2\Server

        Property: Enabled
        Type: REG_DWORD
        Value: 1

        Property: DisabledByDefault 
        Type: REG_DWORD
        Value: 0

    Path: HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS1.2\Client

        Property: Enabled
        Type: REG_DWORD
        Value: 1

        Property: DisabledByDefault 
        Type: REG_DWORD
        Value: 0

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

Ответ 11

Для полноты, вот Powershell script, который устанавливает вышеупомянутые разделы реестра:

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"

Ответ 12

Альтернатива жесткому кодированию 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

Ответ 13

Лучшим решением этой проблемы является обновление до, как минимум,.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 of 1 HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft.NETFramework\v4.0.30319 - SchUseStrongCrypto = DWORD of 1

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

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

Ответ 14

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

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