https를 사용하여 SSL 암호화 사이트에 액세스하려면 WebRequest를 어떻게 사용합니까?


116

사용자가 제공 한 URL에서 콘텐츠를 읽는 프로그램을 작성 중입니다. 내 문제는 다음과 같은 코드에 있습니다.

Uri uri = new Uri(url);
WebRequest webRequest = WebRequest.Create(uri);
WebResponse webResponse = webRequest.GetResponse();
ReadFrom(webResponse.GetResponseStream());

제공된 URL 이 "https : //"URL 인 경우 이는 중단됩니다 . 누구든지 SSL 암호화 콘텐츠에서 작동하도록이 코드를 변경하는 데 도움을 줄 수 있습니까? 감사.

답변:


175

올바른 방법으로 수행하고 있지만 사용자가 잘못된 SSL 인증서가 설치된 사이트에 URL을 제공 할 수 있습니다. 실제 웹 요청을하기 전에 다음 줄을 입력하면 이러한 인증서 문제를 무시할 수 있습니다.

ServicePointManager.ServerCertificateValidationCallback = new System.Net.Security.RemoteCertificateValidationCallback(AcceptAllCertifications);

어디로 AcceptAllCertifications정의

public bool AcceptAllCertifications(object sender, System.Security.Cryptography.X509Certificates.X509Certificate certification, System.Security.Cryptography.X509Certificates.X509Chain chain, System.Net.Security.SslPolicyErrors sslPolicyErrors)
{
    return true;
}

41
이 답변에 감사드립니다! 쓸모없는 코드를 피하기 위해 다음과 같이 사용했습니다. ServicePointManager.ServerCertificateValidationCallback = (s, cert, chain, ssl) => true;
Charles Ouellet 2011 년

4
감사합니다. 도와 주셨습니다. : F #이 너무 쉽게ServicePointManager.ServerCertificateValidationCallback <- Security.RemoteCertificateValidationCallback (fun _ _ _ _ -> true)
데이비드 Grenier의

2
@Charles Ouellet 나는 내가 당신보다 더 게으른 것 같아요, (a, b, c, d) => true
Despertar

24
나는 선호한다+= delegate { return true; }
vkrzv 2012-08-24

2
이 접근 방식과 관련된 잠재적 위험에 유의하십시오. 자세한 내용은 stackoverflow.com/a/6613434/2969615 를 참조하십시오.
Joe Coyle

19

이 링크는 당신의 관심을 끌 것입니다 : http://msdn.microsoft.com/en-us/library/ds8bxk2a.aspx

http 연결의 경우 WebRequest 및 WebResponse 클래스는 SSL을 사용하여 SSL을 지원하는 웹 호스트와 통신합니다. SSL 사용 여부는 제공된 URI에 따라 WebRequest 클래스에서 결정합니다. URI가 "https :"로 시작하면 SSL이 사용됩니다. URI가 "http :"로 시작하면 암호화되지 않은 연결이 사용됩니다.


훌륭한 링크. 그것은 중요한 차이점입니다.
DanM7

1
귀하의 답변은 질문의 코드가 작동해야 함을 의미합니까?
Rowland Shaw

18

이것은 나를 위해 일했습니다.

ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;

1
기본값은 "Ssl2 | Tls"입니다. 내 서버에서 Tls 1.1과 1.2 만 활성화했습니다. 이것은 실제로 문제를 해결했습니다! Linux에서 nginX를 사용하는 LetsEncrypt의 경우 프로토콜이 여기에 정의되어 있습니다. /etc/letsencrypt/options-ssl-nginx.conf
Jerther

나는 이것이 다른 문제를 다루고 있다고 생각합니다. 유효하지 않은 인증서가 아니라 더 높은 TLS 버전에 관한 것입니다.
wp78de dec

나는 "기존 연결이 원격 호스트에 의해 강제로 끊겼습니다"점점되었고,이 솔루션은 나를 위해 일한
oamilkar

이것은 전역 구성이므로 요청을 설정할 때마다가 아니라 한 번만 수행하면됩니다.
Chad Hedgcock

어떻게 든 단일 요청에 대해이 작업을 수행 할 수 있습니까? ServicePointManager 오히려 글로벌 것 인 것처럼 ... 보인다
wexman
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.