[C#] 요청이 중단되었습니다 : SSL / TLS 보안 채널을 만들 수 없습니다

WebRequest이 오류 메시지로 인해 사용중인 HTTPS 서버에 연결할 수 없습니다 .

The request was aborted: Could not create SSL/TLS secure channel.

서버에 사용 된 경로가있는 유효한 HTTPS 인증서가 없지만이 문제를 피하기 위해 다른 StackOverflow 게시물에서 가져온 다음 코드를 사용합니다.

private void Somewhere() {
    ServicePointManager.ServerCertificateValidationCallback += new RemoteCertificateValidationCallback(AlwaysGoodCertificate);
}

private static bool AlwaysGoodCertificate(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors policyErrors) {
   return true;
}

문제는 서버가 인증서의 유효성을 검사하지 않고 위의 오류로 실패한다는 것입니다. 누구든지 내가 무엇을 해야할지에 대한 아이디어가 있습니까?


나는 동료와 몇 주 전에 테스트를 수행했으며 위에서 쓴 것과 비슷한 것으로 잘 작동하고 있다고 언급해야합니다. 우리가 발견 한 유일한 “주된 차이점”은 Windows 7을 사용하고 있고 Windows XP를 사용하고 있다는 것입니다. 그게 뭔가 바뀌나요?



답변

나는 마침내 답을 찾았다 (내 출처를 밝히지 않았지만 검색 한 것임).

코드는 Windows XP에서 작동하지만 Windows 7에서는 처음에 이것을 추가해야합니다.

// using System.Net;
ServicePointManager.Expect100Continue = true;
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;
// Use SecurityProtocolType.Ssl3 if needed for compatibility reasons

이제는 완벽하게 작동합니다.


추가

Robin French가 언급했듯이; PayPal을 구성하는 동안이 문제가 발생하면 2018 년 12 월 3 일부터 SSL3을 지원하지 않습니다. TLS를 사용해야합니다. 여기 Paypal 페이지 가 있습니다.


답변

.NET 4.5에서 이에 대한 솔루션은

ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;

.NET 4.5가 없다면

ServicePointManager.SecurityProtocol = (SecurityProtocolType)3072;


답변

HttpWebRequest가 작성되기 전에 ServicePointManager 설정이 구성되어 있는지 확인하십시오. 그렇지 않으면 작동하지 않습니다.

공장:

        ServicePointManager.Expect100Continue = true;
        ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls
               | SecurityProtocolType.Tls11
               | SecurityProtocolType.Tls12
               | SecurityProtocolType.Ssl3;

        HttpWebRequest request = (HttpWebRequest)WebRequest.Create("https://google.com/api/")

실패 :

        HttpWebRequest request = (HttpWebRequest)WebRequest.Create("https://google.com/api/")

        ServicePointManager.Expect100Continue = true;
        ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls
               | SecurityProtocolType.Tls11
               | SecurityProtocolType.Tls12
               | SecurityProtocolType.Ssl3;


답변

당신이 겪고있는 문제는 aspNet 사용자가 인증서에 액세스 할 수 없다는 것입니다. winhttpcertcfg.exe를 사용하여 액세스 권한을 부여해야합니다.

설정 방법에 대한 예는 다음과 같습니다.
http://support.microsoft.com/kb/901183

자세한 정보의 2 단계에서

편집 : 최신 버전의 IIS에서이 기능은 인증서 관리자 도구에 내장되어 있으며 인증서를 마우스 오른쪽 단추로 클릭하고 개인 키 관리 옵션을 사용하여 액세스 할 수 있습니다. 자세한 내용은 /server/131046/how-to-grant-iis-7-5-access-to-a-certificate-in-certificate-store/132791#132791


답변

이 오류는 일반적이며 SSL / TLS 협상이 실패 할 수있는 여러 가지 이유가 있습니다. 가장 일반적인 것은 유효하지 않거나 만료 된 서버 인증서이며, 자체 서버 인증서 유효성 검사 후크를 제공하여이를 처리했지만 반드시 유일한 이유는 아닙니다. 서버가 상호 인증을 요구할 수도 있고, 클라이언트가 지원하지 않는 일련의 암호로 구성 될 수도 있습니다. 핸드 셰이크가 성공하기에는 시간이 너무 길어서 더 많은 이유가있을 수 있습니다.

가장 좋은 솔루션은 SChannel 문제 해결 도구 세트를 사용하는 것입니다. SChannel은 SSL 및 TLS를 담당하는 SSPI 공급자이며 클라이언트는 핸드 셰이크에이를 사용합니다. TLS / SSL 도구 및 설정을 살펴보십시오 .

Schannel 이벤트 로깅을 사용하는 방법 도 참조하십시오 .


답변

이 문제는 https://ct.mob0.com/Styles/Fun.png 하려고 시도했습니다 .SPDY 및 이상한 리디렉션 SSL 인증서와 같은 미친 물건을 지원하는 CDN에 CloudFlare가 배포 한 이미지입니다.

Simons 답변에서 Ssl3을 지정하는 대신 다음과 같이 Tls12로 이동하여 해결할 수있었습니다.

ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;
new WebClient().DownloadData("https://ct.mob0.com/Styles/Fun.png");


답변

이 같은 문제로 오랜 시간이 지난 후에 클라이언트 서비스가 실행중인 ASP.NET 계정이 인증서에 액세스 할 수 없다는 것을 알았습니다. 웹 응용 프로그램이 실행되는 IIS 응용 프로그램 풀로 이동하여 고급 설정으로 이동하여 ID를에서 LocalSystem계정으로 변경하여 문제를 해결했습니다 NetworkService.

더 나은 솔루션은 기본 NetworkService계정 으로 인증서를 작동시키는 것이지만 빠른 기능 테스트에 효과적입니다.