Які версії SSL / TLS підтримує System.Net.WebRequest?


81

Тепер, коли виявлено, що SSL 3 є вразливим до атаки POODLE :

Які версії SSL / TLS використовує System.Net.WebRequest при підключенні до будь-якого https Uri?

Я використовую WebRequest для підключення до декількох сторонніх API. Один із них зараз заявив, що заблокує будь-який запит, який використовує SSL 3. Але WebRequest є частиною базової основи .Net (використовуючи 4.5), тому не очевидно, яку версію він використовує.


Чи повернеться WebRequest до SSL 3, якщо сервер (або людина посередині) запитує його?
Філіп Піттл,

Якщо я не помиляюся, я думаю, що WebRequest переглядає сертифікат безпеки на сервері, який ви намагаєтеся витягнути, і використовує будь-яку схему шифрування, яка є на веб-сервері. Я не думаю, що вам потрібно щось змінювати на стороні клієнта.
Icemanind

1
Я сподівався б, що власники API, які щойно сказали, що не підтримуватимуть SSL3, подумали переконатися, що їх сервер не вимагає, щоб клієнт використовував SSL3 :)
JK.

@iceman будь-яким способом визначити із сертифіката, підтримує він SSL3 чи ні? Я не бачу жодних властивостей, пов’язаних з версіями.
Й.К.

@JK. - Я не впевнений у інших браузерах, але я використовую Chrome. У Chrome, якщо ви перейдете на веб-сайт HTTPS (наприклад, Wellsfargo.com), ви побачите зелений замок біля URL-адреси. Клацніть на цей замок, потім клацніть на вкладці підключення, і він покаже вам. У випадку з wellsfargo.com Chrome каже: "З’єднання використовує TLS 1.0". IE та інші браузери повинні показувати те саме подібне.
Icemanind

Відповіді:


51

При використанні System.Net.WebRequest ваша програма веде переговори із сервером, щоб визначити найвищу версію TLS, яку підтримує як ваша програма, так і сервер, і використовувати це. Детальніше про те, як це працює, можна переглянути тут:

http://en.wikipedia.org/wiki/Transport_Layer_Security#TLS_handshake

Якщо сервер не підтримує TLS, він повернеться до SSL, тому він потенційно може повернутися до SSL3. Ви можете переглянути всі версії, які підтримує .NET 4.5:

http://msdn.microsoft.com/en-us/library/system.security.authentication.sslprotocols(v=vs.110).aspx

Щоб запобігти вразливості програми до POODLE, ви можете вимкнути SSL3 на машині, на якій працює ваша програма, дотримуючись цього пояснення:

/server/637207/on-iis-how-do-i-patch-the-ssl-3-0-poodle-vulnerability-cve-2014-3566


20
Я б запропонував, щоб зробити безпечними такі вихідні запити, як WebRequest та HttpWebRequest, слід виконати кроки, щоб вимкнути резервну копію SSL, як описано в моєму запитанні на stackoverflow.com/questions/26389899/… . В основному ви спочатку запускаєте цей рядок коду: System.Net.ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12; Як я розумію, виправлення у реєстрі, докладно описане у цій відповіді, стосується лише вхідних з'єднань.
Джордан Рігер,

1
Зверніть увагу, що у вас є можливість SecurityProtocolType.Tls(і, отже, TLS 1.0) лише в .net framework 3.5 або нижче
James Westgate

Чи можу я отримати вищу підтримку TLS, відмовившись від System.Net.WebRequest та використовуючи іншу бібліотеку, таку як RestSharp, чи це справжній фреймворк .net, який потрібно оновити?
The Muffin Man

Я вважаю, що це справжній фреймворк .net, який потребує оновлення. www.passionatecoder.ca
Ehsan

1
@JamesWestgate У мене склалося враження, що TLSце буде щось, що насправді буде реалізовано на рівні ОС / машини? Хіба не там відбувається фактичний HTTP-трафік? Тому я не думаю, що має сенс намагатися сказати коду використовувати певний TLS, який насправді визначається ОС.
Дон Чідл

52

Це важливе питання. Протокол SSL 3 (1996) непоправно порушений атакою Пуделя, опублікованою в 2014 році. IETF опублікував "SSLv3 НЕ МОЖЕ використовуватися" . Веб-браузери відмовляються від цього. Mozilla Firefox та Google Chrome це вже зробили.

