Оновіть веб-службу .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

4
Чому голоси проти?
nasch

Відповіді:


139

Насправді ми щойно оновили веб-службу .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
Etienne Faucher

1
Я зрозумів - я не запитував HTTPS. Після того, як я це виправив, це спрацювало.
наш

3
Зміни компіляції на 4.6 та додавання httpRuntime 4.6 у нашому випадку було достатньо, дякую за рішення!
крилович

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 і далі
Gilberto Alexandre

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;

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

Привіт @Artem після додавання tls, чи потрібно мені перезапускати сервер?
Сімба

@Simba, ти, мабуть, це вирішив, але, роблячи це зараз, мені НЕ потрібно було перезапускати сервер.
Matt N.

5

Для мене нижче працювали:

Крок 1: Завантажив та встановив веб-програму встановлення exe з 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>

Додавання цільового фреймворку 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 просто перестають працювати з помилкою Hard TCP / IP Close, як брандмауер блокує з'єднання. Зазвичай кроки автентифікації працюють - саме тоді, коли ви натискаєте службу для певної робочої області та повідомляєте ідентифікатори, вона не працює.

Це примітка Microsoft PowerBI до 2020 року про необхідний 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: Не вдається прочитати дані з транспортного з'єднання: віддаленим хостом примусово закрито існуюче з'єднання.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.