Programing

System.Net.WebRequest가 지원하는 SSL / TLS 버전은 무엇입니까?

lottogame 2020. 10. 15. 07:21
반응형

System.Net.WebRequest가 지원하는 SSL / TLS 버전은 무엇입니까?


이제 SSL 3이 POODLE 공격에 취약한 것으로 밝혀졌습니다 .

https Uri에 연결할 때 System.Net.WebRequest가 사용하는 SSL / TLS 버전은 무엇입니까?

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 FirefoxGoogle 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을 사용하고 있습니다. TLS 1.0은 매우 오래되어 BEAST 공격에 취약 할 수 있으며 사용할 수있는 최상의 암호 제품군이 없습니다. MD5-SHA-1을 대체하기위한 AES-GCM 및 SHA256과 같은 추가 기능은 TLS 1.0 클라이언트와 더 많은 최신 암호 제품군에서 사용할 수 없습니다.

그게 문제입니다. 2006의 Internet Explorer 7과 비슷합니다.

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 만 지원한다는 것을 알았습니다. 그게 문제입니다. 이것은 2006의 Internet Explorer 7과 비슷합니다.


업데이트 : 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 이상 프레임 워크로 업그레이드 할 경우 해당 강제를 제거하는 일부 유형의 이동 경로를 남겨 두는 것이 좋습니다.

참고URL : https://stackoverflow.com/questions/26414424/which-versions-of-ssl-tls-does-system-net-webrequest-support

반응형