Два чудові інструменти для перевірки підтримки протоколів у браузерах - це тестування клієнта SSL Lab та https://www.howsmyssl.com/ . Для останнього не потрібен Javascript, тому ви можете спробувати його з HttpClient .NET :

// set proxy if you need to
// WebRequest.DefaultWebProxy = new WebProxy("http://localhost:3128");

File.WriteAllText("howsmyssl-httpclient.html", new HttpClient().GetStringAsync("https://www.howsmyssl.com").Result);

// alternative using WebClient for older framework versions
// new WebClient().DownloadFile("https://www.howsmyssl.com/", "howsmyssl-webclient.html");

Результат проклятий:

Ваш клієнт використовує TLS 1.0, який є дуже старим, можливо, сприйнятливим до атаки BEAST, і не має на ньому найкращих наборів шифрів. Додатки, такі як AES-GCM та SHA256, які замінюють MD5-SHA-1, недоступні для клієнта TLS 1.0, а також для багатьох інших сучасних шифрувальних наборів.

Це стосується. Це можна порівняти з Internet Explorer 7 2006 року.

Щоб точно перерахувати, які протоколи підтримує клієнт HTTP, ви можете спробувати тестову версію серверів нижче:

var test_servers = new Dictionary<string, string>();
test_servers["SSL 2"] = "https://www.ssllabs.com:10200";
test_servers["SSL 3"] = "https://www.ssllabs.com:10300";
test_servers["TLS 1.0"] = "https://www.ssllabs.com:10301";
test_servers["TLS 1.1"] = "https://www.ssllabs.com:10302";
test_servers["TLS 1.2"] = "https://www.ssllabs.com:10303";

var supported = new Func<string, bool>(url =>
{
    try { return new HttpClient().GetAsync(url).Result.IsSuccessStatusCode; }
    catch { return false; }
});

var supported_protocols = test_servers.Where(server => supported(server.Value));
Console.WriteLine(string.Join(", ", supported_protocols.Select(x => x.Key)));

Я використовую .NET Framework 4.6.2. Я виявив, що HttpClient підтримує лише SSL 3 і TLS 1.0. Це стосується. Це можна порівняти з Internet Explorer 7 2006 року.


Оновлення: виявляється, HttpClient підтримує TLS 1.1 та 1.2, але їх потрібно вмикати вручну за адресою System.Net.ServicePointManager.SecurityProtocol. Подивитися Https://stackoverflow.com/a/26392698/284795

Не знаю, чому він використовує погані протоколи нестандартно. Це здається поганим вибором налаштування, рівнозначним серйозній помилці безпеки (я впевнений, що багато програм не змінюють за замовчуванням). Як ми можемо повідомити про це?


Який протокол я повинен використовувати ?
Кікенет

8

Я також дав там відповідь, але стаття @Colonel Panic в оновлення посилається на те, що потрібно примусити TLS 1.2. У майбутньому, коли TLS 1.2 порушено або просто замінено, прилипання вашого коду до TLS 1.2 буде вважатися недоліком. Переговори з TLS1.2 увімкнено в .Net 4.6 за замовчуванням. Якщо у вас є можливість оновити джерело до .Net 4.6, я настійно рекомендую змінити примусове використання TLS 1.2.

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


2
"Переговори до TLS1.2 увімкнено в .Net 4.6 за замовчуванням" чи є у вас документація для цього?
felickz

2
Тоді ми знайшли непереконливу документацію, яка натякала на цю функцію (див. Msdn.microsoft.com/en-us/library/… трохи вище прикладів). Однак ми перевірили це, створивши тестову програму із сервером, який був заблокований до TLS 1.2 та використовував веб-запит, щоб спробувати завантажити сторінку. Потім ми змінили версії фреймворку в програмі. Всі версії нижчого рівня не змогли підключитися, але .Net 4.6 підключився без проблем.
Професор фон Лемонгаргле

Дякую за подробиці, я бачу, що стільки постачальників API вказують, що 4.5 не підключається до TLS 1.2, але я намагався надати будь-яку офіційну документацію і
мусив

Це правильно і шлях. У нас є низка старих серверів, що розмовляють із веб-кінцевими точками, які зараз наполягають на TLS. Посилання на веб-служби почали давати збій із помилками SSL / TLS. Ви можете зламати реєстр, але оновити сервер до останньої версії .NET простіше та безпечніше.
Ніл Ласлетт,
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.