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

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

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

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

При использовании 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, который очень старый, возможно, восприимчив к атаке BEAST и не имеет на нем лучших наборов шифров. Дополнения, такие как AES-GCM и SHA256 для замены MD5-SHA-1, недоступны клиенту TLS 1.0, а также многим более современным наборам шифров.

Это касается. Это сопоставимо с Internet Explorer 7 в 2006 году.

Чтобы точно указать, какие протоколы поддерживает HTTP-клиент, вы можете попробовать следующие тестовые серверы:

 var test_servers = new Dictionary(); 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(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 или более поздней версии.

  • Проверьте, жив ли сайт из приложения C #
  • Давайте будем гением компьютера.