SecurityProtocol за замовчуванням у .NET 4.5


253

Що таке протокол безпеки за замовчуванням для спілкування з серверами, які підтримують до 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на стороні клієнта, навіть якщо сервер її підтримує (у мене вже є скрипт повноважень, щоб відключити це в машинному реєстрі) та підтримувати найвищий протокол 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;все-таки код завантаження всіх програм.

Це призведе до вихідних запитів до різних apis та служб, щоб вони не переходили до рівня SSLv3та повинні вибрати найвищий рівень TLS.

Чи звучить цей підхід розумним чи непосильним? У мене є багато додатків для оновлення, і я хочу їх підтвердити в майбутньому, оскільки я чую, що навіть TLS 1.0найближчим часом деякі постачальники послуг можуть бути застарілими.

Чи відключення SSL3 в реєстрі, як клієнт, що робить виїзні запити до API, чи впливає в рамках .NET? Я бачу, що за замовчуванням TLS 1.1 та 1.2 не ввімкнено, чи потрібно це ввімкнути через реєстр? RE http://support.microsoft.com/kb/245030 .

Після невеликого розслідування, я вважаю, що настройки реєстру не вплинуть, оскільки вони застосовуються до IIS (підрозділ сервера) та браузерах (підрозділ клієнта).

Вибачте, ця публікація перетворилася на кілька запитань, а також відповіді "можливо".


FYI: Останні найкращі практики навколо TLS: docs.microsoft.com/en-us/dotnet/framework/network-programming/…
JohnLBevan

Для тих, хто хоче побачити найкращу відповідь на це, сортуйте за голосами!
navule

1
Відповідні запитання та відповіді: stackoverflow.com/questions/41618766/… Читачі повинні відзначити, що це питання старіє, і нові рекомендації існують до 2020 року.
Ніяких відшкодувань не повертається

Відповіді:


280

Деякі з тих, хто залишає коментарі, зазначили, що встановлення System.Net.ServicePointManager.SecurityProtocolконкретних значень означає, що ваша програма не зможе скористатися майбутніми версіями TLS, які можуть стати значеннями за замовчуванням у майбутніх оновленнях до .NET. Замість того, щоб вказувати фіксований список протоколів, ви можете замість цього вимкнути або вимкнути протоколи, про які ви знаєте і про що піклуєтесь, залишивши будь-які інші такими, якими вони є.

Щоб увімкнути TLS 1.1 та 1.2, не впливаючи на інші протоколи:

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

Зауважте, як |=увімкнути ці прапори, не вимикаючи інших.

Щоб вимкнути SSL3, не впливаючи на інші протоколи:

System.Net.ServicePointManager.SecurityProtocol &= ~SecurityProtocolType.Ssl3;

6
Це справді правильна відповідь. Прийнята відповідь гарантуватиме, що ваш додаток завжди буде вимикати нові версії TLS, якщо ви не повернетесь і не оновите код.
Коннор

5
@Gertsen Ні, це побіжно або, тому він просто вмикає відповідні біти, якщо вони вимкнено. Якщо ці біти вже активовані, змін не відбувається.
Скотт

3
І еквівалент PowerShell цього [Net.ServicePointManager]::SecurityProtocol = ([Net.ServicePointManager]::SecurityProtocol -bor [Net.SecurityProtocolType]::Tls11 -bor [Net.SecurityProtocolType]::Tls12) Invoke-RestMethod покладається на ті самі основні бібліотеки .NET Framework.
Мартін Холлінгсворт

15
Оскільки ніхто не говорить про те, куди поставити цей код, я його успішно вклав у Application_Start з Global.asax.cs для мого додатку ASP.NET MVC. Я шукав, як отримати мої SMTP-запити для надсилання через TLS1.2, а НЕ через TLS1.0. Я також додав & = ~ SecurityProtocolType.Tls, щоб вимкнути TLS 1.0
Грег Верес

