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


431

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를 사용하고 있다는 것입니다. 그게 뭔가 바뀌나요?



51
2018 년 이며이 질문은 308,056 번 조회되었지만 여전히 이것에 대한 올바른 해결책은 없습니다! 이 문제가 무작위로 발생하며 여기 또는 다른 스레드에서 언급 한 수정 사항으로도 문제가 해결되지 않았습니다.
Nigel Fds 2

3
@NigelFds 오류 The request was aborted: Could not create SSL/TLS secure channel는 매우 일반적인 오류 입니다. 기본적으로 "SSL / TLS / HTTPS 연결 초기화가 여러 가지 이유 중 하나로 실패했습니다"라고 말합니다. 따라서 특정 상황에서 정기적으로받는 경우 가장 좋은 방법은 해당 상황에 대한 특정 세부 정보를 제공하는 특정 질문을하는 것입니다. 자세한 내용은 이벤트 뷰어를 확인하십시오. 및 / 또는 일부 .NET 클라이언트 측 디버깅을 사용하여 자세한 정보를 얻습니다 (서버 인증서가 신뢰할 수 없습니까? 암호 불일치가 있습니까? SSL / TLS 프로토콜 버전이 일치하지 않습니까? 등).
MarnixKlooster ReinstateMonica

4
@MarnixKlooster 나는 이미 모든 것을 확인했지만, 다시 시도하는 것처럼 인증서에 문제가 될 수 없습니다. 그리고 누군가 누군가 와서 그것을 중복이나 무언가로 표시하지 않고 SO에 대해이 질문을 할 수 있을지 의심됩니다.
Nigel Fds

1
나는이 문제를 아마도 4 번째로 싸우고 있습니다. 내가 실행중인 동일한 코드베이스는 프로덕션 및 일부 동료 개발자의 개발 환경에서도 잘 작동합니다. 마지막으로, 레지스트리 값 Computer \ HKEY_LOCAL_MACHINE \ SOFTWARE \ WOW6432Node \ Microsoft \ .NETFramework \ v4.7.02046 \ SchUseStrongCrypto [DWORD] = 1을 추가하라는 지시를 받았습니다. 다른 프로젝트에서 한동안 작업을 시작했는데 이제이 프로젝트로 돌아와서이 레지스트리 키 수정으로도 요청이 다시 실패합니다. 매우 성가신.
Miguel

답변:


598

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

코드는 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 페이지 가 있습니다.


5
SecurityProtocolType.Tls12로 이동하면 실제로이 문제가 해결되었습니다. 아래 답변을 참조하십시오.
Bryan Legend

24
@LoneCoder가 SecurityProtocolType.Tls12가 SecurityProtocolType.Ssl3에 적합한 대체 권장으로 - SSLv3에 악용 18 세 푸들 지금 취약
게리

4
이 (모든 사이트 작성으로 Tls12를 지원하지)가 찾았을 악용 때까지 SecurityProtocolType.Tls 실제로 더 나은 대안이 될 수있다
게리

3
PayPal은 SSL3을 비활성화하고 TLS1.2를 구현하기 위해 2017 년 6 월 30 일 날짜를 설정했습니다. 이미 샌드 박스 환경에 적용되고 있습니다. paypal-knowledge.com/infocenter/…
Robin French

11
이것도 참조하십시오 . 독점적으로 단일 유형으로 설정할 필요는 없으며 간단히 추가 할 수도 있습니다. System.Net.ServicePointManager.SecurityProtocol |= System.Net.SecurityProtocolType.Tls12;
Nae

153

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

ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;

.NET 4.5가 없다면

ServicePointManager.SecurityProtocol = (SecurityProtocolType)3072;

10
감사합니다! .net 4.0을 사용해야하며 이것을 해결하는 방법을 몰랐습니다. 이것은 여기서 작동하는 것 같습니다. :)
Fabiano

Windows Server 2008R2에서 작동하지 않으며 2012 년에도 작동하지 않음
Misam

@billpg, 더 정확한 답변을 위해 이것을 읽으십시오
Vikrant

VB 유형의 경우 (이 답변은 Google에 표시되므로) 해당 코드는 다음과 같습니다.ServicePointManager.SecurityProtocol = DirectCast(3072, SecurityProtocolType)
ConfusionTowers

