Обновите веб-службу .NET для использования TLS 1.2

99

Мне нужно использовать TLS 1.2 для подключения моего веб-сервиса .NET к другому, который будет принудительно использовать TLS 1.2. Я нашел ресурс, в котором говорится, что .NET 4.6 по умолчанию использует TLS 1.2, так что это звучит как самое простое решение. Я обновил платформу .NET на сервере и перезапустил. В IIS я пытался создать пул приложений с использованием .NET 4.6, но 4.0 была единственным вариантом. Затем я нашел кое-что, в котором говорилось, что он все еще будет означать 4.0, потому что 4.6 - это обновление «на месте» для .NET 4.0. Поэтому я подумал, что, может быть, я закончил Однако на странице ошибки, которую я получил по несвязанным причинам, было сказано, Microsoft .NET Framework Version:4.0.30319что, похоже, я не обновился успешно. Любые указатели на то, как убедиться, что мой пул приложений использует .NET 4.6 или, в более общем плане, как включить TLS 1.2?

наш
источник
4
Я считаю, что на сервере должен быть включен TLS12. support.quovadisglobal.com/kb/a433/…
lcryder 01
4
Почему отрицательные голоса?
nasch 02

Ответы:

140

На самом деле мы только что обновили веб-службу .NET до версии 4.6, чтобы разрешить использование TLS 1.2.

То, что говорит Артем, - это первые шаги, которые мы сделали. Мы перекомпилировали структуру веб-службы до версии 4.6 и попытались изменить ключ реестра, чтобы включить TLS 1.2, но это не сработало: соединение все еще оставалось в TLS 1.0. Кроме того, мы не хотели запрещать SLL 3.0, TLS 1.0 или TLS 1.1 на машине: это могли использовать другие веб-службы; мы откатили наши изменения в реестре.

Мы фактически изменили файлы Web.Config, чтобы сообщить IIS: «Эй, запустите меня в 4.6, пожалуйста».

Вот изменения, которые мы добавили в перекомпиляцию web.config + в .NET 4.6:

<system.web>
    <compilation targetFramework="4.6"/> <!-- Changed framework 4.0 to 4.6 -->

    <!--Added this httpRuntime -->
    <httpRuntime targetFramework="4.6" />

    <authentication mode="Windows"/>
    <pages controlRenderingCompatibilityVersion="4.0"/>
</system.web>

И соединение изменилось на TLS 1.2, потому что IIS теперь запускает веб-службу в 4.6 (указано явно), а 4.6 по умолчанию использует TLS 1.2.

Этьен Фоше
источник
3
Вот документация, которую мы использовали для исследования: HTTPRuntime , RenderingCompatibility
Этьен
1
Разобрался - HTTPS не запрашивал. После того, как я это исправил, все заработало.
nasch 02
3
В нашем случае было достаточно изменения компиляции на 4.6 и добавления httpRuntime 4.6, спасибо за решение!
krilovich 05
2
Это совершенно правильный ответ. Только что прошел через это недавно. Вот сообщение об этом в блоге: blog.thelevelup.com/pci-security-is-your-restaurant-ready и проект GitHub, который делает это: github.com/TheLevelUp/pos-tls-patcher
user24601
88

Добавьте следующий код, прежде чем создавать экземпляр клиента веб-службы:

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

Или для обратной совместимости с TLS 1.1 и ранее:

System.Net.ServicePointManager.SecurityProtocol |= SecurityProtocolType.Tls12; 
Джон Ву
источник
2
Да, я уже делаю это, но сообщение об ошибке по-прежнему указывает на .NET 4.0.
nasch
12
Это ваша версия CLR. .Net CLR имеет две версии: 2.0 и 4.0. В IIS вы указываете версию CLR, а не версию Framework. IIS не скажет вам .Net 4.6, потому что его это не волнует. Если вы скомпилировали 4.6, значит, вы используете 4.6.
Эми
2
TLS 1.2 поддерживается начиная с .NET 4.5
Жилберто Александр
5
В этом случае | = превосходит просто =. Это бинарные флаги, не перезаписывайте все остальное без необходимости.
Иззи
2
@JohnWu - обратите внимание на комментарий Иззи выше. Ваш код указывает .NET явно использовать ТОЛЬКО TLS 1.2 при подключении к ресурсам HTTPS. То есть, если бы на сервере был только TLS 1.1, ваш код остановил бы его подключение, поскольку он использует только TLS 1.2. Вы должны использовать | =, чтобы сообщить своему коду «попробуйте также использовать TLS 1.2 как вариант», когда клиент и сервер согласовывают, какой протокол использовать.
Дон Чидл
27

