ServerCertificateValidationCallback을 설정했지만 SSL / TLS 보안 채널을 만들 수 없습니다.


85

자체 서명 된 인증서테스트 서버에 SSL / TLS 연결을 설정하려고합니다 . 안전하지 않은 채널을 통한 통신은 문제없이 작동했습니다.

다음은이 솔루션을 기반으로 작성한 샘플 코드 입니다. HttpClient C #으로 신뢰할 수없는 SSL 인증서 허용 인증서 오류를 무시 하시겠습니까? SSL Web API에 연결하는 .NET 클라이언트

ServicePointManager.ServerCertificateValidationCallback += (sender, cert, chain, sslPolicyErrors) => true;

var c = new HttpClient();
var r = c.GetAsync("https://10.3.0.1:8443/rest/v1").Result;
if (r.IsSuccessStatusCode)
{
    Log.AddMessage(r.Content.Get<string>());
}
else
{
    Log.AddMessage(string.Format("{0} ({1})", (int)r.StatusCode, r.ReasonPhrase));
}

또한 이것을 시도했습니다.

var handler = new WebRequestHandler();
handler.ServerCertificateValidationCallback = delegate { return true; };
var c = new HttpClient(handler);
...

ServicePointManager.ServerCertificateValidationCallback = delegate { return true; };

하지만 예외가있을 때마다 :

InnerException: System.Net.Http.HttpRequestException
   _HResult=-2146233088
   _message=An error occurred while sending the request.
   HResult=-2146233088
   IsTransient=false
   Message=An error occurred while sending the request.
   InnerException: System.Net.WebException
        _HResult=-2146233079
        _message=The request was aborted: Could not create SSL/TLS secure channel.
        HResult=-2146233079
        IsTransient=false
        Message=The request was aborted: Could not create SSL/TLS secure channel.
        Source=System
        StackTrace:
             at System.Net.HttpWebRequest.EndGetResponse(IAsyncResult asyncResult)
             at System.Net.Http.HttpClientHandler.GetResponseCallback(IAsyncResult ar)
        InnerException: 

내가 뭘 잘못 했어? 이 서버에 연결할 수없는 이유 (유효하지 않은 자체 서명 인증서가 있음)

답변:


166

ServerCertificateValidationCallback으로 올바르게 수행하고 있습니다. 이것은 당신이 직면 한 문제가 아닙니다. 현재 직면하고있는 문제는 SSL / TLS 프로토콜 버전 일 가능성이 높습니다.

예를 들어 서버가 SSLv3 및 TLSv10 만 제공하고 클라이언트에 TLSv12가 필요한 경우이 오류 메시지가 표시됩니다. 당신이해야 할 일은 클라이언트와 서버가 공통 프로토콜 버전을 지원하는지 확인하는 것입니다.

가능한 한 많은 서버에 연결할 수있는 클라이언트가 필요할 때 (가능한 한 보안을 유지하기보다는) 다음을 사용합니다 (유효성 확인 콜백 설정과 함께).

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

1
비슷한 문제가 있습니다. POODLE 공격으로 인해 서버에서 TLS 1.0을 종료해야합니다. 이렇게하면 타사 앱이 작동을 멈 춥니 다. assambly를 디 컴파일하면 귀하와 유사한 코드가 표시됩니다. GetAsync 대신 webclientc.SendAsync를 사용합니다. 테스트를 위해 코드를 consoleapp에 복사하면 오류를 재현 할 수 있으며 ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls11을 추가하면 작동합니다. 사용할 TLS 버전을 밝히기 위해 서버와 클라이언트간에 일종의 핸드 셰이크가 발생할 것이라고 생각했습니다. 1.0이 비활성화되었을 때 1.1을 자동으로 선택하지 않는 이유는 무엇입니까?
Engern

3
감사! 이것으로 3 시간을 고생했습니다. 이 줄을 추가하면 저에게 도움이되었습니다.ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;
Thomas T

