Бөлісу құралы:


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

Примечание.

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

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

Что такое TLS?

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

RFC8996 объявил о прекращении поддержки TLS 1.0 и 1.1. В этом документе рассматриваются только 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 или более поздней версии. Проверьте раздел Audit your code, чтобы узнать, как проверить ваш target framework.
  • Не указывайте версию TLS явно, т. е. не используйте перегрузку метода SslStream с явным параметром SslProtocols.
    • Таким образом ваш код позволит ОС решить версию TLS.
    • Если необходимо задать ServicePointManager.SecurityProtocol, задайте для него значение SecurityProtocolType.SystemDefault. Это также будет использовать настройки ОС по умолчанию.
    • Если вы должны использовать перегрузки метода SslStream, которые принимают явный параметр SslProtocols, то передайте SslProtocols.SystemDefault в качестве аргумента. Это также будет использовать настройки ОС по умолчанию.
  • Выполните тщательный аудит кода, чтобы убедиться, что вы не указываете версию TLS или SSL явным образом.

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

Не используйте SslProtocols.Default, так как он задает версию TLS для SSL3 и TLS 1.0, которые устарели.

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

  • Он автоматически использует новые протоколы TLS, добавленные в будущем.
  • ОС блокирует протоколы, обнаруженные не защищенными (например, SSL3 и TLS 1.0).

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

Если не удается явно указать версию протокола, настоятельно рекомендуется указать TLS 1.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 Лучшие практики по Transport Layer Security (TLS) с .NET Framework.

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

Для приложений 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)

В следующих разделах показано, как настроить приложение для использования "текущих защищенных версий" TLS (а именно TLS 1.2 и TLS 1.3), если оно предназначено для .NET Framework 4.7 или более поздней версии.

Для HttpClient и HttpWebRequest

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

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

Для SslStream

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

В следующих разделах показано, как настроить приложение для использования "текущих защищенных версий" 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.

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

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

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

Switch.System.Net.DontEnableSchUseStrongCrypto

Задайте для false значение Switch.System.Net.DontEnableSchUseStrongCrypto, чтобы в приложении использовалось устойчивое шифрование. Значение 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.

Настройка протоколов 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

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

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