2
У VB еквівалентNet.ServicePointManager.SecurityProtocol = Net.ServicePointManager.SecurityProtocol OR Net.SecurityProtocolType.Tls12 OR Net.SecurityProtocolType.Tls12
Код, розміщений

188

За замовчуванням System.Net.ServicePointManager.SecurityProtocolв обох .NET 4.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проекті вручну :

ServicePointManager.SecurityProtocol = (SecurityProtocolType)192 |
(SecurityProtocolType)768 | (SecurityProtocolType)3072;

Довідка:

namespace System.Net
{
    [System.Flags]
    public enum SecurityProtocolType
    {
       Ssl3 = 48,
       Tls = 192,
       Tls11 = 768,
       Tls12 = 3072,
    }
}

Якщо ви спробуєте зламати навколишнє середовище з .NET 4.0встановленим ТОЛЬКО , ви отримаєте виняток:

Неопрацьоване виняток: System.NotSupportedException: Запитаний протокол безпеки не підтримується. на System.Net.ServicePointManager.set_SecurityProtocol (SecurityProtocolType v alue)

Однак я б не рекомендував цей "хак", оскільки майбутній патч тощо може зламати його. *

Тому я вирішив найкращим способом усунути підтримку SSLv3:

  1. Оновіть усі програми до .NET 4.5
  2. Додайте наступне до завантажувального коду, щоб змінити типовий і майбутній доказ:

    System.Net.ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12;

* Хтось виправить мене, якщо цей злом невірний, але початкові тести, я бачу, він працює


6
Будь ласка, дивіться imperialviolet.org/2014/12/08/poodleagain.html "Це здається гарним моментом, щоб підтвердити, що все менше, ніж TLS 1.2 з набором шифрів AEAD, криптографічно порушено".
Ніл

3
@Mathew, переглянувши вихідний код, ServicePointManager.csдив. Referenceource.microsoft.com/#System/net/System/Net/…
Люк Хаттон

12
Я продовжую бачити, як люди заявляють про .NET 4.5Tls12 за замовчуванням - але, як ви тут вказали, це не так. Це дає вам можливість використовувати його дляSecurityProtocol
Дон Чіддл,

17
Не відповідаю на цю відповідь, оскільки вона надає багато корисної інформації, але реалізація версії протоколу з твердим кодом не є хорошою ідеєю, оскільки це обмежить програму від використання найкращого доступного шифрування і може призвести до проблем із безпекою. Зміни в реєстрі, щоб змінити поведінку за замовчуванням .Net, щоб фактично підтримувати сучасні протоколи, дуже бажано. (Однак варто зазначити, що зміна реєстру також вимикає SSL v3.)
AJ Henderson

6
На FW 4.6 та 4.7 тепер SecurityProtocolType.Tls | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12за замовчуванням передбачено підтримку.microsoft.com
Ian Kemp

68

Ви можете змінити поведінку за замовчуванням у наступному реєстрі:

Key  : HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework\v4.0.30319 
Value: SchUseStrongCrypto
Type: REG_DWORD
Data : 1

і

Key  : HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\.NETFramework\v4.0.30319
Value: SchUseStrongCrypto
Type: REG_DWORD
Data : 1

Детальніше див. У впровадженніServicePointManager .


Дякую, я про це не знав. Я тестую це. Я створив сценарій потужності, щоб встановити його: gist.github.com/lukehutton/ab80d207172a923401b1
Люк Хаттон

6
Зміна реєстру не виглядає вдалим рішенням. Якщо програма хоче підтримувати TLS1, програма повинна відповідати цим питанням. Не працює середовище. В іншому випадку це може зашкодити іншим програмам або призвести до пекла від розгортання та оновлення програми.
Михайло Г

