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

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

Чтобы обеспечить безопасность приложений .NET Framework, не указывайте версию TLS в коде. Приложения .NET Framework должны использовать ту версию TLS, которую поддерживает операционная система.

Этот документ предназначен для следующих разработчиков:

Мы рекомендуем следующее:

  • Использовать целевую версию .NET Framework 4.7 или более поздние версии в приложениях. Использовать целевую версию .NET Framework 4.7.1 или более поздние версии в приложениях WCF.
  • Не указывать версию TLS. Настройте в коде возможность использовать версию TLS, поддерживаемую операционной системой.
  • Проведите тщательный аудит кода и убедитесь, что версия TLS или SSL не задана.

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

  • в приложении автоматически будут использоваться новые протоколы, которые появятся в будущем (например, TLS 1.3.);
  • операционная система будет блокировать протоколы, которые считаются небезопасными.

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

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

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

По умолчанию WCF поддерживает на платформе .NET Framework 4.7 версии TLS 1.0, 1.1 и 1.2. Начиная с .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 Framework 4.7 или более поздней версии

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

Для сетевых подключений по протоколу HTTP

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

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

Остальная часть этой статьи не актуальна, если для сетевых подключений по протоколу HTTP используется целевая версия .NET Framework 4.7 или более поздняя версия.

Для сетевого подключения через сокеты TCP

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

Остальная часть этой статьи не актуальна, если для подключений через сокеты TCP используется целевая версия .NET Framework 4.7 или более поздняя версия.

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

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.

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

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

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

Проведите аудит кода, чтобы проверить, не задана ли определенная версия TLS или SSL, выполнив инструкции в следующих разделах:

Для .NET Framework 4.6–4.6.2 (не для WFC)

Задайте для параметра DontEnableSystemDefaultTlsVersions AppContext значение false. Дополнительные сведения см. в разделе Настройка безопасности с помощью параметров AppContext.

Для WCF на .NET Framework 4.6–4.6.2 с использованием защиты транспорта TCP с помощью учетных данных сертификата

Нужно установить последние пакеты обновления операционной системы. Дополнительные сведения см. в разделе Обновление системы безопасности.

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

Для .NET Framework 3.5–4.5.2 (не для WFC)

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

В разделах реестра SchUseStrongCrypto и SystemDefaultTlsVersions задайте значение 1. Сведения см. в разделе Настройка безопасности в реестре Windows. Платформа .NET Framework версии 3.5 поддерживает флаг SchUseStrongCrypto, только если значение TLS передается явно.

Если приложение запущено на .NET Framework 3.5, установите пакет обновлений, чтобы программа могла указать версию TLS 1.2.

KB3154518 Пакет исправлений HR-1605 для повышения надежности —добавлена поддержка версий TLS по умолчанию для .NET Framework 3.5.1 в системе Windows 7 с пакетом обновления 1 (SP1) и Server 2008 R2 с пакетом обновления 1 (SP1).
KB3154519 Пакет исправлений HR-1605 для повышения надежности — добавлена поддержка версий TLS по умолчанию для .NET Framework 3.5 в системе Windows Server 2012.
KB3154520 Пакет исправлений HR-1605 для повышения надежности — добавлена поддержка версий TLS по умолчанию для .NET Framework 3.5 в системе Windows 8.1 и Windows Server 2012 R2.
KB3156421 Пакет исправлений 1605 (3154521) для .NET Framework 4.5.2 и 4.5.1 в Windows

Для WCF на платформе .NET Framework 3.5–4.5.2 с использованием защиты транспорта TCP с помощью учетных данных сертификата

В этих версиях платформы WCF явно задано использование SSL 3.0 и TLS 1.0. Эти значения невозможно изменить. Чтобы использовать TLS 1.1 и 1.2, необходимо выполнить обновление и переопределение для .NET Framework 4.6 или более поздних версий.

Приложение предназначено для .NET Framework 3.5

Если нужно явно указать протокол безопасности вместо того, чтобы разрешить .NET или операционной системе выбирать его, добавьте перечисления SecurityProtocolTypeExtensions и SslProtocolsExtension в код. Перечисления SecurityProtocolTypeExtensions и SslProtocolsExtension включают значения для Tls12, Tls11 и значение SystemDefault. Дополнительные сведения см. в статье 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)

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

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

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

Switch.System.Net.DontEnableSchUseStrongCrypto

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

