Какие версии SSL / TLS делает система.Сеть.Поддержка WebRequest?

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

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

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

3 ответов


при использовании системы.Сеть.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

чтобы ваше приложение не было уязвимым для пуделя, вы можете отключить 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 или выше framework.