13
@MikhailG зовсім навпаки. Зміна реєстру є кращим методом. SChannel забезпечує абстрагування базових переговорів, і ви хочете, щоб ваша програма використовувала будь-який найвищий рівень безпеки. Штучне обмеження цього програмного забезпечення призводить до виникнення майбутніх проблем, коли випускаються нові протоколи і ваше програмне забезпечення не може їх використовувати. Було б непогано, якби була можливість сказати, що в програмному забезпеченні використовувати лише краще, ніж даний протокол, але для цього немає жодного варіанту, не заважаючи майбутнім версіям працювати. Але відключив SSL v3 з цією зміною, хоча ..
AJ Henderson

13
Командний рядок: reg add HKLM\SOFTWARE\Microsoft\.NETFramework\v4.0.30319 /v SchUseStrongCrypto /t REG_DWORD /d 1 /reg:64(та / або /reg:32)
Кевін Сміт

7
@MikhailG: Налаштування реєстру не заважає програмам підтримувати старіші протоколи. Він змінює лише параметри за замовчуванням (до яких зараз належить tls 1.0). Крім того, поведінка за замовчуванням у .Net 4.6+ і більше - використовувати сильну криптовалюту; у такому випадку ця запис у реєстрі буде корисним лише як засіб відключення сильної криптовалюти.
Брайан

51

Створіть текстовий файл із .regрозширенням та наступним вмістом:

Windows Registry Editor Version 5.00

[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://tls1test.salesforce.com/s/NET40-Enable-TLS-1_2.reg

Двічі клацніть для встановлення ...


3
Надане вами посилання, мабуть, має проблеми із сертифікатом SSL.
NathanAldenSr

Навіть коли я додаю ці ключі реєстру, у мене все ще є ця проблема. Будь-яка ідея?
Саміджо

@Samidjo - Яку версію .NET ви використовуєте? Відповідь Лука йде набагато детальніше, ніж моя, але, схоже, вам потрібно принаймні встановити .NET 4.5. Крім того, якщо ви щойно внесли зміни, можливо, вам доведеться переробити пул додатків. Це своєрідні здогадки, тому без деталей я можу допомогти набагато далі :)
дата

2
Нещодавно застосований патч support.microsoft.com/en-us/help/4019114/… до сервера призвів до відмови нашої програми .net 4.5.2 на https REST-запитах. Ці ключі вирішили нашу проблему.
Kleinux

21

Я виявив, що, коли я вказую лише TLS 1.2, він все ще знизиться до 1.1. System.Net.ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;

Я вказав це у способі запуску Global.asax для мого веб-додатка .net 4.5.


2
Що таке підтримуваний протокол безпеки на сервері? Я вважаю, що і тут є фактором, і, можливо, 1,1 є останнім на сервері. www.passionatecoder.ca
Есан

14
Оновлено, тому що це єдина відповідь, де зазначено, куди слід поставити рядок коду, який є рішенням.
jgerman

