Подтвердить что ты не робот

Какие версии SSL/TLS поддерживают System.Net.WebRequest?

Теперь, когда обнаружено, что SSL 3 уязвим для атаки POODLE:

Какие версии SSL/TLS используют System.Net.WebRequest для подключения к любому https Uri?

Я использую WebRequest для подключения к нескольким сторонним API. Один из них теперь сказал, что они заблокируют любой запрос, который использует SSL 3. Но WebRequest является частью .Net core framework (используя 4.5), поэтому неясно, какую версию он использует.

4b9b3361

Ответ 1

При использовании 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 на машине, на которой работает ваше приложение, следуя этому объяснению:

https://serverfault.com/questions/637207/on-iis-how-do-i-patch-the-ssl-3-0-poodle-vulnerability-cve-2014-3566

Ответ 2

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

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

// 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. См. fooobar.com/questions/63591/...

Я не знаю, почему он использует плохие протоколы. Это кажется плохим выбором настройки, равносильным серьезной ошибке безопасности (я считаю, что множество приложений не меняют значение по умолчанию). Как мы можем сообщить об этом?

Ответ 3

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

Если вы навязываете TLS 1.2, решительно подумайте о том, чтобы оставить какой-то тип breadcrumb, который удалит эту силу, если вы обновите до 4.6 или более поздней версии.