если вы используете .Net раньше , чем 4.5 вы не будете иметь Tls12 в перечислении так государство явно упоминается здесь

ServicePointManager.SecurityProtocol = (SecurityProtocolType)3072;
Bresleveloper
источник
17

Требуется три шага:

  1. Явно отметьте SSL2.0, TLS1.0, TLS1.1 как запрещенные на вашем сервере, добавив Enabled=0и DisabledByDefault=1в свой реестр (полный путь HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols). См. Подробности на экране реестр

  2. Явно включите TLS1.2, выполнив шаги из 1. Просто используйте Enabled=1и DisabledByDefault=0соответственно.

ПРИМЕЧАНИЕ: проверьте версию сервера: Windows Server 2003не поддерживает TLS 1.2протокол

  1. Включите TLS1.2только на уровне приложения, как @John Wu предложил выше.

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

Надеюсь, это руководство поможет.

ОБНОВЛЕНИЕ Как упоминалось в @Subbu: Официальное руководство

Артем
источник
1
Официальная ссылка - technet.microsoft.com/en-us/library/…
Subbu 01
Привет, @Artem, после добавления tls мне нужно перезапустить сервер?
Simba
@Simba, вы, вероятно, решили это, но, делая это сейчас, мне НЕ нужно перезагружать сервер.
Мэтт Н.
5

Для меня ниже работали:

Шаг 1. Загрузите и установите исполняемый файл веб-установщика с https://www.microsoft.com/en-us/download/details.aspx?id=48137 на сервере приложений. После завершения установки перезагрузил сервер приложений.

Шаг 2: Добавлены ниже изменения в web.config

<system.web>
    <compilation targetFramework="4.6"/> <!-- Changed framework 4.0 to 4.6 -->
    <!--Added this httpRuntime -->
    <httpRuntime targetFramework="4.6" />
</system.web>

Шаг 3. После выполнения шагов 1 и 2 возникла ошибка: « WebForms UnobtrusiveValidationMode требует ScriptResourceMapping для 'jquery'. Добавьте ScriptResourceMapping с именем jquery (с учетом регистра) », и для устранения этой ошибки я добавил ниже ключ в настройках приложений в моем файле web.config

<appSettings>
      <add key="ValidationSettings:UnobtrusiveValidationMode" value="None" />
</appSettings>
KRM
источник
Добавление целевой структуры httpRuntime сработало для меня.
Марк Редман,
0

PowerBI Embedded требует TLS 1.2.

Ответ Этьена Фошера выше - ваше решение. быстрая ссылка на ответ выше ... быстрая ссылка на ответ выше ... ( https://stackoverflow.com/a/45442874 )

PowerBI требует TLS 1.2. Июнь 2020 г. - Это ваш ответ - рассмотрите возможность увеличения среды выполнения IIS до версии 4.6, чтобы принудительно использовать стандартное поведение TLS 1.2, которое вы ищете от платформы. Приведенный выше ответ дает вам решение только для изменения конфигурации.

Симптомы : принудительное закрытое отклоненное соединение TCP / IP с Microsoft PowerBI Embedded, которое внезапно появляется в ваших системах.

Эти вызовы PowerBI просто перестают работать из-за ошибки жесткого закрытия TCP / IP, как будто брандмауэр блокирует соединение. Обычно шаги аутентификации работают - это когда вы нажимаете службу для определенной рабочей области и сообщаете идентификаторы, что она не работает.

Это примечание 2020 от Microsoft PowerBI о необходимости TLS 1.2.

PowerBIClient

методы, которые показывают эту проблему

GetReportsInGroupAsync GetReportsInGroupAsAdminAsync GetReportsAsync GetReportsAsAdminAsync Microsoft.PowerBI.Api HttpClientHandler Force TLS 1.1 TLS 1.2

Условия ошибки поиска, чтобы помочь людям найти это: System.Net.Http.HttpRequestException: произошла ошибка при отправке запроса System.Net.WebException: базовое соединение было закрыто: при отправке произошла непредвиденная ошибка. System.IO.IOException: невозможно прочитать данные из транспортного соединения: существующее соединение было принудительно закрыто удаленным хостом.

Sql Surfer
источник