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

자체 서명 된 인증서테스트 서버에 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:

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



답변

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

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

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

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


답변

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

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

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

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


답변

여전히이 문제를 겪고있는 사람을위한 후속 조치로 솔루션에 명시된대로 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 연결을 강제하는 동작.

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


답변

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

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

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


답변

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


답변

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

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

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

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

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


답변

새 도메인 이름을 사용 중이고 위의 모든 작업을 수행했지만 여전히 동일한 오류가 발생하는 경우 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 확인자 캐시를 성공적으로 플러시했습니다.