@Andrej Z는 .net 프레임 워크에서 작업하고 있습니다. 4. 감사합니다.
az fav

107

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;

4
위에서 언급 한 Works와 Fails의 차이점은 무엇입니까?
Chandy Kunhu

5
대박. 내 요청은 두 번째 시도 후에 만 ​​작동했지만 이해가되지 않았으며 귀하의 게시물을 보았고 요청 전에 보안 프로토콜을 이동하고 수정했습니다. 감사합니다 @ hogarth45
deanwilliammills

2
바로 그거죠! 요청이 생성되기 직전에 ServicePointManager를 배치했을 때 저에게 도움이되었습니다. 감사합니다. 당신은 내 하루를 저장했습니다.

1
완벽 ... 이것은 훌륭합니다
Maryam Bagheri

1
우리의 경우, 요청은 처음으로 실패했고 그 후에 작동했습니다. 이것이 바로이 답변에 언급 된 이유 때문입니다!
Mohammad Dehghan

34

당신이 겪고있는 문제는 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


winhttpcertcfg.exe 실행을 시도했습니다 ... Windows 7을 사용하고 있습니다. 변경 될 수 있습니까?
Simon Dugré

관련이 있는지 확실하지 않지만이 게시물은 VS에서 전화를 걸 때 관리자로 VS를 실행하는 아이디어를 주었고 문제가 해결되었습니다.
PFranchise

2
Windows 7 이상에서 "개인 키 관리"를 수행하려면 인증서가 현재 사용자가 아닌 로컬 컴퓨터의 저장소에 있어야합니다
Lukos

1
네, 이것은 내 문제였습니다. mmc.exe를 사용하고 인증서 스냅인을 추가하십시오 (저는 '로컬 컴퓨터'를 선택했습니다). 인증서, 모든 작업을 마우스 오른쪽 단추로 클릭하고 개인 키를 관리하십시오. '모두'를 추가하십시오 (로컬 개발자에게는 가장 쉽습니다-명백한 IIS 웹 사이트 앱 풀 / 사용자가 필요합니다)
Ian Yates

@lIan Yates,이 솔루션은 저에게만 효과가있었습니다 (y)
Usman Younas

31

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

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

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


어디입니다 경로Schannel event logging있는 윈도우 7-8-10은 ?
PreguntonCojoneroCabrón

C #에서 프로그래밍 방식 으로 TLS / SSL 문제 해결 ?
Kiquenet

27

이 문제는 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");

고맙습니다 고독한 ... 상황에 따라 여러 가지 다른 문제가있을 수있는 방법에 미친 것 같습니다. 글쎄, 같은 문제를 겪을 사람을 지적 해 주셔서 감사합니다.
Simon Dugré

이것은 나를 위해 일했습니다. 사무실 LAN에서 홈 네트워크로 전환 할 때 오류가 발생했습니다. 같은 코드, 같은 노트북!
Amal

항상 (모든 요청에서) 또는 때때로 오류가 발생 합니까?
PreguntonCojoneroCabrón

24

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

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


3
이 답변에는 더 많은 투표권이 있어야합니다. 일주일의 연구 끝에, 이것이 나를 위해 일한 유일한 솔루션입니다. 감사!!
user224567893

이것은 나를 위해 일했습니다. 고마워
Emy 통계

18

설정 접근

ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12

Tls1.2는 최신 버전의 보안 프로토콜이므로 문제가없는 것 같습니다. 그러나 나는 더 깊어 보이기로 결정했고 실제로 하드 코딩해야한다고 답했습니다.

사양 : Windows Server 2012R2 x64

인터넷에서 .NetFramework 4.6+는 기본적으로 Tls1.2를 사용해야한다는 메시지가 표시됩니다. 그러나 프로젝트를 4.6으로 업데이트했을 때 아무 일도 일어나지 않았습니다. 기본적으로 Tls1.2를 사용하도록 수동으로 변경해야한다는 정보가 있습니다.

https://support.microsoft.com/en-in/help/3140245/update-to-enable-tls-1-1-and-tls-1-2-as-default-secure-protocols-in-wi

그러나 제안 된 Windows 업데이트는 R2 버전에서 작동하지 않습니다.

