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

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

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

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

3 ответа

Решение

При использовании System.Net.WebRequest ваше приложение будет договариваться с сервером, чтобы определить самую высокую версию TLS, которую поддерживают ваше приложение и сервер, и использовать это. Вы можете увидеть более подробную информацию о том, как это работает здесь:

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

Если сервер не поддерживает 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) был непоправимо нарушен атакой Poodle, опубликованной в 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, См. /questions/11971338/kak-otklyuchit-rezervnyij-ssl-i-ispolzovat-tolko-tls-dlya-ishodyaschih-soedinenij-vnet-smyagchenie-pudelya/11971347#11971347

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

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

Другие вопросы по тегам