Рекомендации по использованию протокола TLS с .NET Framework

Примечание.

Эта страница содержит сведения платформа .NET Framework TLS. Если вы ищете сведения о TLS .NET, ознакомьтесь с рекомендациями по протоколу TLS/SSL.

платформа .NET Framework поддерживает использование протокола TLS для защиты сетевого взаимодействия.

Что такое TLS?

Предупреждение

ПРОТОКОЛ TLS 1.0 и 1.1 устарел RFC8996. В этом документе рассматриваются только TLS 1.2 и TLS 1.3.

Протокол TLS — это последняя версия стандарта, предназначенная для защиты конфиденциальности информации, переданной через Интернет. TLS 1.3 — это стандарт, обеспечивающий улучшения безопасности по сравнению с предыдущими версиями. В этой статье приводятся рекомендации по защите приложений .NET Framework, в которых используется протокол TLS.

Кто может воспользоваться этим документом?

Поддержка TLS в платформа .NET Framework

Так как платформа .NET Framework зависит от Schannel Windows, какие версии могут быть согласованы, и какая версия будет использоваться, зависит от операционной системы.

Ниже приведена обновленная таблица с самой высокой поддерживаемой версией TLS для различных сочетаний версий операционной системы и платформа .NET Framework целевых версий:

целевая версия платформа .NET Framework Windows 10 Windows 11
3.5 TLS 1.2 TLS 1.2
4.6.2 TLS 1.2 TLS 1.3
4,7 TLS 1.2 TLS 1.3
4.7.1 TLS 1.2 TLS 1.3
4.7.2 TLS 1.2 TLS 1.3
4,8 TLS 1.2 TLS 1.3
4.8.1 TLS 1.2 TLS 1.3

Дополнительные сведения см. в статье о поддержке версий протокола TLS в Schannel.

Рекомендации

  • Для использования TLS 1.3 укажите целевую платформу .NET Framework 4.8 или более поздней версии.
  • Не указывайте версию TLS явным образом. Настройте в коде возможность использовать версию TLS, поддерживаемую операционной системой.
  • Выполните тщательный аудит кода, чтобы убедиться, что вы не указываете версию TLS или SSL явным образом.
  • Не используйте SslProtocols.Default. (SslProtocols.Default указывает версию SSL3 и TLS1.0, которая устарела.)

Если приложение разрешает операционной системе выбрать версию TLS:

  • Он автоматически использует новые протоколы, добавленные в будущем.
  • операционная система будет блокировать протоколы, которые считаются небезопасными.

Сведения об обновлении и проведении аудита кода см. в разделе Аудит и изменение кода.

В этой статье объясняется, как включить самую надежную безопасность, доступную для версии платформа .NET Framework, на которую предназначено ваше приложение и на котором выполняется. Если в приложении явно задан протокол безопасности и его версия, это означает отказ от альтернативных вариантов и стандартного поведения .NET Framework и операционной системы. Если вы хотите, чтобы приложение могло согласовывать подключение TLS 1.3, явно устанавливая более низкую версию TLS, запрещает подключение TLS 1.3.

Если не удается явно указать версию протокола, настоятельно рекомендуется указать TLS1.2 или TLS 1.3 (то есть currently considered secure). Чтобы получить рекомендации по определению и удалению зависимостей TLS 1.0, скачайте технический документ Solving the TLS 1.0 Problem (Устранение проблем с TLS 1.0).

WCF поддерживает TLS 1.2 в качестве значения по умолчанию в платформа .NET Framework 4.7. Начиная с .NET Framework 4.7.1, WCF использует версию, поддерживаемую операционной системой по умолчанию. Если в приложении явно задан параметр SslProtocols.None, для протокола транспортировки NetTCP в службе WCF используются настройки операционной системы по умолчанию.

Вопросы по этому документу можно задать на странице версии документа, опубликованной на GitHub.

Аудит и изменение кода

Для ASP.NET приложений проверьте <system.web><httpRuntime targetFramework> элемент web.config, чтобы убедиться, что вы используете целевую версию платформа .NET Framework.

Для приложений Windows Forms и других приложений см. статью Практическое руководство. Определение целевой версии .NET Framework.