그러나 도움이 된 것은 레지스트리에 2 개의 값을 추가하는 것입니다. 다음 PS 스크립트를 사용하여 자동으로 추가되도록 할 수 있습니다

Set-ItemProperty -Path 'HKLM:\SOFTWARE\Wow6432Node\Microsoft\.NetFramework\v4.0.30319' -Name 'SchUseStrongCrypto' -Value '1' -Type DWord
Set-ItemProperty -Path 'HKLM:\SOFTWARE\Microsoft\.NetFramework\v4.0.30319' -Name 'SchUseStrongCrypto' -Value '1' -Type DWord

그것이 내가 찾던 것입니다. 그러나 여전히 NetFramework 4.6 이상이 왜 ... 프로토콜 값을 설정하지 않는지 질문에 대답 할 수 없습니다.


17

원래 답변에 없었던 것. 방탄을 위해 코드를 더 추가했습니다.

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

8
추가 된 SSL3 프로토콜을 권장하지 않습니다.
피터 드 브루 인

SSL3에는 '푸들'이라는 심각한 보안 문제가 있습니다.
Peter de Bruijn

@PeterdeBruijn Tls and Tls11더 이상 사용되지 않습니까?
Kiquenet

1
@ 키케 넷-예. 2018 년 6 월 현재 PCI (Payment Card Industries)는 TLS1.2보다 낮은 프로토콜을 허용하지 않습니다. (이것은 원래 06/2017로 예정되었지만 1 년 동안 연기되었습니다)
GlennG

SSL / TLS 제품군에는 SSL v2, SSL v3, TLS v1.0, TLS v1.1 및 TLS v1.2의 5 가지 프로토콜이 있습니다 . github.com/ssllabs/research/wiki/… SSL v2 unsecure, SSL v3 is insecure when used with HTTP (the POODLE attack), TLS v1.0, TLS v1.1 obsoletes 유효한 옵션 만 ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12?
Kiquenet April

14

다른 가능성은 상자에서 인증서를 잘못 가져 오는 것입니다. 둘러싸인 확인란을 선택하십시오. 처음에는하지 않았으므로 코드가 시간 초과되었거나 개인 키를 찾을 수없는 것과 동일한 예외가 발생했습니다.

인증서 가져 오기 대화 상자


클라이언트는 클라이언트 프로그램을 사용하기 위해 인증서를 다시 설치해야했습니다. 그들은 계속해서 프로그램을 사용하기 전에 인증서를 다시 설치해야했습니다. 이 답변으로 해당 문제가 해결되기를 바랍니다.
판 감마

11

서버가 HTTP 401 Unauthorized를 반환하면 "요청이 중단되었습니다 : SSL / TLS 보안 채널을 만들 수 없습니다"예외가 발생할 수 있습니다. HTTP 요청에 응답을 .

이 답변에 설명 된대로 클라이언트 응용 프로그램에 대해 추적 수준 System.Net 로깅을 설정하여 이러한 상황이 발생하는지 확인할 수 있습니다. .

해당 로깅 구성이 완료되면 애플리케이션을 실행하고 오류를 재현 한 후 로깅 출력에서 ​​다음과 같은 행을 찾으십시오.

System.Net Information: 0 : [9840] Connection#62912200 - Received status line: Version=1.1, StatusCode=401, StatusDescription=Unauthorized.

내 상황에서 서버가 기대하는 특정 쿠키를 설정하지 못하여 서버가 401 오류로 요청에 응답하여 "SSL / TLS 보안 채널을 만들 수 없습니다"예외가 발생했습니다.


1
작업 스케줄러 는 매일 (주말이 아닌) 실행됩니다. 같은 오류가 발생하지만 때로는 ( 2 errors in 2 months)가 발생합니다. 오류가 발생하면 몇 분 후 수동으로 다시 시도하면 모두 정상입니다.
Kiquenet

10

The request was aborted: Could not create SSL/TLS secure channel오류 의 또 다른 가능한 원인은 클라이언트 PC의 구성된 cipher_suites 값과 서버가 기꺼이 받아들이고 수용 할 수 있도록 구성된 값 사이 불일치입니다. 입니다. 이 경우 클라이언트가 초기 SSL 핸드 쉐이킹 / 협상 "Client Hello"메시지에서 승인 할 수있는 cipher_suites 값 목록을 보내면 제공된 값 중 어느 것도 허용되지 않으며 "경고"를 리턴 할 수 있습니다. SSL 데이터 교환의 "서버 Hello"단계로 진행하는 대신 "응답.

