Рекомендации по использованию протокола 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.
Кто может воспользоваться этим документом?
- использующих API-интерфейсы System.Net напрямую (например, System.Net.Http.HttpClient и System.Net.Security.SslStream);
- использующих клиенты и службы WCF с пространством имен System.ServiceModel напрямую;
Поддержка 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 или более поздней версии. Проверьте, как проверить ваш
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.
Аудит и изменение кода
Для 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. Если для AppContextSwitch Switch.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
в начале имени. Например, параметру AppContext
DontEnableSchUseStrongCrypto
соответствует раздел реестра 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, которые могут быть включены в противном случае для улучшения взаимодействия. Дополнительные сведения см. в разделе:
- Secure Channel
- SCHANNEL_CRED structure (Структура SCHANNEL_CRED)
Флаг SCH_USE_STRONG_CRYPTO
также передается Schannel
для клиентских (исходящих) подключений при явном использовании Tls11
или Tls12
перечисления значений SecurityProtocolType или SslProtocols. Флаг SCH_USE_STRONG_CRYPTO
используется только для подключений, в которых приложение выступает за роль клиента. Вы можете отключить слабые протоколы и алгоритмы, когда приложения действуют на сервере, настроив параметры реестра на уровне Schannel
компьютера.