SecurityProtocol по умолчанию in.NET 4.5

каков протокол безопасности по умолчанию для связи с серверами, поддерживающими до TLS 1.2? Уилл!--2--> по умолчанию, выберите самый высокий протокола безопасности поддерживается на стороне сервера, или мне нужно явно добавить эту строку кода:

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

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

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

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

обновление: Глядя на 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; в любом случае ко всему загрузочному коду всех приложений.

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

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

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

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

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

13 ответов


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

чтобы включить 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 is 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 и настройка вручную перечислимые значения в :

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 установлен, вы получите исключение:

Необработанное Исключение: Система.NotSupportedException: запрошенный протокол безопасности не поддерживается. в системе.Чистая.Servicepointmanager и.set_SecurityProtocol(SecurityProtocolType в alue)

, я не рекомендую это " хак " с будущего патча и т. д. может сломать.*

поэтому я решил лучший маршрут для удаления поддержки SSLv3 - это:

  1. обновить все приложения к .NET 4.5
  2. добавьте следующее в код boostrapping, чтобы переопределить значение по умолчанию и будущее доказательство:

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

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


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

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.


создайте текстовый файл с .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;

Я указал это в глобальном.метод запуска asax для моего .net 4.5 web app.


механизм изменения реестра, работал для меня после борьбы. На самом деле мое приложение работало как 32bit. Поэтому мне пришлось изменить значение под path.

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.


у меня возникла проблема, когда мой клиент обновил 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 новых классов: System.Net и система.Безопасность.Проверка подлинности

    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.МГУ
  • для windows 2012 R2 при установке Windows8.1-kb3154520-х64.МГУ

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

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


Я работаю под .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 режим протокола, который явно передает выбор протокола в ОС, где я считаю, что полагаться на реестр или другие параметры конфигурации системы было бы уместно. Однако это, похоже, не поддерживается в .NET 4.5.2. В интересах написания кода, совместимого с forwards, который будет продолжать принимать правильные решения, даже когда 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 на данный момент. Этот код совместим с forwards, так как он будет учитывать новые типы протоколов, о которых он не знает в будущем, и он также будет хорошо играть с новым SystemDefault состояние в .NET 4.7, то есть мне не придется повторно посещать это код в будущем. Я настоятельно рекомендую принять такой подход, а не жестко кодировать какие-либо конкретные состояния протокола безопасности безоговорочно, иначе вам придется перекомпилировать и заменить своего клиента новой версией, чтобы перейти на новый протокол безопасности, когда TLS 1.2 неизбежно нарушается, или, скорее всего, вам придется оставить существующие небезопасные протоколы включенными в течение многих лет на вашем сервере, что сделает вашу организацию мишенью для атак.


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

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

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

код

        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"

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

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

система.Сеть.ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls11 / SecurityProtocolType.Tls12;

и использование реестра настройки:

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft.NETFramework\v4.0.30319-SchUseStrongCrypto = 1 слово HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft.NETFramework\v4.0.30319-SchUseStrongCrypto = DWORD of 1

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

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


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