이 가능성을 조사하기 위해 Microsoft Message Analyzer를 다운로드 할 수 있습니다. 하고이를 사용하여 C # 앱에서 서버에 대한 HTTPS 연결을 시도 할 때 발생하는 SSL 협상에서 추적을 실행할 수 있습니다.

다른 환경 (예 : Windows XP 컴퓨터)에서 성공적으로 HTTPS 연결을 할 수 있거나 OS의 암호 제품군 설정을 사용하지 않는 Microsoft 이외의 브라우저에서 HTTPS URL을 치는 경우 (예 : Chrome 또는 Firefox)의 경우 해당 환경에서 다른 메시지 분석기 추적을 실행하여 SSL 협상이 성공할 때 발생하는 상황을 캡처하십시오.

SSL 협상 실패로 인해 실패한 원인을 정확히 파악할 수 있도록 두 Client Hello 메시지간에 약간의 차이가있을 것입니다. 그런 다음 Windows를 성공적으로 구성 할 수 있도록 구성을 변경할 수 있어야합니다. IISCrypto 는이를 위해 사용할 수있는 훌륭한 도구입니다 ( "IIS"이름에도 불구하고 클라이언트 PC에서도).

다음 두 Windows 레지스트리 키는 PC에서 사용할 cipher_suites 값을 제어합니다.

  • HKLM \ SOFTWARE \ Policies \ Microsoft \ Cryptography \ Configuration \ SSL \ 00010002
  • HKLM \ SYSTEM \ CurrentControlSet \ Control \ Cryptography \ Configuration \ Local \ SSL \ 00010002

다음은 이러한 다양한 문제의 사례를 조사하고 해결 한 방법에 대한 전체 기사입니다 Could not create SSL/TLS secure channel. http://blog.jonschneider.com/2016/08/fix-ssl-handshaking-error-in-windows.html


1
제 경우에는이 답변이 도움이됩니다. 또한 클라이언트 PC에 일부 암호화 제품군이 누락 된 것으로 의심되므로 바로 가기를 수행하여이 Windows Update를 직접 설치하여 실제로 운을 시험해 보았습니다 ( support.microsoft.com/en-hk/help/3161639 , Windows 재부팅 필요). Message Analyzer 검색 결과, 운이 좋았으며 문제를 해결하여 검색을 절약했습니다.
sken130

1
Firefox와 같은 브라우저에서 HTTPS 링크를 테스트 할 때 특정 Windows Update에서 제공하는 것과 다른 암호를 얻더라도 새 암호를 설치하면 암호 협상에 영향을 미치므로 Windows Update를 사용해 볼 가치가 있습니다. 클라이언트 PC와 서버간에 일치하는 항목을 찾을 수 있습니다.
sken130

요점은 내 문제에 대한 답변입니다. 변경 사항을 찾는 데 도움이 된 두 가지 사항. 1. 웹 서버가 지원하는 Cipher Suites : ssllabs.com/ssltest 2. 다른 Windows 버전을 지원하는 Cipher Suites : docs.microsoft.com/en-us/windows/win32/secauthn/…
Paul B.

10

필자의 경우이 예외의 근본은 코드의 어느 시점에서 다음이 호출되었다는 것입니다.

ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3;

이것은 정말 나쁘다. .NET에 안전하지 않은 프로토콜을 사용하도록 지시하는 것뿐만 아니라, 이는 앱 도메인 내에서 이후에 이루어진 모든 새로운 WebClient (및 유사한) 요청에 영향을 미칩니다. 들어오는 웹 요청은 ASP.NET 앱에는 영향을 미치지 않지만 외부 웹 서비스와의 통신과 같은 새로운 웹 클라이언트 요청은 영향을받습니다.