1
Клієнт (наприклад, ваш C # WebClient) та Сервер (сервер API, якого ви телефонуєте) домовляться про використання найвищого протоколу, який підтримують обидва. Отже, якщо ваш клієнт підтримує TLS 1.2, але сервер лише TLS 1.1 - Клієнт буде використовувати TLS 1.1 (якщо ви не ВІДДАЛИТЕ TLS 1.1 у свого клієнта - у такому випадку вони можуть не знайти взаємно підтримуваний протокол, і клієнт помилиться)
Дон Cheadle

Довелося додати за допомогою System.Net в global.asax.cs
Патрік

16

Наступний код:

  • друкувати включені протоколи
  • друкувати наявні протоколи
  • увімкніть TLS1.2, якщо платформа підтримує її і якщо вона не включена для початку
  • відключіть SSL3, якщо він включений
  • друкувати кінцевий результат

Константи:

  • 48 - це SSL3
  • 192 - це TLS1
  • 768 - TLS1.1
  • 3072 - TLS1.2

На інші протоколи це не вплине. Це робить це сумісним з майбутніми протоколами (Tls1.3 тощо).

Код

// print initial status
    Console.WriteLine("Runtime: " + System.Diagnostics.FileVersionInfo.GetVersionInfo(typeof(int).Assembly.Location).ProductVersion);
    Console.WriteLine("Enabled protocols:   " + ServicePointManager.SecurityProtocol);
    Console.WriteLine("Available protocols: ");
    Boolean platformSupportsTls12 = false;
    foreach (SecurityProtocolType protocol in Enum.GetValues(typeof(SecurityProtocolType))) {                
        Console.WriteLine(protocol.GetHashCode());
        if (protocol.GetHashCode() == 3072){
            platformSupportsTls12 = true;
        }
    }
    Console.WriteLine("Is Tls12 enabled: " + ServicePointManager.SecurityProtocol.HasFlag((SecurityProtocolType)3072));    


// enable Tls12, if possible
    if (!ServicePointManager.SecurityProtocol.HasFlag((SecurityProtocolType)3072)){
        if (platformSupportsTls12){
            Console.WriteLine("Platform supports Tls12, but it is not enabled. Enabling it now.");
            ServicePointManager.SecurityProtocol |= (SecurityProtocolType)3072;
        } else {
            Console.WriteLine("Platform does not supports Tls12.");
        }
    }

// disable ssl3
   if (ServicePointManager.SecurityProtocol.HasFlag(SecurityProtocolType.Ssl3)) { 
      Console.WriteLine("Ssl3SSL3 is enabled. Disabling it now.");
      // disable SSL3. Has no negative impact if SSL3 is already disabled. The enclosing "if" if just for illustration.
      System.Net.ServicePointManager.SecurityProtocol &= ~SecurityProtocolType.Ssl3;                      
   }
    Console.WriteLine("Enabled protocols:   " + ServicePointManager.SecurityProtocol);

Вихідні дані

Runtime: 4.7.2114.0
Enabled protocols:   Ssl3, Tls
Available protocols: 
0
48
192
768
3072
Is Tls12 enabled: False
Platform supports Tls12, but it is not enabled. Enabling it now.
Ssl3 is enabled. Disabling it now.
Enabled protocols:   Tls, Tls12

14

Проблему я отримав, коли мій клієнт оновив TLS з 1,0 до 1,2. Моя програма використовує .net Framework 3.5 і працює на сервері. Тому я виправив це таким чином:

  1. Зафіксуйте програму

Перш ніж зателефонувати на HttpWebRequest.GetResponse (), додайте цю команду:

ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3 | SecurityProtocolType.Tls | SecurityProtocolTypeExtensions.Tls11 | SecurityProtocolTypeExtensions.Tls12;

Розширення 2 DLL, додавши 2 нові класи: System.Net і System.Security.Authentication

    namespace System.Net
    {
        using System.Security.Authentication;
        public static class SecurityProtocolTypeExtensions
        {
            public const SecurityProtocolType Tls12 = (SecurityProtocolType)SslProtocolsExtensions.Tls12;
            public const SecurityProtocolType Tls11 = (SecurityProtocolType)SslProtocolsExtensions.Tls11;
            public const SecurityProtocolType SystemDefault = (SecurityProtocolType)0;
        }
    } 

    namespace System.Security.Authentication
    {
        public static class SslProtocolsExtensions
        {
            public const SslProtocols Tls12 = (SslProtocols)0x00000C00;
            public const SslProtocols Tls11 = (SslProtocols)0x00000300;
        }
    } 
  1. Оновити пакет Microsoft

Завантажити пакет:

  • Для Windows 2008 R2: windows6.1-kb3154518-x64.msu
  • Для Windows 2012 R2: windows8.1-kb3154520-x64.msu

Для завантаження партії та додаткову інформацію ви можете побачити тут:

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


1
чи можливо змінити SecurityProtocol без зміни вихідного коду? як-от machine.config або app.config.
аханкенді

1
Ого. Це нагорода року року ... продукт ... саме там. Ви гойдаєте околиці!
granadaCoder

14

Механізм зміни реєстру працював у мене після боротьби. Насправді моя програма працювала як 32-біт. Тому мені довелося змінити значення, яке знаходиться під контуром.

HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft.NETFramework\v4.0.30319

Тип значення повинен бути DWORD і значення вище 0. Краще використовувати 1.Налаштування реєстру для отримання додатка .Net 4.0 використовує TLS 1.2, наданий .Net 4.5 встановлений на машині.


Це не точно. Для .NET 4.5.2 це потрібно встановити на 1 (або вище); але для .NET 4.6 достатньо не встановлювати значення 0 (тобто його можна не встановити).
Jirka Hanika

Ой, я не тестував. Net 4.6. Мої висновки перебувають у блозі пошта joymonscode.blogspot.com/2015/08/…
Joy George Kunjikkuru

Ключ реєстру, який ви згадуєте, повинен читати "Wow6432Node". Ви пропустили частину "Вузол" чомусь. Я спробував відредагувати вашу відповідь, але моя зміна склала лише 4 літери, тому це не дозволило мені. : \
Jeffrey LeCours

Мені довелося підстрибувати IIS, щоб ця настройка була активною як стандартна.
Джефф Мітчелл

10

Я працюю під .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+ і передаю більше відповідальності за вибір відповідного протоколу до ОС , Я прийняв такий код:

SecurityProtocolType securityProtocols = ServicePointManager.SecurityProtocol;
if (securityProtocols.HasFlag(SecurityProtocolType.Ssl3) || securityProtocols.HasFlag(SecurityProtocolType.Tls) || securityProtocols.HasFlag(SecurityProtocolType.Tls11))
{
    securityProtocols &= ~(SecurityProtocolType.Ssl3 | SecurityProtocolType.Tls | SecurityProtocolType.Tls11);
    if (securityProtocols == 0)
    {
        securityProtocols |= SecurityProtocolType.Tls12;
    }
    ServicePointManager.SecurityProtocol = securityProtocols;
}

Цей код виявить, коли відомий незахищений протокол включений, і в цьому випадку ми видалимо ці незахищені протоколи. Якщо ніяких інших явних протоколів не залишилося, ми змусимо ввімкнути TLS 1.2, як єдиний відомий захищений протокол, який підтримує .NET на даний момент часу. Цей код вперед сумісний, оскільки він буде враховувати нові типи протоколів, які він не знає про додавання в майбутньому, а також буде добре грати з новимSystemDefaultстану в .NET 4.7, тобто мені не доведеться повторно відвідувати цей код у майбутньому. Я настійно рекомендую прийняти такий підхід, а не жорстке кодування будь-якого конкретного протоколу безпеки беззастережно, інакше вам доведеться перекомпілювати та замінити клієнта новою версією, щоб оновити до нового протоколу безпеки, коли TLS 1.2 неминуче порушено, або, швидше за все, вам доведеться залишати наявні незахищені протоколи, включені роками на вашому сервері, роблячи вашу організацію мішенню для атак.


1
Ця відповідь здається найбільш продуманою, однак, якщо я щось не пропускаю, я не впевнений, що вона буде сумісною вперед, коли TLS 1.2 неминуче порушується. З того, що я бачу в моєму додатку .NET 4.7.2, SecurityProtocolType.SystemDefaultпрапор оцінюється на 0, тому перевірка if (securityProtocols == 0)за посиланням на біт включно або прапор TLS 1.2 завжди буде включати TLS 1.2, навіть після того, як він "перерви", правда? Тут не різка стрілянина. Я щиро намагаюся знайти найкращий шлях вперед.
Griswald_911

Я змінив свій код , щоб включити це і він , як видається , працювати і бути сумісними: if (!Enum.IsDefined(typeof(SecurityProtocolType), 0) && securityProtocols == 0) { securityProtocols |= SecurityProtocolType.Tls12; }.
Griswald_911

@ Griswald_911, у мене в консольній програмі 4.7.2 є подібний код, і я виявив, що цей рядок securityProtocols |= SecurityProtocolType.Tls12;(без блоку) не підтримує SystemDefault, у SecurityProtocols після цього є лише TLS2. Отже, ви маєте на увазі, коли значення SystemDefault, жодне значення не слід оновлювати? Що стосується сумісного прямого переходу, ви припускаєте, що ОС подбає про включення новішого протоколу, наприклад TLS 1.3?
Ян

@Yang - Правильно. У рядку securityProtocols |= SecurityProtocolType.Tls12;' will add TLS 1.2, but because the SecurityProtocolType [Flags]` enum є атрибут, а значення перерахунку 0SystemDefault - значення SystemDefault буде знято, навіть якщо воно було раніше встановлено. Кінцевим результатом є те, що ви можете встановити значення SevicePointManager.SecurityProtocol 0 або будь-яку комбінацію інших значень перерахування. Якщо встановити його на SystemDefault, ви в основному відмовляєтесь від конкретизації протоколу і дозволяєте ОС вирішувати.
Griswald_911

1
@Yang - Справа в тому, що, встановивши значення SystemDefault, ваш додаток повинен використовувати все, що вказує ОС - що є TLS 1.2 в останніх версіях Windows 10. Ідея полягає в тому, що в майбутньому, коли TLS 1.3 стане стандарт, вам не потрібно було б змінювати свою програму, щоб успадкувати цю функціональність. Дивіться тут документацію , де SystemDefault "дозволяє операційній системі вибирати найкращий протокол для використання та блокувати незахищені протоколи".
Griswald_911

6

Microsoft нещодавно опублікувала найкращі практики щодо цього. https://docs.microsoft.com/en-us/dotnet/framework/network-programming/tls

Підсумок

Націліть .Net Framework 4.7, видаліть будь-який код, що встановлює SecurityProtocol, таким чином ОС забезпечить використання найбільш безпечного рішення.

Примітка: Вам також потрібно буде забезпечити підтримку та включення останньої версії TLS у вашій ОС.

OS                          TLS 1.2 support

Windows 10                  \_ Supported, and enabled by default.
Windows Server 2016         /   
Windows 8.1                 \_ Supported, and enabled by default.
Windows Server 2012 R2      /
Windows 8.0                 \_ Supported, and enabled by default.
Windows Server 2012         /
Windows 7 SP1               \_ Supported, but not enabled by default*.
Windows Server 2008 R2 SP1  /
Windows Server 2008         -  Support for TLS 1.2 and TLS 1.1 requires an update. See Update to add support for TLS 1.1 and TLS 1.2 in Windows Server 2008 SP2.
Windows Vista               -  Not supported.

* To enable TLS1.2 via the registry see https://docs.microsoft.com/en-us/windows-server/security/tls/tls-registry-settings#tls-12 

    Path: HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS1.2\Server

        Property: Enabled
        Type: REG_DWORD
        Value: 1

        Property: DisabledByDefault 
        Type: REG_DWORD
        Value: 0

    Path: HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS1.2\Client

        Property: Enabled
        Type: REG_DWORD
        Value: 1

        Property: DisabledByDefault 
        Type: REG_DWORD
        Value: 0

Для отримання додаткової інформації та старих рамок, перейдіть за посиланням MS.


3
Проблема полягає в тому, що tls 1.1 та tls 1.2 не працюватимуть на Windows 7 та Server 2008, якщо дотримуватися вказівок (зберігаючи SecurityProtocolType.SystemDefault), оскільки вони не "включені" (що б це не означало) в цих ОС "без зміни реєстру. Це робить SystemDefault на практиці порушеним дизайном. Microsoft справді переплутав цей.
osexpert

Хороший, дякую @osexpert, гарний улов. Я змінив відповідь, щоб включити інформацію про підтримувані ОС, тому немає сюрпризів для людей, які працюють зі старими ОС, де лише націлювання на 4.7 недостатньо.
JohnLBevan

1
NB: Також є КБ, щоб увімкнути новіші протоколи на деяких ОС: support.microsoft.com/en-my/help/3140245/…
JohnLBevan

1
Якщо налаштування реєстру не є варіантом, я думаю, що це найкраще рішення для .NET 4.7+: if (System.Environment.OSVersion.Version < new Version(6, 2) /* Windows 8 */) ServicePointManager.SecurityProtocol |= SecurityProtocolType.Tls | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12; else ServicePointManager.SecurityProtocol = SecurityProtocolType.SystemDefault;
osexpert

5

Для повноти, ось сценарій Powershell, який встановлює згадані ключі реєстру:

new-itemproperty -path "HKLM:\SOFTWARE\Microsoft\.NETFramework\v4.0.30319" -name "SchUseStrongCrypto" -Value 1 -PropertyType "DWord";
new-itemproperty -path "HKLM:\SOFTWARE\Wow6432Node\Microsoft\.NETFramework\v4.0.30319" -name "SchUseStrongCrypto" -Value 1 -PropertyType "DWord"

2

Альтернатива жорсткому кодуванню ServicePointManager.SecurityProtocolабо явному ключу SchUseStrongCrypto, як згадувалося вище:
Ви можете сказати .NET використовувати налаштування SCHANNEL за замовчуванням за допомогою клавіші SystemDefaultTlsVersions,
наприклад:

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework\v4.0.30319] "SystemDefaultTlsVersions"=dword:00000001
[HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\.NETFramework\v4.0.30319] "SystemDefaultTlsVersions"=dword:00000001