Ознакомьтесь со следующими разделами, чтобы проверить, не используются ли определенные версии TLS или SSL.

Если необходимо явно задать протокол безопасности

Если необходимо явно задать протокол безопасности вместо разрешения .NET или ОС выбрать протокол безопасности, выберите следующие протоколы:

  • Для платформа .NET Framework 3.5: TLS 1.2
  • Для платформа .NET Framework 4.6.2 или более поздней версии: TLS 1.3

Если не удается найти указанные протоколы в перечислении, их можно добавить в виде файла расширения. См. ниже:

SslProtocolExtensions.cs

namespace System.Security.Authentication
{
    public static class SslProtocolsExtensions
    {
        // For .NET Framework 3.5
        public const SslProtocols Tls12 = (SslProtocols)3072;
        // For .NET Framework 4.6.2 and later
        public const SslProtocols Tls13 = (SslProtocols)12288;
    }
}

SecurityProtocolExtensions.cs

using System.Security.Authentication;

namespace System.Net
{
    public static class SecurityProtocolTypeExtensions
    {
        // For .NET Framework 3.5
        public const SecurityProtocolType Tls12 = (SecurityProtocolType)SslProtocolsExtensions.Tls12;
        // For .NET Framework 4.6.2 and later
        public const SecurityProtocolType Tls13 = (SecurityProtocolType)SslProtocolsExtensions.Tls13;
    }
}

Дополнительные сведения см. в статье Support for TLS System Default Versions included in .NET Framework 3.5 on Windows 8.1 and Windows Server 2012 R2 (Добавлена поддержка версий TLS по умолчанию для .NET Framework 3.5 в системе Windows 8.1 и Windows Server 2012 R2)

Для api System.Net (HttpClient, SslStream)

Приложение предназначено для .NET Framework 4.7 или более поздней версии

В следующих разделах показано, как настроить приложение для использования currently considered secure versions TLS. (TLS 1.2, TLS 1.3)

Для HttpClient и HttpWebRequest

ServicePointManager, используя .NET Framework 4.7 и более поздних версий, будет использоваться протокол безопасности по умолчанию, настроенный в ОС. Чтобы получить выбор ОС по умолчанию, если это возможно, не устанавливайте значение для свойства ServicePointManager.SecurityProtocol, которое по умолчанию равно SecurityProtocolType.SystemDefault.

Поскольку параметр SecurityProtocolType.SystemDefault предполагает ServicePointManager использование протокола безопасности по умолчанию, настроенного операционной системой, ваше приложение может работать по-разному в зависимости от ОС, в которой оно запущено. Например, Windows 10 использует TLS 1.2, а Windows 11 использует TLS 1.3.

Для SslStream

SslStream (для .NET Framework 4.7 и более поздних версий): по умолчанию операционная система выбирает подходящий протокол безопасности и его версию. Чтобы получить подходящую для ОС версию, по возможности не используйте перегрузки метода SslStream, который явно задает параметр SslProtocols. В противном случае передайте значение SslProtocols.None. Мы не рекомендуем устанавливать значение Default. Заданный параметр SslProtocols.Default принудительно применяет SSL 3.0 или TLS 1.0 и препятствует использованию TLS 1.2.

Не устанавливайте значение для свойства SecurityProtocol (при сетевом подключении по протоколу HTTP).

Не используйте перегрузки метода SslStream, который явно задает параметр SslProtocols (при сетевом подключении через сокеты TCP). Если для приложения нужно изменить целевую версию на .NET Framework 4.7 или более позднюю версию, ознакомьтесь со следующими рекомендациями.

Для приложений WCF

Приложение предназначено для .NET Framework 4.7 или более поздней версии

В следующих разделах показано, как настроить приложение для использования currently considered secure versions TLS. (TLS 1.2, TLS 1.3)

Использование транспорта TCP с использованием безопасности транспорта с учетными данными сертификата

WCF использует тот же сетевой стек, что и остальная часть платформа .NET Framework.

Если вы нацелены на 4.7.1, WCF настроена, чтобы разрешить ОС выбрать лучший протокол безопасности по умолчанию, если только явно не настроено:

  • в файле конфигурации приложения;
  • или в исходном коде приложения.