필자의 경우 실제로 필요하지 않았으므로 명령문을 삭제하고 다른 모든 웹 요청이 다시 작동하기 시작했습니다. 다른 곳에서 읽은 내용을 바탕으로 몇 가지 사항을 배웠습니다.

  • 이는 앱 도메인의 전역 설정이며 동시 활동이있는 경우 한 값으로 안정적으로 설정하고 작업을 수행 한 다음 다시 설정할 수 없습니다. 작은 창에서 다른 작업이 수행되어 영향을받을 수 있습니다.
  • 올바른 설정은 기본값을 그대로 두는 것입니다. 따라서 .NET은 시간이 지남에 따라 가장 안전한 기본값을 계속 사용하고 프레임 워크를 업그레이드 할 수 있습니다. TLS12 (이 글을 쓰는 시점에서 가장 안전한)로 설정하면 지금 작동 하지만 5 년 안에 신비한 문제가 발생할 수 있습니다.
  • 실제로 값을 설정해야하는 경우 별도의 특수 응용 프로그램 또는 응용 프로그램 도메인에서 값을 설정하고 기본 풀과 대화 할 수있는 방법을 찾아야합니다. 단일 글로벌 가치이기 때문에 바쁜 앱 풀 내에서 관리하려고하면 문제가 발생합니다. 이 답변 : https : //.com/a/26754917/7656 은 사용자 정의 프록시를 통해 가능한 솔루션을 제공합니다. (참고로 개인적으로 구현하지 않았습니다.)

2
일반적인 경험 규칙과 달리 기본 실행을 허용하지 않고 TLS 1.2로 설정해야 할 경우 예외가 있다고 덧붙입니다. .NET 4.6보다 오래된 프레임 워크에 있고 서버 (SSL 또는 TLS 1.0 / 1.1)에서 안전하지 않은 프로토콜을 사용하지 않도록 설정 한 경우 프로그램을 TLS 1.2로 강제 실행하지 않으면 요청을 발행 할 수 없습니다.
Paul

10

내 web.config에 다음과 같은 문제가 있었기 때문에이 문제가 발생했습니다.

<httpRuntime targetFramework="4.5.2" />

그리고 아닙니다 :

<httpRuntime targetFramework="4.6.1" />

나는이 같은 문제가 있었고 아래에 더 자세한 답변 을 추가 하여이 문제의 더 많은 부분을 다루었습니다.
JLRishe

9

당신이 말할 수 있듯이 이것이 일어날 수있는 많은 이유가 있습니다. 내가 찾은 원인을 추가 할 것이라고 생각했습니다 ...

값을 WebRequest.Timeout로 설정하면 0예외가 발생합니다. 아래는 내가 가진 코드입니다 ... ( 0시간 초과 값을 하드 코딩하는 대신에 실수로로 설정된 매개 변수가 있습니다 0).

WebRequest webRequest = WebRequest.Create(@"https://myservice/path");
webRequest.ContentType = "text/html";
webRequest.Method = "POST";
string body = "...";
byte[] bytes = Encoding.ASCII.GetBytes(body);
webRequest.ContentLength = bytes.Length;
var os = webRequest.GetRequestStream();
os.Write(bytes, 0, bytes.Length);
os.Close();
webRequest.Timeout = 0; //setting the timeout to 0 causes the request to fail
WebResponse webResponse = webRequest.GetResponse(); //Exception thrown here ...

2
와! 언급 해 주셔서 감사합니다. 처음부터 이것을 믿을 수 없었고, 수많은 다른 것들을 먼저 시도했습니다. 그런 다음 마지막으로 시간 초과를 10 초로 설정하면 예외가 사라졌습니다! 이것이 나를위한 해결책입니다. (y)
derFunk

9

최고의 투표 대답은 아마도 대부분의 사람들이 충분히 될 것입니다. 그러나 경우에 따라 TLS 1.2를 적용한 후에도 "SSL / TLS 보안 채널을 만들 수 없습니다"오류가 계속 발생할 수 있습니다. 그렇다면 상담을 원할 수 있습니다 이 유용한 기사 하십시오.추가 문제 해결 단계 요약하자면, TLS / SSL 버전 문제와 상관없이 클라이언트와 서버는 "암호 제품군"에 동의해야합니다. SSL 연결의 "핸드 셰이크"단계 동안 클라이언트는 서버가 자체 목록과 대조 할 수 있도록 지원되는 암호를 나열합니다. 그러나 일부 Windows 시스템에서는 특정 공통 암호 스위트가 비활성화되어있을 수 있습니다 (예를 들어 공격 표면을 제한하려는 의도적 인 시도로 인해). 클라이언트 및 서버가 암호 스위트에 동의 할 가능성을 줄입니다. 동의하지 않으면 이벤트 뷰어에 "치명적 경고 코드 40"이 표시되고 .NET 프로그램에 "SSL / TLS 보안 채널을 만들 수 없습니다"가 표시 될 수 있습니다.