Если приложение предназначено для .NET Framework 4.6 или более поздней версии, по умолчанию для параметра задано значение false. Мы рекомендуем использовать эти безопасные настройки по умолчанию. Если приложение запускается на .NET Framework 4.6, но предназначено для более ранней версии, значение параметра по умолчанию — 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.

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. Дополнительные сведения о параметрах AppContext см. в статье об элементе <AppContextSwitchOverrides> Element.

Настройка безопасности в реестре Windows

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

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

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

Имена разделов реестра схожи с соответствующими именами параметров 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 и TLS 1.0) и блокируются небезопасные. Если задать значение 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.

См. дополнительные сведения о накопительном пакете обновления для 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. В нем вы можете создать любые подразделы из набора SSL 2.0, SSL 3.0, TLS 1.0, TLS 1.1 и TLS 1.2. В каждом подразделе можно создать подраздел Client и (или) Server. В подразделах Client и Server вы можете создать значения DWORD для DisabledByDefault (0 или 1) и для Enabled (0 или 1).

Флаг SCH_USE_STRONG_CRYPTO

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

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

Обновление системы безопасности

Рекомендации в этой статье зависят от последних обновлений системы безопасности, которые вы установили. Эти обновления позволяют использовать дополнительные функции .NET Framework 4.7 и более поздних версий. Последние обновления системы безопасности особенно важны для приложений, запущенных на .NET Framework 4.7 и более поздних версиях (даже если приложения предназначены для более ранних версий).

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

См. также:

Поддержка TLS 1.2

Чтобы приложение могло согласовать протокол TLS 1.2, операционная система и версия платформы .NET Framework должны поддерживать этот протокол.

Требования к операционной системе для поддержки протокола TLS 1.2

Чтобы включить или повторно включить протокол TLS 1.2 и (или) TLS 1.1, в системе, которая их поддерживает, ознакомьтесь со статьей Transport Layer Security (TLS) registry settings (Параметры реестра для протокола TLS).

Операционная система Поддержка TLS 1.2
Windows 10
Windows Server 2016
Поддерживается и включена по умолчанию.
Windows 8.1
Windows Server 2012 R2
Поддерживается и включена по умолчанию.
Windows 8.0
Windows Server 2012
Поддерживается и включена по умолчанию.
Windows 7 SP1
Windows Server 2008 R2 с пакетом обновления 1 (SP1)
Поддерживается, но не включена по умолчанию. Сведения о том, как включить TLS 1.2 см. на веб- странице Transport Layer Security (TLS) registry settings (Параметры реестра для протокола TLS).
Windows Server 2008 Для поддержки TLS 1.2 и TLS 1.1 требуется обновить систему. Дополнительные сведения см. в статье Update to add support for TLS 1.1 and TLS 1.2 in Windows Server 2008 SP2 (Обновление для добавления поддержки TLS 1.1 и TLS 1.2 в Windows Server 2008 с пакетом обновления 2 (SP2)).
Windows Vista Не поддерживается.

Сведения о том, какие версии протоколов TLS или SSL включены в версиях Windows, см. в статье Protocols in TLS/SSL (Schannel SSP) (Протоколы TLS и SSL (поставщик службы безопасности Schannel))

Требования для поддержки TLS 1.2 на платформе .NET Framework 3.5

В этой таблице указаны обновления операционной системы, которые требуются для включения поддержки TLS 1.2 для .NET Framework 3.5. Мы рекомендуем применить все обновления операционной системы.

Операционная система Минимальные обновления, необходимые для включения поддержки TLS 1.2 для .NET Framework 3.5
Windows 10
Windows Server 2016
Накопительный пакет обновления для Windows 10 версии 1511 и Windows Server 2016 Technical Preview 4 за 10 мая 2016 г.
Windows 8.1
Windows Server 2012 R2
Включенная поддержка версий TLS по умолчанию для .NET Framework 3.5 в Windows 8.1 и Windows Server 2012 R2
Windows 8.0
Windows Server 2012
Включенная поддержка версий TLS по умолчанию для .NET Framework 3.5 в Windows Server 2012
Windows 7 SP1
Windows Server 2008 R2 с пакетом обновления 1 (SP1)
Включенная поддержка версий TLS по умолчанию для .NET Framework 3.5.1 в Windows 7 с пакетом обновления 1(SP1) и Server 2008 R2 с пакетом обновления 1(SP1)
Windows Server 2008 Включенная поддержка версий TLS по умолчанию для .NET Framework 2.0 с пакетом обновления SP2 в Windows Vista SP2 и Server 2008 SP2
Windows Vista Не поддерживается