.Net Framework 4.6.1 не отменяет TLS 1.2

Недавно наш клиент обновил протокол безопасности до TLS 1.2. Поэтому мы обновили наше приложение до 4.6.1, ожидая, что протокол безопасности будет использоваться по умолчанию для TLS 1.2, но это не так. Любая идея почему?

Ответ 1

У меня была аналогичная проблема, и это помогло мне.

  1. открыть Powershell и проверить поддерживаемые протоколы с помощью [Net.ServicePointManager]::SecurityProtocol

  2. Запустите следующие 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

  3. Перезапустите Powershell и снова проверьте поддерживаемый протокол с помощью [Net.ServicePointManager]::SecurityProtocol

Теперь он должен отображать Tls12.

Надеюсь это поможет

Ответ 2

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

Ответ 3

Причина, по которой протокол безопасности не был установлен по умолчанию для 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) наследовать протоколы безопасности по умолчанию из операционной системы или из любых пользовательских конфигураций, выполняемых системным администратором"

https://docs.microsoft.com/en-us/dotnet/api/system.net.servicepointmanager.securityprotocol?view=netframework-4.7#System_Net_ServicePointManager_SecurityProtocol

Ответ 4

MSDN: свойство ServicePointManager.SecurityProtocol

Это свойство выбирает версию протокола Secure Sockets Layer (SSL) или Transport Layer Security (TLS) для использования для новых подключений, использующих только протокол Secure Hypertext Transfer Protocol (HTTPS); существующие соединения не изменяются. Обратите внимание, что для этого свойства не указано значение по умолчанию.

Пейзаж безопасности постоянно меняется, а по умолчанию протоколы и уровни защиты меняются со временем, чтобы избежать известных слабых мест. Значения по умолчанию будут различаться в зависимости от конфигурации отдельных компьютеров, а также от того, какое программное обеспечение установлено и на каких исправлениях были применены.

Взято отсюда

Ответ 5

Я тоже столкнулся с проблемой. Когда локальное приложение пыталось подключиться к серверу, поддерживающему TLS 1.1 и TLS 1.2, он использовал, чтобы получить исключение "Существующее соединение было принудительно закрыто удаленным хостом" или когда TLS 1.1/1.2 не были включены должным образом, он использовал для получения "Win32Exception: Клиент и сервер не могут общаться, потому что у них нет общего алгоритма "

Ниже приведены все ключи и значения реестра, необходимые для ОС x64. Если у вас 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

Ответ 6

Я сделал следующие шаги, чтобы использовать последний протокол безопасности 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

Ответ 7

Я использовал это в своем коде на начальной странице. Приложение представляет собой веб-формы в VB.NET с.NET Framework 4.6.1

System.Net.ServicePointManager.SecurityProtocol =  System.Net.SecurityProtocolType.Tls12

Ответ 8

Подобная проблема возникла при размещении нашего приложения .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.

Ответ 9

Я попробовал следующий код в моем 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

Спасибо.