앞에서 언급 한 기사는 잠재적으로 지원되는 시스템의 모든 암호 제품군을 나열하고 Windows 레지스트리를 통해 추가 암호 제품군을 활성화하는 방법을 설명합니다. 클라이언트에서 사용 가능한 암호 스위트를 확인하려면 MSIE 에서이 진단 페이지 를 방문 하십시오 . (System.Net 추적을 사용하면보다 확실한 결과를 얻을 수 있습니다.) 서버에서 지원하는 암호 제품군을 확인하려면 이 온라인 도구 를 사용하십시오 (서버가 인터넷에 액세스 가능하다고 가정). 그것은한다는없이 이동해야 레지스트리 편집이 신중하게 수행해야합니다 네트워킹 참여 특히 곳. (컴퓨터가 원격 호스팅 VM입니까? 네트워킹을 중단하려면 VM에 전혀 액세스 할 수 있습니까?)

우리 회사의 경우, 레지스트리 편집을 통해 몇 가지 추가 "ECDHE_ECDSA"제품군을 활성화하여 즉각적인 문제를 해결하고 향후 문제를 방지했습니다. 그러나 레지스트리를 편집 할 수 없거나 편집하지 않으면 수많은 해결 방법이 필요합니다. 예를 들어, .NET 프로그램은 SSL 트래픽을 별도의 Python 프로그램에 위임 할 수 있습니다 (이는 영향을받는 시스템에서 MSIE 요청이 실패하는 경우 Chrome 요청이 성공할 수있는 것과 같은 이유로 자체 작동 할 수 있음).


9

이 문제의 가장 큰 원인 중 하나는 활성 .NET Framework 버전입니다. .NET Framework 런타임 버전은 기본적으로 사용되는 보안 프로토콜에 영향을줍니다.

다른 버전에서 구체적으로 작동하는 방법에 대한 권위있는 문서는 없지만 기본값은 다음과 같이 결정됩니다.

  • .NET Framework 4.5 이하-SSL 3.0, TLS 1.0
  • .NET Framework 4.6.x-TLS 1.0, 1.1, 1.2, 1.3
  • .NET Framework 4.7+-시스템 (OS) 기본값

(이전 버전의 경우 시스템에 설치된 .NET 런타임에 따라 마일리지가 다를 수 있습니다. 예를 들어, 매우 오래된 프레임 워크를 사용하고 TLS 1.0이 지원되지 않거나 4.6을 사용하는 상황이있을 수 있습니다. x 및 TLS 1.3은 지원되지 않습니다)

Microsoft의 설명서 는 4.7+ 및 시스템 기본값을 사용하는 것이 좋습니다.

다음을 권장합니다.

  • 앱에서 .NET Framework 4.7 이상 버전을 대상으로합니다. WCF 앱에서 .NET Framework 4.7.1 이상 버전을 대상으로합니다.
  • TLS 버전을 지정하지 마십시오. OS가 TLS 버전을 결정할 수 있도록 코드를 구성하십시오.
  • 철저한 코드 감사를 수행하여 TLS 또는 SSL 버전을 지정하지 않았는지 확인하십시오.

ASP.NET 사이트의 경우 <httpRuntime>요소 에서 .NET 프레임 워크 버전을 확인하십시오. 사이트 에서 실제로 사용되는 런타임이 결정됩니다.

<httpRuntime targetFramework="4.5" />

보다 나은:

<httpRuntime targetFramework="4.7" />

8

이것은 MVC 웹 클라이언트에서 나를 위해 일하고 있습니다.

    public string DownloadSite(string RefinedLink)
    {
        try
        {
            Uri address = new Uri(RefinedLink);

            ServicePointManager.ServerCertificateValidationCallback = delegate { return true; };
            ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3;

            System.Net.ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12;

            using (WebClient webClient = new WebClient())
            {
                var stream = webClient.OpenRead(address);
                using (StreamReader sr = new StreamReader(stream))
                {
                    var page = sr.ReadToEnd();

                    return page;
                }
            }

        }
        catch (Exception e)
        {
            log.Error("DownloadSite - error Lin = " + RefinedLink, e);
            return null;
        }
    }

