Наш клиент недавно обновил протокол безопасности до TLS 1.2. Поэтому мы обновили наше приложение до 4.6.1, ожидая, что протокол безопасности будет по умолчанию на TLS 1.2, но это не так. Есть идеи, почему?
.Net Framework 4.6.1 не используется по умолчанию для TLS 1.2
Ответы (11)
У меня была аналогичная проблема, и это сработало для меня.
откройте Powershell и проверьте поддерживаемые протоколы с помощью
[Net.ServicePointManager]::SecurityProtocol
Выполните следующие 2 командлета, чтобы установить . Ключи реестра сильной криптографии .NET Framework:
установить надежную криптографию на 64-разрядной платформе .Net Framework (версия 4 и выше)
Set-ItemProperty -Path 'HKLM:\SOFTWARE\Wow6432Node\Microsoft\.NetFramework\v4.0.30319' -Name 'SchUseStrongCrypto' -Value '1' -Type DWord
установить надежную криптографию на 32-разрядной платформе .Net Framework (версия 4 и выше)
Set-ItemProperty -Path 'HKLM:\SOFTWARE\Microsoft\.NetFramework\v4.0.30319' -Name 'SchUseStrongCrypto' -Value '1' -Type DWord
Перезапустите Powershell и еще раз проверьте поддерживаемый протокол, используя
[Net.ServicePointManager]::SecurityProtocol
Теперь он также должен отображать Tls12
.
Надеюсь это поможет
Ssl3, Tls
- person xr280xr; 09.01.2019
SecurityProtocol
вернул SystemDefault
как до, так и после выполнения двух команд. Однако это все еще работало!
- person RichardM; 04.11.2019
Как уже упоминалось другими, существует ряд ключей реестра Windows, которые необходимо настроить для включения TLS 1.2 в существующих приложениях .NET без явной установки версии протокола в коде приложения.
Чтобы сделать . Код .NET 4.x по умолчанию выбирает самый надежный из доступных протоколов (т. е. когда протокол не указан явно указанный в коде) необходимы следующие ключи реестра:
В 32-битной и 64-битной версиях Windows: HKLM\SOFTWARE\Microsoft\.NETFramework\v4.0.30319\SchUseStrongCrypto: 0X00000001
В 64-разрядных версиях Windows: HKLM\SOFTWARE\WOW6432Node\Microsoft\.NETFramework\v4.0.30319\SchUseStrongCrypto: 0X00000001
Значение WOW6432Node равно необходимо для включения TLS 1.2 в 32-битных приложениях при работе в 64-битных системах.
Но вот быстрое и простое решение: https://github.com/TheLevelUp/pos-tls-patcher
Обновление:
Если вы ориентируетесь на .NET 4.6 или 4.7, вас заинтересует Передовые методы обеспечения безопасности транспортного уровня (TLS) с .NET Framework.
Обратите внимание, что связанный выше TLS Patcher во многом соответствует рекомендациям Microsoft для существующих .NET 4.0 и 4.5. приложения, не предназначенные для .NET 4.6 или выше.
Причина, по которой протокол безопасности не использует по умолчанию TLS 1.2, заключается в том, что в .NET Framework 4.6.1 для этого нет значения по умолчанию. Извините, если это повторяет то, что уже было сказано, но я хотел уточнить, и у меня недостаточно репутации, чтобы комментировать.
В 4.6.2 также нет значения по умолчанию, однако, как и один из упомянутых выше комментаторов, консольное приложение, похоже, по умолчанию использует TLS 1.2. Я пробовал тот же код в проекте веб-сайта, ориентированном на 4.6.2, и он НЕ по умолчанию использовал TLS 1.2.
4.7 и выше имеет значение по умолчанию SecurityProtocolType.SystemDefault.
«Это позволяет сетевым API .NET Framework на основе SslStream (например, FTP, HTTP и SMTP) наследовать протоколы безопасности по умолчанию от операционной системы или от любых пользовательских конфигураций, выполненных системным администратором»
Мы столкнулись с аналогичной проблемой при размещении нашего приложения .NET 4.6.2 в IIS.
Мы могли бы решить проблему, добавив элемент httpRuntime
в web.config. Без этого наша служба не использовала TLS 1.2 по умолчанию.
<httpRuntime targetFramework="4.6.2" />
Для получения дополнительной информации см. https://docs.microsoft.com/en-us/dotnet/api/system.web.configuration.httpruntimesection?view=netframework-4.7.2
MSDN: Свойство ServicePointManager.SecurityProtocol
Это свойство выбирает версию протокола Secure Sockets Layer (SSL) или Transport Layer Security (TLS), которая будет использоваться для новых подключений, использующих только схему HTTPS; существующие соединения не изменяются. Обратите внимание, что для этого свойства специально не указано значение по умолчанию.
Пейзаж безопасности постоянно меняется, а протоколы по умолчанию и уровни защиты меняются с течением времени, чтобы избежать известных слабых мест. Значения по умолчанию будут различаться в зависимости от конфигурации отдельного компьютера, а также от того, какое программное обеспечение установлено и на какие исправления были применены исправления.
Взято из здесь
Я тоже столкнулся с проблемой. Когда локальное приложение пыталось подключиться к серверу, поддерживающему TLS 1.1 и TLS 1.2, оно получало исключение «Существующее соединение было принудительно закрыто удаленным хостом» или когда TLS 1.1 / 1.2 не были включены должным образом, оно использовалось для получения исключения Win32Exception: Клиент и сервер не могут общаться, потому что у них нет общего алгоритма "
Ниже приведены все ключи и значения реестра, необходимые для 64-разрядной ОС Windows. Если у вас 32-битная ОС (x86), просто удалите последние 2 строки. TLS 1.0 будет отключен сценарием реестра. Требуется перезагрузка ОС.
Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols]
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\SSL 2.0]
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\SSL 2.0\Client]
"DisabledByDefault"=dword:00000001
"enabled"=dword:00000000
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\SSL 2.0\server]
"disabledbydefault"=dword:00000001
"enabled"=dword:00000000
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\ssl 3.0]
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\ssl 3.0\client]
"disabledbydefault"=dword:00000001
"enabled"=dword:00000000
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\ssl 3.0\server]
"disabledbydefault"=dword:00000001
"enabled"=dword:00000000
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\tls 1.0]
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\tls 1.0\client]
"disabledbydefault"=dword:00000001
"enabled"=dword:00000000
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\tls 1.0\server]
"disabledbydefault"=dword:00000001
"enabled"=dword:00000000
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\tls 1.1]
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\tls 1.1\client]
"disabledbydefault"=dword:00000000
"enabled"=dword:00000001
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\tls 1.1\server]
"disabledbydefault"=dword:00000000
"enabled"=dword:00000001
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\tls 1.2]
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\tls 1.2\client]
"disabledbydefault"=dword:00000000
"enabled"=dword:00000001
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\tls 1.2\server]
"disabledbydefault"=dword:00000000
"enabled"=dword:00000001
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework\v4.0.30319]
"SchUseStrongCrypto"=dword:00000001
[HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\.NETFramework\v4.0.30319]
"SchUseStrongCrypto"=dword:00000001
На основании следующей ссылки
https://docs.microsoft.com/en-us/dotnet/framework/network-programming/tls
я добавил
AppContext.SetSwitch("Switch.System.Net.DontEnableSystemDefaultTlsVersions", false);
в мой код, и это устранило проблему для меня. Это означает, что по умолчанию будет использоваться самый высокий уровень, поддерживаемый ОС, что является таким же поведением, которое вы получаете по умолчанию в версии 4.7 и выше.
Я сделал следующие шаги, чтобы использовать последний протокол безопасности TLS v.1.2:
Отключите старые протоколы SSL2.0, SSL3.0, TLS1.0, TLS1.1, включите TLS1.2 и включите сильную криптографию для .NET Framework в реестре.
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\SSL 2.0\Server]
"DisabledByDefault"=dword:00000001
"Enabled"=dword:00000000
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\SSL 2.0\Client]
"DisabledByDefault"=dword:00000001
"Enabled"=dword:00000000
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\SSL 3.0\Server]
"DisabledByDefault"=dword:00000001
"Enabled"=dword:00000000
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\SSL 3.0\Client]
"DisabledByDefault"=dword:00000001
"Enabled"=dword:00000000
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.0\Server]
"DisabledByDefault"=dword:00000001
"Enabled"=dword:00000000
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.0\Client]
"DisabledByDefault"=dword:00000001
"Enabled"=dword:00000000
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.1\Server]
"DisabledByDefault"=dword:00000001
"Enabled"=dword:00000000
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.1\Client]
"DisabledByDefault"=dword:00000001
"Enabled"=dword:00000000
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.2\Server]
"DisabledByDefault"=dword:00000000
"Enabled"=dword:00000001
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.2\Client]
"DisabledByDefault"=dword:00000000
"Enabled"=dword:00000001
[HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\.NETFramework\v4.0.30319]
"SystemDefaultTlsVersions"=dword:00000001
"SchUseStrongCrypto"=dword:00000001
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework\v4.0.30319]
"SystemDefaultTlsVersions"=dword:00000001
"SchUseStrongCrypto"=dword:00000001
Я использовал это в своем коде на начальной странице. Приложение представляет собой веб-формы в VB.NET с .NET Framework 4.6.1.
System.Net.ServicePointManager.SecurityProtocol = System.Net.SecurityProtocolType.Tls12
Я попробовал следующий код в своем api, который не работает для интеграции учетной записи Kaltura (поскольку Kaltura API обновлен до TLS 1.2), и он начал работать. .Net framework - это 4.5.2 и сервер: Windows Server 2008 R2, на котором размещено приложение.
#region To handle TLS (Transport Layer Security) Version and support
var assembly = Assembly.GetExecutingAssembly();
var attributes = assembly.GetCustomAttributes(typeof(TargetFrameworkAttribute), false);
var version = (TargetFrameworkAttribute)attributes[0];
SecurityProtocolType flag;
if (Enum.TryParse("Tls11", out flag))
ServicePointManager.SecurityProtocol |= flag;
if (Enum.TryParse("Tls12", out flag))
ServicePointManager.SecurityProtocol |= flag;
#endregion
Спасибо.
- Обновите Windows и WinHTTP
- Убедитесь, что TLS 1.2 включен в качестве протокола для SChannel на уровне операционной системы.
- Обновите и настройте .NET Framework для поддержки TLS 1.2.
The request was aborted: Could not create SSL/TLS secure channel.
. - person Panagiotis Kanavos   schedule 09.05.2017