1
최신 버전의 .NET에는이 기능이 기본적으로 활성화되어 있습니다. .NET 버전을 4.6.1로 설정하기
만하면됩니다

1
유효하든 아니든 상관하지 않는다는 뜻입니다. 이 콜백을 사용하면 해당 인증서에 대한 보안 검사를 간단히 피할 수 있습니다.
Wapac

1
좋은 대답입니다.이 ServicePointManager.SecurityProtocol값 이 기본값이어야한다고 생각합니다. 또는 적어도 throw 된 Exception 내부에 더 많은 통찰력이 있어야합니다.
Chad

28

우리는 오늘 바로 같은 문제를 해결해 왔으며 .NET의 런타임 버전을 높이기 만하면됩니다.

4.5.2는 위의 문제로 작동하지 않았지만 4.6.1은 괜찮 았습니다.

.NET 버전을 유지해야하는 경우

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

1
어떤 변형을 사용했으며 정확히 어떻게 했습니까?
martinh_kentico

1
오늘부터 특정 SSL 사이트에서 작동하지 않는 .NET 4.5 응용 프로그램이 있습니다. 4.6.1로 변경하면 제대로 작동하지만 실제로 변경할 수 없습니다. 무엇을해야할지 모르겠습니다.
Tsury

16

여전히이 문제를 겪고있는 사람을위한 후속 조치로 솔루션에 명시된대로 ServicePointManager.SecurityProfile 옵션을 추가했습니다.

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

그러나 동일한 "요청이 중단되었습니다 : SSL / TLS 보안 채널을 만들 수 없습니다"오류가 계속 발생했습니다. HTTPS SOAP API 인터페이스 (예 : 몇 년 전에 설치된 음성 메일, IP 전화 시스템 등)를 사용하여 일부 오래된 음성 서버에 연결하려고했습니다. 이들은 수년 전에 마지막으로 업데이트 된 SSL3 연결 만 지원합니다.

SecurityProtocols 목록에 SSl3을 포함하면 여기에서 트릭을 수행 할 것이라고 생각할 수 있지만 그렇지 않았습니다. 강제로 연결할 수있는 유일한 방법은 Ssl3 프로토콜 만 포함하고 다른 프로토콜은 포함하지 않는 것입니다.

ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3;

그런 다음 연결이 진행됩니다. 버그처럼 보이지만 최근까지 몇 년 동안 사용되어 온 이러한 서버에 대해 제공하는 도구에서 오류가 발생하기 시작하지 않았습니다. Microsoft가이를 업데이트 한 시스템 변경 사항을 배포하기 시작했다고 생각합니다. 다른 대안이없는 한 TLS 연결을 강제하는 동작.

어쨌든-일부 오래된 사이트 / 서버에 대해 여전히이 문제를 겪고 있다면 시도해 볼 가치가 있습니다.


1
PowerShell을 통해 Cisco Unified Communications AXL api를 사용하기위한 CUCMPowerShell 모듈이 있으며 귀하의 답변은 [System.Net.ServicePointManager]::SecurityProtocol = [System.Net.SecurityProtocolType]::Ssl3. 감사합니다! 전체 코드는에서 볼 수있는 호출-CUCMSOAPAPIFunction
크리스 마 그누을

2
@Jeff-링크 된 기사를 확인하십시오. Ssl3이 작동하지 않는 이유를 설명하고 Ssl3을 다시 활성화하는 두 가지 방법을 제안 할 수 있다고 생각합니다. docs.microsoft.com/en-us/dotnet/framework/migration-guide/…
Scott

4

이 줄을 이동하십시오. ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3 | SecurityProtocolType.Tls | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12;

이 줄 앞 : HttpWebRequest request = (HttpWebRequest) WebRequest.Create (uri);

원본 게시물 : KB4344167 보안 업데이트로 TLS 코드가 깨짐