По умолчанию платформа .NET Framework версии 4.7 и более поздних версий настроены для использования TLS 1.2 и разрешать подключения с помощью TLS 1.1 или TLS 1.0. Настройте в WCF выбор подходящего протокола безопасности операционной системой, настроив привязку на использование SslProtocols.None. Это можно задать для SslProtocols. SslProtocols.None можно получить из Transport. NetTcpSecurity.Transport можно получить из Security.

При использовании пользовательской привязки сделайте следующее:

  • Настройте в WCF выбор подходящего протокола безопасности операционной системой, указав SslProtocols использовать SslProtocols.None.
  • Или настройте протокол, используемый с путем конфигурации system.serviceModel/bindings/customBinding/binding/sslStreamSecurity:sslProtocols.

Если вы не применяете пользовательскую привязку, но устанавливаете привязку WCF с помощью конфигурации, задайте протокол, используемый с путем конфигурации system.serviceModel/bindings/netTcpBinding/binding/security/transport:sslProtocols.

Использование безопасности сообщений с учетными данными сертификата

платформа .NET Framework версии 4.7 и более поздних версий по умолчанию используют протокол, указанный в свойствеSecurityProtocol. Если для AppContextSwitchSwitch.System.ServiceModel.DisableUsingServicePointManagerSecurityProtocols задано значение true, WCF выбирает подходящий протокол до TLS 1.0.

Приложение предназначено для более ранней версии, чем.NET Framework 4.7

В следующих разделах показано, как настроить приложение для использования currently considered secure versions TLS. (TLS 1.2, TLS 1.3)

Использование платформа .NET Framework 4.6.2 с использованием безопасности транспорта TCP с учетными данными сертификата

Платформа WCF автоматически выбирает протокол последней версии до TLS 1.2, если версия протокола не указана явно. Дополнительные сведения см. в предыдущем разделе Для TCP-транспорта WCF с использованием защиты транспорта с помощью учетных данных сертификата.

Использование платформа .NET Framework 3.5 с использованием безопасности транспорта TCP с учетными данными сертификата

Эти версии платформы WCF явно указываются для использования значений SSL 3.0 и TLS 1.0. Эти значения невозможно изменить. Для использования TLS 1.2 необходимо обновить и перенацелить на NET Framework 4.6.2 или более поздние версии.

Настройка безопасности с помощью коммутаторов AppContext (для платформа .NET Framework версии 4.6.2 или более поздней версии)

Параметры AppContext, описанные в этом разделе, важны, если приложение предназначено или работает в платформа .NET Framework версии 4.6.2 или более поздних версий. По возможности явно укажите для параметров значение false или оно должно быть задано по умолчанию. Чтобы настроить безопасность с помощью одного или обоих параметров, не указывайте значение протокола безопасности в коде, так как это переопределит значения параметров.

Для api System.Net (HttpClient, SslStream)

Функции этих параметров одинаковы как для сетевых подключений по протоколу HTTP (ServicePointManager), так и через сокеты TCP (SslStream).

Switch.System.Net.DontEnableSchUseStrongCrypto

Задайте для Switch.System.Net.DontEnableSchUseStrongCrypto значение false, чтобы в приложении использовалось устойчивое шифрование. Значение false для DontEnableSchUseStrongCrypto использования более безопасных сетевых протоколов (TLS 1.2 и TLS 1.1) и блокирует протоколы, которые не защищены. Дополнительные сведения см. в разделе о флаге SCH_USE_STRONG_CRYPTO. Значение true позволяет отключить устойчивое шифрование для приложения. Этот параметр влияет только на клиентские (исходящие) подключения в приложении.

Если приложение предназначено для платформа .NET Framework версии 4.6.2 или более поздних версий, этот параметр по умолчанию используетсяfalse. Мы рекомендуем использовать эти безопасные настройки по умолчанию. Если приложение работает на платформа .NET Framework 4.6.2, но предназначено для более ранней версии, параметр по умолчанию используетсяtrue. В этом случае нужно явно задать значение false.

Если нужно установить подключение к устаревшим службам без поддержки устойчивого шифрования и возможности обновления, для параметра DontEnableSchUseStrongCrypto нужно задать только значение true.

