Каков протокол безопасности по умолчанию для связи с серверами, которые поддерживают до TLS 1.2
? Будет ли .NET
по умолчанию, выберите самый высокий протокол безопасности , поддерживаемый на стороне сервера или у меня явно добавить эту строку кода:
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? Я вижу, по умолчанию TLS 1.1 и 1.2 не включены, мы должны включить его через реестр? RE http://support.microsoft.com/kb/245030 .
После небольшого исследования я считаю, что настройки реестра не окажут никакого влияния, поскольку они применяются к IIS (подраздел сервера) и браузерам (подраздел клиента).
Извините, этот пост превратился в несколько вопросов, за которыми последовали ответы «возможно».
Ответы:
Некоторые из тех, кто оставил комментарии, отметили, что установка
System.Net.ServicePointManager.SecurityProtocol
определенных значений означает, что ваше приложение не сможет использовать преимущества будущих версий TLS, которые могут стать значениями по умолчанию в будущих обновлениях .NET. Вместо того, чтобы указывать фиксированный список протоколов, вы можете вместо этого включать или выключать известные вам протоколы и заботиться о них, оставляя все остальные как есть.Чтобы включить TLS 1.1 и 1.2 без влияния на другие протоколы:
Обратите внимание на использование
|=
этих флагов без выключения других.Чтобы отключить SSL3 без влияния на другие протоколы:
источник
[Net.ServicePointManager]::SecurityProtocol = ([Net.ServicePointManager]::SecurityProtocol -bor [Net.SecurityProtocolType]::Tls11 -bor [Net.SecurityProtocolType]::Tls12)
Invoke-RestMethod, основанный на тех же базовых библиотеках .NET Framework.Net.ServicePointManager.SecurityProtocol = Net.ServicePointManager.SecurityProtocol OR Net.SecurityProtocolType.Tls12 OR Net.SecurityProtocolType.Tls12
По умолчанию
System.Net.ServicePointManager.SecurityProtocol
в обоих .NET4.0/4.5
есть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
и вручную задавая перечисляемые значения в.NET 4.0
проекте:Ссылка:
Если вы попытаетесь взломать среду, в которой
.NET 4.0
установлено ТОЛЬКО , вы получите исключение:Тем не менее, я бы не рекомендовал этот «взлом», поскольку будущий патч и т. Д. Может его сломать. *
Поэтому я решил, что лучший способ удалить поддержку
SSLv3
- это:.NET 4.5
Добавьте следующее в код бустрапинга, чтобы переопределить значение по умолчанию и проверить его на будущее:
System.Net.ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12;
* Кто-то исправит меня, если этот взлом не так, но начальные тесты, я вижу, это работает
источник
ServicePointManager.cs
см referencesource.microsoft.com/#System/net/System/Net/....NET 4.5
умолчанию Tls12 - но, как вы указали здесь, это не так. Это дает вам возможность использовать его дляSecurityProtocol
SecurityProtocolType.Tls | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12
соответствует support.microsoft.com/en-us/help/3069494/…Вы можете переопределить поведение по умолчанию в следующем реестре:
и
Для получения подробной информации, пожалуйста, смотрите реализацию
ServicePointManager
.источник
reg add HKLM\SOFTWARE\Microsoft\.NETFramework\v4.0.30319 /v SchUseStrongCrypto /t REG_DWORD /d 1 /reg:64
(и / или/reg:32
)Создайте текстовый файл с
.reg
расширением и следующим содержимым:Или загрузите его из следующего источника:
https://tls1test.salesforce.com/s/NET40-Enable-TLS-1_2.reg
Дважды щелкните, чтобы установить ...
источник
Я обнаружил, что когда я указываю только TLS 1.2, он все равно будет переходить к 1.1.
System.Net.ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;
Я указал это в методе запуска Global.asax для моего веб-приложения .net 4.5.
источник
Следующий код будет:
Константы:
Другие протоколы не будут затронуты. Это делает это совместимым с будущими протоколами (Tls1.3 и т. Д.).
Код
Вывод
источник
Я получил проблему, когда мой клиент обновил TLS с 1.0 до 1.2. Мое приложение использует .net Framework 3.5 и работает на сервере. Итак, я исправил это следующим образом:
Перед вызовом HttpWebRequest.GetResponse () добавьте эту команду:
Расширения 2 DLL путем добавления 2 новых классов: System.Net и System.Security.Authentication
Скачать пакет:
Для загрузки пакета и более подробной информации вы можете увидеть здесь:
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-и-сервер-2008-r2-sp1
источник
Механизм изменения реестра работал для меня после борьбы. На самом деле мое приложение работало как 32-битное. Поэтому мне пришлось изменить значение в пути.
Тип значения должен быть DWORD и значение выше 0. Лучше использовать 1.
источник
Я работаю под .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. В интересах написания форвард-совместимого кода, он будет продолжать принимать правильные решения, даже когда TLS 1.2 неизбежно сломается в будущем или когда я обновлю до .NET 4.7+ и передам больше ответственности за выбор подходящего протокола для ОС. Я принял следующий код:Этот код будет определять, когда включен известный небезопасный протокол, и в этом случае мы удалим эти небезопасные протоколы. Если не останется никаких других явных протоколов, мы принудительно включим TLS 1.2, как единственный известный безопасный протокол, поддерживаемый .NET на данный момент. Этот код совместим с предыдущими версиями, так как он будет учитывать новые типы протоколов, которые он не знает о добавлении в будущем, и он также будет хорошо работать с новым
SystemDefault
укажите в .NET 4.7, что означает, что мне не придется повторно посещать этот код в будущем. Я бы настоятельно рекомендовал принять такой подход, а не жестко кодировать какие-либо конкретные состояния протокола безопасности безоговорочно, в противном случае вам придется перекомпилировать и заменить свой клиент новой версией, чтобы перейти на новый протокол безопасности при TLS 1.2. неизбежно нарушается, или, скорее всего, вам придется на долгие годы оставлять незащищенные протоколы включенными на вашем сервере, что делает вашу организацию мишенью для атак.источник
SecurityProtocolType.SystemDefault
флаг оценивается как0
, поэтому проверкаif (securityProtocols == 0)
с помощью побитового включения или флага для TLS 1.2 всегда будет включать в себя TLS 1.2, даже после того, как он "сломается", верно? Не резкая стрельба здесь. Я искренне пытаюсь найти лучший путь вперед.if (!Enum.IsDefined(typeof(SecurityProtocolType), 0) && securityProtocols == 0) { securityProtocols |= SecurityProtocolType.Tls12; }
.securityProtocols |= SecurityProtocolType.Tls12;
(без блока if) не поддерживает SystemDefault, а у securityProtocols только TLS2. Итак, вы имеете в виду, когда значение равно SystemDefault, никакое значение не должно обновляться? Что касается прямой совместимости, вы предполагаете, что ОС позаботится о включении более нового протокола, такого как TLS 1.3?securityProtocols |= SecurityProtocolType.Tls12;' will add TLS 1.2, but because the
SecurityProtocolType` enum есть[Flags]
атрибут, а значение перечисления0
SystemDefault равно значению SystemDefault, которое будет удалено, даже если оно было установлено ранее. Конечным результатом является то, что вы можете установитьSevicePointManager.SecurityProtocol
значение 0 или любую комбинацию других значений перечисления. Если вы установите его в SystemDefault, вы в основном отказываетесь от указания протокола самостоятельно и позволяете операционной системе решать.Microsoft недавно опубликовала лучшие практики по этому вопросу. https://docs.microsoft.com/en-us/dotnet/framework/network-programming/tls
Резюме
Задайте .Net Framework 4.7, удалите любой код, устанавливающий протокол безопасности, поэтому ОС обеспечит вам наиболее безопасное решение.
NB. Вам также необходимо убедиться, что последняя версия TLS поддерживается и включена в вашей ОС.
Для получения дополнительной информации и более старых платформ, пожалуйста, обратитесь к ссылке MS.
источник
if (System.Environment.OSVersion.Version < new Version(6, 2) /* Windows 8 */) ServicePointManager.SecurityProtocol |= SecurityProtocolType.Tls | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12; else ServicePointManager.SecurityProtocol = SecurityProtocolType.SystemDefault;
Для полноты вот сценарий Powershell, который устанавливает вышеупомянутые ключи реестра:
источник
Альтернатива жесткому кодированию
ServicePointManager.SecurityProtocol
или явный ключ SchUseStrongCrypto, как упомянуто выше:.NET может использовать стандартные настройки SCHANNEL с ключом SystemDefaultTlsVersions,
например:
источник
Лучшее решение этой проблемы, по-видимому, заключается в обновлении до версии не ниже .NET 4.6 или более поздней, которая автоматически выберет надежные протоколы и надежные шифры.
Если вы не можете перейти на .NET 4.6, совет по настройке
System.Net.ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12;
И используя настройки реестра:
HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft.NETFramework \ v4.0.30319 - SchUseStrongCrypto = DWORD из 1 HKEY_LOCAL_MACHINE \ SOFTWARE \ Wow6432Node \ Microsoft.NETFramework \ v4.0.30319 - SchUseStrongCrypto = 1
В результате получается что-то отличное от TLS 1.0 и надежный шифр.
В моем тестировании только настройка в Wow6432Node имела какое-то значение, хотя мое тестовое приложение было построено для любого процессора.
источник
Согласно рекомендациям Transport Layer Security (TLS) с .NET Framework : Для обеспечения безопасности приложений .NET Framework версия TLS не должна быть жестко закодирована. Вместо этого установите ключи реестра:
SystemDefaultTlsVersions
иSchUseStrongCrypto
:источник
Если вы можете использовать .NET 4.7.1 или новее, он будет использовать TLS 1.2 в качестве минимального протокола, основанного на возможностях операционной системы. По рекомендации Microsoft:
источник
Для ключа: HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft.NETFramework \ v4.0.30319 Значение: SchUseStrongCrypto
Вы должны установить значение 1.
источник