1
위의 모든 것을 아무 소용이없는 것으로 시도한 후 이것이 답이었습니다. HttpWebRequest를 만들기 전에 ServicePointManager를 설정해야합니다.
Henry Rusted

2

제 경우에는 TLS1_2가 클라이언트와 서버 모두에서 활성화되었지만 서버는 MD5를 사용하고 클라이언트는 MD5를 비활성화했습니다. 따라서 http://ssllabs.com 에서 클라이언트와 서버를 모두 테스트 하거나 openssl / s_client를 사용하여 테스트하여 무슨 일이 일어나고 있는지 확인하십시오. 또한 Wireshark를 사용하여 선택한 암호를 확인하십시오.


1

TLS 1.0 및 1.1은 이제 단종되었습니다. Amazon 웹 서버의 패키지가 업데이트되었고이 오류가 발생하기 시작했습니다.

대답은 위이지만 tls또는 tls11더 이상 사용해서는 안됩니다 .

특히 ASP.Net의 경우 시작 방법 중 하나에 이것을 추가하십시오.

        public Startup()
        {
            ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3 | SecurityProtocolType.Tls12;

그러나 나는 이와 같은 것이 다른 많은 경우에서도 작동 할 것이라고 확신합니다.


0

새 도메인 이름을 사용 중이고 위의 모든 작업을 수행했지만 여전히 동일한 오류가 발생하는 경우 PC에서 DNS 캐시를 지우는 지 확인하십시오. 자세한 내용 은 DNS지우십시오 .

Windows® 8

Windows 8을 사용하는 경우 DNS 캐시를 지우려면 다음 단계를 수행하십시오.

키보드에서 Win + X를 눌러 WinX 메뉴를 엽니 다.

명령 프롬프트를 마우스 오른쪽 단추로 클릭하고 관리자 권한으로 실행을 선택하십시오.

다음 명령을 실행하십시오.

ipconfig / flushdns

명령이 성공하면 시스템은 다음 메시지를 반환합니다.

Windows IP 구성이 DNS 확인자 캐시를 성공적으로 플러시했습니다.

Windows® 7

Windows 7을 사용하는 경우 DNS 캐시를 지우려면 다음 단계를 수행하십시오.

시작을 클릭하십시오.

시작 메뉴 검색 텍스트 상자에 cmd를 입력합니다.

명령 프롬프트를 마우스 오른쪽 단추로 클릭하고 관리자 권한으로 실행을 선택하십시오.

다음 명령을 실행하십시오.

ipconfig / flushdns

명령이 성공하면 시스템은 다음 메시지를 반환합니다. Windows IP 구성이 DNS 확인자 캐시를 성공적으로 플러시했습니다.


ipconfig /flushdnsC #에서?
Kiquenet

0

SSL / TLS 보안 채널을 만들 수 없다는 오류가 발생했기 때문에이 스레드를 발견했습니다 . 제 경우에는를 사용하여 PowerShell에서 Siebel 구성 REST API에 액세스하려고 시도했지만 Invoke-RestMethod위의 제안 중 어느 것도 도움이되지 않았습니다.

결국 나는 내 문제의 원인을 우연히 발견했다. 내가 접속 한 서버에 클라이언트 인증서 인증이 필요했다.

호출이 작동하도록하려면 -Certificate매개 변수 와 함께 클라이언트 인증서 (개인 키 포함)를 제공해야했습니다 .

$Pwd = 'certificatepassword'
$Pfx = New-Object -TypeName 'System.Security.Cryptography.X509Certificates.X509Certificate2'
$Pfx.Import('clientcert.p12', $Pwd, 'Exportable,PersistKeySet')
Invoke-RestMethod -Uri 'https://your.rest.host/api/' -Certificate $Pfx -OtherParam ...

제 경험이이 문제에 대해 저의 특별한 취향을 가진 다른 사람에게 도움이되기를 바랍니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.