Switch.System.Net.DontEnableSystemDefaultTlsVersions

Если для false задать значение Switch.System.Net.DontEnableSystemDefaultTlsVersions, приложение разрешит операционной системе выбирать протокол. Если задать значение true, приложение будет использовать протоколы, выбранные платформой .NET Framework.

Если приложение предназначено для .NET Framework 4.7 или более поздних версий, по умолчанию для параметра задано значение false. Мы рекомендуем использовать эти безопасные настройки по умолчанию. Если приложение запускается на .NET Framework 4.7 или более поздних версиях, но предназначено для более ранней версии, по умолчанию для параметра задано значение true. В этом случае нужно явно задать значение false.

Для приложений WCF

Switch.System.ServiceModel.DisableUsingServicePointManagerSecurityProtocols

Задайте для Switch.System.ServiceModel.DisableUsingServicePointManagerSecurityProtocols значение false, чтобы приложение использовало значение, определенное в свойстве ServicePointManager.SecurityProtocols, для защиты передаваемых сообщений с помощью учетных данных сертификата. Если задать значение true, будет использоваться последняя доступная версия протокола до TLS 1.0.

Если приложение предназначено для .NET Framework 4.7 или более поздних версий, по умолчанию для параметра задано значение false. Если приложение предназначено для .NET Framework 4.6.2 и более ранних версий, по умолчанию для параметра задано значение true.

Switch.System.ServiceModel.DontEnableSystemDefaultTlsVersions

Если задать для Switch.System.ServiceModel.DontEnableSystemDefaultTlsVersions значение false, в конфигурации по умолчанию операционной системе разрешается выбирать протокол. Если задать значение true, по умолчанию будет использоваться последняя доступная версия протокола до TLS 1.2.

Если приложение предназначено для .NET Framework 4.7.1 или более поздних версий, по умолчанию для параметра задано значение false. Если приложение предназначено для .NET Framework 4.7 и более ранних версий, по умолчанию для параметра задано значение true.

Дополнительные сведения о протоколах TLS см. в статье Устранение рисков. Протоколы TLS. Дополнительные сведения о параметрах AppContext см. в статье об элементе <AppContextSwitchOverrides> Element.

Настройка безопасности с помощью реестра Windows

Предупреждение

Настройка раздела реестра влияет на все приложения в системе. Используйте этот вариант только в том случае, если компьютер находится полностью под вашим управлением и вы контролируете изменения в реестре.

Если невозможно задать один или оба параметра AppContext, вы можете управлять протоколами безопасности, которые использует приложение, с помощью разделов реестра Windows, описанных в этом разделе. Возможно, вы не сможете использовать один или оба AppContext параметра, если приложение работает на платформа .NET Framework 3.5 или не сможете изменить файл конфигурации. Чтобы настроить безопасность с помощью реестра, не указывайте значение протокола безопасности в коде, так как это переопределит параметры в реестре.

Имена разделов реестра схожи с соответствующими именами параметров AppContext, но не содержат DontEnable в начале имени. Например, параметру AppContextDontEnableSchUseStrongCrypto соответствует раздел реестра SchUseStrongCrypto.

Эти ключи доступны во всех платформа .NET Framework версиях.

Функции описанных здесь разделов реестра одинаковы как для сетевых подключений по протоколу HTTP (ServicePointManager), так и через сокеты TCP (SslStream).

SchUseStrongCrypto

Запись HKEY_LOCAL_MACHINE\SOFTWARE\[Wow6432Node\]Microsoft\.NETFramework\<VERSION>: SchUseStrongCrypto реестра имеет значение типа DWORD. Задайте значение 1, чтобы в приложении использовалось устойчивое шифрование. В строгой криптографии используются более безопасные сетевые протоколы (TLS 1.2 и TLS 1.1) и блокируются протоколы, которые не защищены. Если задать значение 0, устойчивое шифрование будет отключено. Дополнительные сведения см. в разделе о флаге SCH_USE_STRONG_CRYPTO. Этот параметр реестра влияет только на клиентские (исходящие) подключения в приложении.