2

Найкращим рішенням цієї проблеми, як видається, є оновлення принаймні до .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 - SchUseStroWC

Результати у використанні чогось іншого, крім TLS 1.0 та потужного шифру.

У моєму тестуванні лише налаштування в Wow6432Node змінило будь-яку зміну, навіть якщо мій тестовий додаток було розроблено для будь-якого процесора.


Пояснення: вам потрібно встановити лише SevicePointManager.SecurityProtocol АБО встановити параметри реєстру. Не потрібно робити обох. Для своєї програми я вирішив просто встановити ServicePointManager.SecurityProtocol. Моє міркування полягає в тому, що встановлення реєстру впливає на всю машину, і я не хотів, щоб чужий додаток зламався, оскільки це залежало від TLS 1.0.
GWC

1

Відповідно до кращих практик безпеки транспортного шару (TLS) щодо .NET Framework : Щоб забезпечити збереження програм .NET Framework, версію TLS не слід жорстко кодувати. Замість цього встановіть ключі реєстру: SystemDefaultTlsVersions і SchUseStrongCrypto :

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\.NETFramework\v2.0.50727]
"SystemDefaultTlsVersions"=dword:00000001
"SchUseStrongCrypto"=dword:00000001

[HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\.NETFramework\v4.0.30319]
"SystemDefaultTlsVersions"=dword:00000001
"SchUseStrongCrypto"=dword:00000001

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework\v2.0.50727]
"SystemDefaultTlsVersions"=dword:00000001
"SchUseStrongCrypto"=dword:00000001

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework\v4.0.30319]
"SystemDefaultTlsVersions"=dword:00000001
"SchUseStrongCrypto"=dword:00000001

0

Якщо ви можете використовувати .NET 4.7.1 або новішу версію, він використовуватиме TLS 1.2 як мінімальний протокол на основі можливостей операційної системи. За рекомендацією Microsoft:

To ensure .NET Framework applications remain secure, the TLS version should not be hardcoded. .NET Framework applications should use the TLS version the operating system (OS) supports.

-2

Для ключа: HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft.NETFramework \ v4.0.30319 Значення: SchUseStrongCrypto

Ви повинні встановити значення в 1.


5
Я думаю, що ти неприхильний, тому що його таку ж відповідь запропонував @ Джира Марес, але з меншою кількістю деталей
Стюарт Зіглер
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.