2
ServerCertificateValidationCallback을 재정의하면 새로운 보안 허점이 생길까요?

7

클라이언트가 Windows 시스템 인 경우 서비스에 필요한 tls 또는 ssl 프로토콜이 활성화되지 않았기 때문일 수 있습니다.

이것은 다음에서 설정할 수 있습니다 :

제어판-> 네트워크 및 인터넷-> 인터넷 옵션-> 고급

설정을 "보안"으로 아래로 스크롤하고

  • SSL 2.0 사용
  • SSL 3.0 사용
  • TLS 1.0 사용
  • TLS 1.1 사용
  • TLS 1.2 사용

여기에 이미지 설명을 입력하십시오


그들 모두를 똑딱 거리는 데 문제가 있습니까?
Nigel Fds

내가 아는 한 ssl은 더 이상 권장되지 않는다는 것을 제외하고는 아무런 문제가 없습니다 ... 그들은 충분히 안전하지 않은 것으로 간주됩니다.
cnom

Powershell 에서 프로그래밍 방식 으로 수행하는 방법은 무엇입니까?
Kiquenet

이것은 이전 버전의 Windows에 영향을 미칩니다. 일부 조사를 수행하고 현재 사용중인 보안 옵션을 찾으십시오. 오늘 현재이
Tod

7

필자의 경우 응용 프로그램을 실행하는 서비스 계정에 개인 키에 액세스 할 수있는 권한이 없었습니다. 이 권한을 부여하면 오류가 사라졌습니다.

  1. mmc
  2. 증명서
  3. 개인으로 확장
  4. 인증서를 선택하십시오
  5. 마우스 오른쪽 버튼으로 클릭
  6. 모든 작업
  7. 개인 키 관리
  8. 더하다

7

Visual Studio에서 코드를 실행중인 경우 관리자 권한으로 Visual Studio를 실행하십시오. 나를 위해 문제를 해결했습니다.


아아 아냐!
benedict_w

이것은 내 경우에 도움이 된 유일한 것입니다! 감사!!!
Alexander Ostrikov

6

하루 종일이 문제로 어려움을 겪었습니다.

.NET 4.5로 새 프로젝트를 만들었을 때 마침내 작동했습니다.

그러나 4.0으로 다운 그레이드하면 같은 문제가 다시 발생하며 해당 프로젝트에서는 되돌릴 수 없었습니다 (4.5로 다시 업그레이드하려고 시도한 경우에도).

이상한 오류 메시지는 없지만 "요청이 중단되었습니다 : SSL / TLS 보안 채널을 만들 수 없습니다." 이 오류가 발생했습니다.


5
다른 .NET 버전이 다른 SSL / TLS 프로토콜 버전을 지원하기 때문에 이것이 효과가 있었던 것일 수 있습니다. 추가 정보 : blogs.perficient.com/microsoft/2016/04/tsl-1-2-and-net-support
Jon Schneider

4

System.Net.WebException : 요청이 중단되었습니다 : SSL / TLS 보안 채널을 작성할 수 없습니다.

우리의 경우에는 소프트웨어 공급 업체를 사용하여 .NET 코드를 수정할 권한이 없었습니다. 분명히 .NET 4는 변경 사항이 없으면 TLS v 1.2를 사용하지 않습니다.

우리를위한 해결책은 SchUseStrongCrypto 키를 레지스트리에 추가하는 것이 었습니다. 아래 코드를 복사하여 .reg 확장자를 가진 텍스트 파일에 붙여 넣을 수 있습니다. 문제에 대한 "패치"역할을했습니다.

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\.NETFramework\v4.0.30319]
"SchUseStrongCrypto"=dword:00000001

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework\v4.0.30319]
"SchUseStrongCrypto"=dword:00000001

3
여기 빠른 편집을위한 PS : New-ItemProperty -Path "HKLM:\SOFTWARE\Microsoft\.NETFramework\v4.0.30319" -Name "SchUseStrongCrypto" -Value "1" -Type DWord
Tilo