Если приложение предназначено для .NET Framework 4.6 или более поздних версий, по умолчанию в реестре задано значение 1. Мы рекомендуем использовать эти безопасные настройки по умолчанию. Если приложение предназначено для .NET Framework 4.5.2 или более ранней версии, по умолчанию для ключа задано значение 0. В этом случае нужно явно задать значение 1.

Если нужно установить подключение к устаревшим службам без поддержки устойчивого шифрования и возможности обновления, в реестре нужно задать только значение 0.

SystemDefaultTlsVersions

Запись HKEY_LOCAL_MACHINE\SOFTWARE\[Wow6432Node\]Microsoft\.NETFramework\<VERSION>: SystemDefaultTlsVersions реестра имеет значение типа DWORD. Если задать значение 1, приложение разрешит операционной системе выбирать протокол. Если задать значение 0, приложение будет использовать протоколы, выбранные платформой .NET Framework.

Вместо <VERSION> нужно указать значение v4.0.30319 (для .NET Framework 4 и более поздних версий) или v2.0.50727 (для .NET Framework 3.5).

Если приложение предназначено для .NET Framework 4.7 или более поздних версий, по умолчанию в разделе задано значение 1. Мы рекомендуем использовать эти безопасные настройки по умолчанию. Если приложение предназначено для .NET Framework 4.6.1 или более ранней версии, по умолчанию для ключа задано значение 0. В этом случае нужно явно задать значение 1.

Дополнительные сведения см. в статье Cumulative Update for Windows 10 Version 1511 and Windows Server 2016 Technical Preview 4: May 10, 2016 (Накопительный пакет обновления для Windows 10 версии 1511 и Windows Server 2016 Technical Preview 4 за 10 мая 2016 г.)

Дополнительные сведения о .NET Framework 3.5.1 см. в статье Support for TLS System Default Versions included in .NET Framework 3.5.1 on Windows 7 SP1 and Server 2008 R2 SP1 (Добавлена поддержка версий TLS по умолчанию для .NET Framework 3.5.1 в системе Windows 7 с пакетом обновления 1 (SP1) и Server 2008 R2 с пакетом обновления 1 (SP1).)

Ниже приведено следующее . REG-файл задает записи реестра и их варианты в наиболее безопасных значениях:

Windows Registry Editor Version 5.00

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

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

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework\v2.0.50727]
"SystemDefaultTlsVersions"=dword:00000001
"SchUseStrongCrypto"=dword:00000001

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

Настройка протоколов Schannel в реестре Windows

Вы можете использовать реестр для точного управления протоколами, которые согласовывает клиент или серверное приложение. Сеть приложения проходит через Schannel (это другое имя для Secure Channel). Используя Schannel, вы можете настроить поведение приложения.

Для начала перейдите в раздел реестра HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols. Под этим ключом можно создать все вложенные ключи в наборе TLS 1.2. TLS 1.3 В каждом подразделе можно создать подраздел Client и (или) Server. В подразделах Client и Server вы можете создать значения DWORD для DisabledByDefault (0 или 1) и для Enabled (0 или 1).

Дополнительные сведения см. в статье "Реестр TLS" Параметры — Schannel

Флаг SCH_USE_STRONG_CRYPTO

Если он включен (по умолчанию, AppContext коммутатором или реестром Windows), платформа .NET Framework использует SCH_USE_STRONG_CRYPTO флаг, когда приложение инициирует подключение TLS к серверу. платформа .NET Framework передает флаг, чтобы Schannel указать ему отключить известные слабые криптографические алгоритмы, наборы шифров и версии протокола TLS/SSL, которые могут быть включены в противном случае для улучшения взаимодействия. Дополнительные сведения см. в разделе:

Флаг SCH_USE_STRONG_CRYPTO также передается Schannel для клиентских (исходящих) подключений при явном использовании Tls11 или Tls12 перечисления значений SecurityProtocolType или SslProtocols. Флаг SCH_USE_STRONG_CRYPTO используется только для подключений, в которых приложение выступает за роль клиента. Вы можете отключить слабые протоколы и алгоритмы, когда приложения действуют на сервере, настроив параметры реестра на уровне Schannel компьютера.