Какие версии протоколов SSL и TLS делает система.Чистая.Запросы WebRequest поддержки?


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

какие версии протоколов SSL и TLS делает система.Чистая.Запросы WebRequest использовать при подключении Ури протоколу HTTPS?

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

3 73

3 ответа:

при использовании 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

Это важный вопрос. Протокол 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, который очень стар, возможно, восприимчив к атаке зверя и не имеет лучших наборов шифров, доступных на нем. Дополнения, такие как 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

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

Я также поставил там ответ, но обновление статьи @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 или более поздней версии.