2014-10-16 2 views
68

은 이제 SSL 3은 POODLE 공격에 취약한 것으로 밝혀졌다?System.Net.WebRequest를 지원하는 SSL/TLS 버전은 무엇입니까? 어떤 HTTPS 열린 우리당에</p> <p>SSL/TLS 버전은 System.Net.WebRequest 사용 연결 않습니다

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

+0

서버 (또는 중간에있는 사람)가 요청할 경우 WebRequest를 SSL 3으로 대체 할 예정입니까? –

+0

내가 잘못 본 것이 아니라면 WebRequest는 당겨 받기를 시도하는 서버의 보안 인증서를보고 웹 서버에있는 암호화 스키마를 사용한다고 생각합니다. 나는 당신이 클라이언트 측에서 아무 것도 변경할 필요가 없다고 생각합니다. – Icemanind

+1

방금 ​​SSL3을 지원하지 않는다고 말한 API 소유자가 자신의 서버가 클라이언트에게 SSL3을 사용하도록 요청하지 않았 으면 좋겠다고 생각했습니다. –

답변

42

System.Net.WebRequest를 사용할 때 응용 프로그램은 서버와 협상하여 응용 프로그램과 서버가 모두 지원하는 가장 높은 TLS 버전을 결정하고이를 사용합니다. 이 여기에 어떻게 작동하는지 당신은에 대한 자세한 내용을 볼 수 있습니다 : 서버가 SSL로 폴백합니다 TLS를 지원하지 않는

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

경우, 따라서 잠재적으로 SSL3에 폴백 할 수있다. 당신이 당신의 응용 프로그램이에 따라 실행되는 컴퓨터에 SSL3을 해제 할 수 있습니다 푸들에 취약되는 응용 프로그램을 방지하기 위해

http://msdn.microsoft.com/en-us/library/system.security.authentication.sslprotocols(v=vs.110).aspx

: 당신은 .NET 4.5 여기에 지원하는 모든 버전을 볼 수 있습니다 설명 :

https://serverfault.com/questions/637207/on-iis-how-do-i-patch-the-ssl-3-0-poodle-vulnerability-cve-2014-3566

+14

WebRequest 및 HttpWebRequest와 같은 * outbound * 요청을 안전하게하려면 SSL을 사용하지 않도록 설정해야합니다. 대체 질문 : http://stackoverflow.com/questions/26389899/how-do-i-disable-ssl-fallback-and-use-only-tls-for-outbound-connections-in-net. 기본적으로이 코드 줄을 먼저 실행하십시오. ** System.Net.ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12; **이 질문에 답하는 레지스트리 수정은 인바운드 연결에만 적용됩니다. –

+0

.net 프레임 워크 3.5 이하에서만 'SecurityProtocolType.Tls' 옵션 (따라서 TLS 1.0)을 사용할 수 있습니다. –

+0

System.Net.WebRequest를 제거하고 RestSharp와 같은 다른 라이브러리를 사용하거나 더 높은 TLS 지원을받을 수 있습니까? 그것은 업그레이 드해야 실제. NET 프레임 워크? –

39

이것은 중요한 질문이다. SSL 3 프로토콜 (1996)은 2014 년에 발표 된 푸들 공격으로 돌이킬 수 없게 깨졌습니다. IETF는 "SSLv3 MUST NOT be used"을 게시했습니다. 웹 브라우저가 그것을 버리고 있습니다. Mozilla FirefoxGoogle Chrome은 이미 그렇게했습니다.

브라우저에서 프로토콜 지원을 확인하는 데 유용한 두 가지 도구는 SSL Lab's client testhttps://www.howsmyssl.com/입니다. 후자는 자바 스크립트를 필요로하지 않는다, 그래서 당신은 .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 공격에 사용할 수있는 암호 스위트가 없습니다. MD5-SHA-1을 대체 할 AES-GCM 및 SHA256과 같은 추가 기능은 TLS 1.0 클라이언트뿐만 아니라 더 많은 현대 암호 제품군에서 사용할 수 없습니다.

그건 그렇습니다. 내가 .NET 프레임 워크 4.6.2을 사용하고

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))); 

: 그것은 정확히 HTTP 클라이언트가 지원하는 프로토콜을 나열하려면 2006의 인터넷 익스플로러 7

비교, 당신은 아래의 버전 별 테스트 서버를 시도 할 수 있습니다 . HttpClient가 SSL 3 및 TLS 1.0 만 지원한다는 사실을 발견했습니다. 그건 관련이 있습니다. 그것은 TLS 1.1 및 1.2을 지원 HttpClient를 회전,하지만 당신은 System.Net.ServicePointManager.SecurityProtocol에서 수동으로 설정해야 :이 업데이트


2006의 인터넷 익스플로러 7과 비교입니다.https://stackoverflow.com/a/26392698/284795

왜 나쁜 프로토콜을 사용하는지 모르겠다. 그게 가난한 설치 선택, 주요 보안 버그 (나는 많은 응용 프로그램이 기본값을 변경하지 않을 내기와 동일) 보인다. 어떻게 신고 할 수 있습니까?

+0

대단히 감사합니다! – Kate

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

당시에는이 기능을 암시하는 결정적이지 않은 설명서가있었습니다 (https://msdn.microsoft.com/en-us/library/system.net.security.sslstream(v=vs.110).aspx 바로 위 참조). 예). 그러나 TLS 1.2에 고정 된 서버로 테스트 프로그램을 작성하고 웹 요청을 사용하여 페이지를 다운로드하고 테스트 페이지를 다운로드하여이를 확인했습니다. 그런 다음 프로그램의 프레임 워크 버전을 변경했습니다. 모든 하위 버전은 연결에 실패했지만 .Net 4.6이 문제없이 연결되었습니다. –

+0

세부 정보 주셔서 감사합니다. 많은 API 제공자가 4.5가 TLS 1.2에 연결하지 않지만 모든 공식 문서를 제공하는 데 어려움을 겪었고 커뮤니티에 의존해야한다는 것을 알고 있습니다. – felickz

관련 문제