.Net에서 웹 서비스를 호출 할 때 유효하지 않은 SSL 인증서 오류 우회


88

아직 유효한 SSL 인증서가없는 새 SharePoint를 설정하고 있습니다. 설정에 대한 일부 메타 데이터를 검색하기 위해 Lists 웹 서비스를 호출하고 싶습니다. 그러나 이렇게하려고하면 예외가 발생합니다.

기본 연결이 닫혔습니다. SSL / TLS 보안 채널에 대한 신뢰 관계를 설정할 수 없습니다.

중첩 된 예외에는 오류 메시지가 포함됩니다.

유효성 검사 절차에 따라 원격 인증서가 유효하지 않습니다.

이는 임시 인증서를 사용하고 있기 때문에 정확합니다.

내 질문은 : .Net 웹 서비스 클라이언트 ( SoapHttpClientProtocol )에 이러한 오류를 무시하도록 어떻게 알릴 수 있습니까?

답변:


18

이 문제에 직면했을 때 사용한 접근 방식은 임시 인증서의 서명자를 해당 컴퓨터의 신뢰할 수있는 기관 목록에 추가하는 것이 었습니다.

저는 일반적으로 CACERT로 생성 된 인증서로 테스트를 수행하고이를 신뢰할 수있는 기관 목록에 추가하면 원활하게 작동했습니다.

이렇게하면 응용 프로그램에 사용자 지정 코드를 추가 할 필요가 없으며 응용 프로그램이 배포 될 때 발생할 일을 제대로 시뮬레이션 할 수 있습니다. 따라서 이것이 프로그래밍 방식으로 검사를 해제하는 데 탁월한 솔루션이라고 생각합니다.


그것도 제 첫 아이디어였습니다. 불행히도 인증서도 만료 되었기 때문에 신뢰할 수 없습니다.
jan.vdbergh

CA 인증서와 같은 사람을 사용할 수없는 이유가 있습니까? 테스트 인증서라면 계속 진행할 수 있습니다. 이 수표를 끄는 방법이 있는지 확실하지 않습니다!
Simon Johnson

113

또는 인증 오류를 무시하는 콜백 대리인을 등록 할 수 있습니다.

...
ServicePointManager.ServerCertificateValidationCallback = MyCertHandler;
...

static bool MyCertHandler(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors error)
{
// Ignore errors
return true;
}

1
이 정적 메서드를 global.asax에 추가하고 "OnApplicationStart"에 이벤트를 설정했습니다. 매력처럼 작동했습니다. 감사합니다
Juan Zamora 2013

1
@JuanZamora 나는 당신이 한 것과 똑같은 일을했습니다. 작동했습니다!
Sachin BR

5
이것은 당신이에 vulnarable 되길 원한다면 당신이 할 필요하다 "중간에 남자" 공격 ...
Houtman

2
이상적으로는 개발 환경에서만이 작업을 수행해야합니다.
Ron DeFreitas

79

Jason S의 대답처럼 :

ServicePointManager.ServerCertificateValidationCallback = delegate { return true; };

나는 이것을 내 Main에 넣고 코드 줄을 호출하기 전에 내 app.config보고 테스트합니다 (ConfigurationManager.AppSettings["IgnoreSSLCertificates"] == "True").


24

이 방법으로 해결했습니다.

해당 오류를 일으키는 SSL 웹 서비스를 호출하기 직전에 다음을 호출하십시오.

using System.Net;
using System.Net.Security;
using System.Security.Cryptography.X509Certificates;

/// <summary>
/// solution for exception
/// System.Net.WebException: 
/// The underlying connection was closed: Could not establish trust relationship for the SSL/TLS secure channel. ---> System.Security.Authentication.AuthenticationException: The remote certificate is invalid according to the validation procedure.
/// </summary>
public static void BypassCertificateError()
{
    ServicePointManager.ServerCertificateValidationCallback +=

        delegate(
            Object sender1,
            X509Certificate certificate,
            X509Chain chain,
            SslPolicyErrors sslPolicyErrors)
        {
            return true;
        };
}

12

DownloadString을 사용하여 동일한 오류가 발생했습니다. 이 페이지의 제안으로 아래와 같이 작동하도록 만들 수있었습니다.

System.Net.WebClient client = new System.Net.WebClient();            
ServicePointManager.ServerCertificateValidationCallback = delegate { return true; };
string sHttpResonse = client.DownloadString(sUrl);

3
ServicePointManager.ServerCertificateValidationCallback +=
            (mender, certificate, chain, sslPolicyErrors) => true;

invaild ssl을 우회합니다. 웹 서비스 생성자에 작성하십시오.


1

초보자를 위해 부분 서비스 클래스를 별도의 cs 파일로 확장하고 "imanabidi"에서 제공 한 코드를 추가하여 통합 할 수 있습니다.


1

Simon Johnsons 게시물을 추가로 확장하려면-이상적으로는 프로덕션에서 보게 될 조건을 시뮬레이션하는 솔루션을 원하며 코드를 수정하는 것은 그렇게하지 않으며 배포하기 전에 코드를 제거하는 것을 잊으면 위험 할 수 있습니다.

일종의 자체 서명 인증서가 필요합니다. IIS Express를 사용하는 경우 이미 이러한 항목 중 하나가있을 것이므로 찾아야합니다. Firefox 또는 원하는 브라우저를 열고 개발 웹 사이트로 이동하십시오. URL 표시 줄에서 인증서 정보를 볼 수 있어야하며 브라우저에 따라 인증서를 파일로 내보낼 수 있어야합니다.

그런 다음 MMC.exe를 열고 인증서 스냅인을 추가합니다. 인증서 파일을 신뢰할 수있는 루트 인증 기관 저장소로 가져 오기만하면됩니다. '개인'과 같은 다른 상점이 아닌 해당 상점에 들어가는 지 확인하는 것이 중요합니다. MMC 또는 인증서에 익숙하지 않은 경우이를 수행하는 방법에 대한 정보가있는 많은 웹 사이트가 있습니다.

이제 컴퓨터 전체가 자체적으로 생성 한 인증서를 암시 적으로 신뢰하므로이를 특별히 처리하기 위해 코드를 추가 할 필요가 없습니다. 프로덕션으로 이동할 때 적절한 유효한 인증서가 설치되어 있으면 계속 작동합니다. 프로덕션 서버에서이 작업을 수행하지 마십시오. 이는 나쁘고 서버 자체에있는 클라이언트 이외의 다른 클라이언트에서는 작동하지 않습니다.

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