2
여기 빠른 편집을위한 PS2 : New-ItemProperty -Path "HKLM:\SOFTWARE\Wow6432Node\Microsoft\.NETFramework\v4.0.30319" -Name "SchUseStrongCrypto" -Value "1" -Type DWord
Tilo

4

이 시도:

ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;

이 행을 추가했습니다. 때로는 실패하고 나도 같은 오류가System.Net.WebException: The request was aborted: Could not create SSL/TLS secure channel.
조셉 카츠 만

4

이 문제는 네트워크 서비스를 권한에 추가합니다. 인증서> 모든 작업> 개인 키 관리 ...> 추가 ...> "네트워크 서비스"추가를 마우스 오른쪽 단추로 클릭하십시오.


3

나에게 문제는 IIS에 웹 서비스로 배포하려고했지만 서버에 인증서를 설치했지만 IIS를 실행하는 사용자에게는 인증서에 대한 올바른 권한이 없다는 것입니다.

인증서 저장소의 인증서에서 개인 키에 대한 ASP.NET 액세스를 제공하는 방법은 무엇입니까?


그래, 디토 이 문제를 해결하기 위해 Nick Gotch의 답변에 따라 앱 풀 ID를 LocalSystem으로 변경했습니다. 이것은 나를 위해 해결했습니다.
유다 가브리엘 히 망고

1
감사합니다
Denis Pitcher

3

나는이 똑같은 문제를 겪고 있었고이 대답이 제대로 작동 한다는 것을 알았 습니다. 키는 3072입니다. 이 링크 는 '3072'수정 사항에 대한 세부 사항을 제공합니다.

ServicePointManager.SecurityProtocol = (SecurityProtocolType)3072;

XmlReader r = XmlReader.Create(url);
SyndicationFeed albums = SyndicationFeed.Load(r);

내 경우에는 두 가지 피드에 수정이 필요했습니다.

https://www.fbi.gov/feeds/fbi-in-the-news/atom.xml
https://www.wired.com/feed/category/gear/latest/rss

3

이 질문은 일반적인 오류 메시지에 관한 것이므로 많은 답변이있을 수 있습니다. 개발 서버가 아닌 일부 서버에서이 문제가 발생했습니다. 대부분의 머리카락을 뽑은 후 Microsoft 버그였습니다.

https://support.microsoft.com/en-us/help/4458166/applications-that-rely-on-tls-1-2-strong-encryption-experience-connect

기본적으로 MS는 더 약한 암호화를 원한다고 가정하지만 OS는 TLS 1.2 만 허용하도록 패치되어 있으므로 "요청이 중단되었습니다. SSL / TLS 보안 채널을 만들 수 없습니다"라는 두려움이 나타납니다.

세 가지 수정 사항이 있습니다.

1) 올바른 업데이트로 OS를 패치하십시오. http://www.catalog.update.microsoft.com/Search.aspx?q=kb4458166

2) app.config / web.config 파일에 설정을 추가하십시오.

3) 다른 답변에서 이미 언급 된 레지스트리 설정을 추가하십시오.

이것들은 모두 내가 게시 한 기술 자료 기사에 언급되어 있습니다.


또한 앱에서 ServicePointManager.SecurityProtocol을 한 번만 설정해야합니다. 우리는 응용 프로그램에서 두 번째 호출 (런타임에로드 된 선택적 어셈블리가 다소 복잡 함)을 SSL3으로 설정 한 것을 발견했으며 동일한 오류 메시지가 발생했습니다.
Michael Silver

3

또 다른 가능성은 실행중인 코드에 필요한 권한이 없다는 것입니다.

필자의 경우 Visual Studio 디버거를 사용하여 웹 서비스 호출을 테스트 할 때이 오류가 발생했습니다. Visual Studio가 관리자로 실행되지 않아이 예외가 발생했습니다.


2

이것은 하나의 사이트에서만 발생했으며 RC4 ​​암호 만 사용할 수있는 것으로 나타났습니다. 서버를 강화하기위한 이전의 노력으로 RC4 암호를 비활성화했습니다.이 기능을 다시 활성화하면 문제가 해결되었습니다.


1
응답에 링크를 사용하지 마십시오 답변 내부 그것에 가장 관련성 측면 밖으로 그들은 수도없는 미래에 대한 작업 지점으로
로드리고 로페스
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.