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


81

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

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

WebRequest를 사용하여 여러 타사 API에 연결합니다. 이들 중 하나는 이제 SSL 3을 사용하는 모든 요청을 차단할 것이라고 말했습니다. 그러나 WebRequest는 .Net 코어 프레임 워크 (4.5 사용)의 일부이므로 어떤 버전을 사용하는지 명확하지 않습니다.


서버 (또는 중간에있는 사람)가 요청하면 WebRequest가 SSL 3으로 대체됩니까?
Philip Pittle 2014 년

내가 착각하지 않았다면 WebRequest는 풀려는 서버의 보안 인증서를보고 웹 서버에있는 암호화 스키마를 사용한다고 생각합니다. 클라이언트 측에서 아무것도 변경할 필요가 없다고 생각합니다.
Icemanind 2014 년

1
SSL3을 지원하지 않을 것이라고 방금 말한 API 소유자가 클라이언트가 SSL3을 사용하도록 요청하지 않았는지 확인하기를 바랍니다
.

@iceman SSL3을 지원하는지 여부를 인증서에서 알 수있는 방법이 있습니까? 버전과 관련된 속성이 표시되지 않습니다.
JK.

@JK. -다른 브라우저는 잘 모르겠지만 Chrome을 사용하고 있습니다. Chrome에서 HTTPS 웹 사이트 (예 : Wellsfargo.com)로 이동하면 URL 근처에 녹색 자물쇠가 표시됩니다. 해당 자물쇠를 클릭 한 다음 연결 탭을 클릭하면 표시됩니다. wellsfargo.com의 경우 Chrome에 "연결에 TLS 1.0을 사용합니다"라고 표시됩니다. IE와 다른 브라우저는 동일한 것을 보여야합니다.
Icemanind 2014 년

답변:


51

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을 비활성화 할 수 있습니다.

/server/637207/on-iis-how-do-i-patch-the-ssl-3-0-poodle-vulnerability-cve-2014-3566


20
WebRequest 및 HttpWebRequest와 같은 아웃 바운드 요청을 안전하게 만들려면 stackoverflow.com/questions/26389899/…의 내 질문에 자세히 설명 된대로 SSL 폴백을 비활성화하는 단계를 따라야합니다 . 기본적으로이 코드 줄을 먼저 실행합니다. System.Net.ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12; 내가 이해하는 대로이 답변에 자세히 설명 된 레지스트리 수정은 인바운드 연결에만 적용됩니다.
Jordan Rieger 2015

1
SecurityProtocolType.Tls.net 프레임 워크 3.5 이하 에서는 옵션 (따라서 TLS 1.0) 만 있습니다
James Westgate 2015 년

System.Net.WebRequest를 버리고 RestSharp와 같은 다른 라이브러리를 사용하여 더 높은 TLS 지원을받을 수 있습니까? 아니면 업그레이드해야하는 실제 .net 프레임 워크입니까?
머핀 맨

이것이 업그레이드가 필요한 실제 .net 프레임 워크라고 생각합니다. www.passionatecoder.ca
Ehsan

1
@JamesWestgate TLSOS / 기계 수준에서 실제로 구현 될 것이라는 인상을 받았습니다 . 실제 HTTP 트래픽이 발생하는 곳이 아닌가요? 따라서 실제로 OS에 의해 결정된 특정 TLS를 사용하도록 코드에 지시하는 것은 말이되지 않는다고 생각합니다.
Don Cheadle

52

이것은 중요한 질문입니다. 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를

왜 그것이 바로 잘못된 프로토콜을 사용하는지 모르겠습니다. 그것은 잘못된 설정 선택으로 보이며 주요 보안 버그에 해당합니다 (많은 응용 프로그램이 기본값을 변경하지 않을 것입니다). 어떻게 신고 할 수 있습니까?


어떤 프로토콜 을 사용해야 합니까?
Kiquenet

8

나는 또한 거기에 대답을 넣었지만 @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 이상 프레임 워크로 업그레이드하는 경우 해당 강제를 제거하는 일부 유형의 이동 경로를 남겨 두는 것이 좋습니다.


2
"TLS1.2에 대한 협상은 기본적으로 .Net 4.6에서 활성화됩니다."이에 대한 문서가 있습니까?
felickz

2
당시 우리는이 기능을 암시하는 결정적이지 않은 문서를 발견 했습니다 (예제 바로 위에있는 msdn.microsoft.com/en-us/library/… 참조 ). 그러나 TLS 1.2로 잠긴 서버로 테스트 프로그램을 만들고 웹 요청을 사용하여 페이지를 다운로드하여이를 확인했습니다. 그런 다음 프로그램에서 프레임 워크 버전을 변경했습니다. 모든 하위 버전은 연결에 실패했지만 .Net 4.6은 문제없이 연결되었습니다.
Prof Von Lemongargle

세부 주셔서 감사합니다, 나는 많은 API 제공 업체는 4.5 TLS 1.2에 연결되지 않음을 지적 볼 수 있지만 내가 어떤 공식적인 문서를 제공하기 위해 노력하고 지역 사회 :)에 의존해야했다
felickz

이것은 정확하고 갈 길입니다. 현재 TLS를 주장하는 웹 엔드 포인트와 통신하는 오래된 서버가 많이 있습니다. 웹 서비스 참조가 SSL / TLS 오류와 함께 실패하기 시작했습니다. 레지스트리를 해킹 할 수 있지만 서버를 최신 .NET 버전으로 업그레이드하는 것이 더 쉽고 안전합니다.
Neil Laslett
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.