C # 인증서 오류를 무시 하시겠습니까?


171

원격 웹 서비스에 대한 웹 서비스 요청 중에 다음 오류가 발생합니다.

SSL / TLS 보안 채널에 대한 신뢰 관계를 설정할 수 없습니다. ---> System.Security.Authentication.AuthenticationException : 유효성 검사 절차에 따라 원격 인증서가 유효하지 않습니다.

이 오류를 무시하고 계속할 수 있습니까?

원격 인증서가 서명되지 않은 것 같습니다.

내가 연결하는 사이트는 www.czebox.cz-사이트를 자유롭게 방문하여 브라우저에서도 보안 예외가 발생하는 것을 알 수 있습니다.

답변:


356

인증서 유효성 검사 처리기를 추가합니다. 반환 true하면 유효성 검사 오류를 무시할 수 있습니다.

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

7
이것은 처음 나타나는 것보다 훨씬 더 유용합니다. EWS (Managed Exchanged Web Services)를 사용하는 동안 OP의 문제가 발생했습니다. 해당 관리 라이브러리에서 만든 저수준 SOAP 호출에 액세스 할 수 없기 때문에이 답변을 사용할 수 없다고 생각했습니다. 그러나 다시 살펴 보았을 때 ServicePointManager가 독자적으로 서 있다는 것을 깨달았습니다. 그래서 ExchangeService를 초기화하기 전에 위의 콜백을 추가했는데 매력처럼 작동했습니다.
Mark Meuer 2012

2
다음은 바이 패스를 전역 적으로 적용하는 방법의 예입니다. 우리 모두를 위해 나쁜 습관으로. (때로는 선택의 여지가 없습니다) jasig.275507.n4.nabble.com/…
snowYetis

1
이것은 일시적으로 문제를 해결 해주셔서 감사합니다. 웹 API의 Startup.cs이 코드 추가
Sivalingaamorthy

3
@MarkMeuer는 내 EWS API 문제에 대해이 솔루션을 거의 포기하려고했지만 귀하의 의견을 보았습니다.
Mahen

8
@MiguelVeloso 당신은 당연히 반대표를 던질 수 있지만, 질문도 대답도 이것의 보안 측면을 논의하지 않습니다. 주제는 명시 적으로 "유효성 검사 오류를 무시하는 방법"이지 "이 작업을 수행해야하는 이유 /하지 말아야하는 이유"가 아니라 모두 다른 주제입니다. 논평자들이 실제로 이것을 할 합리적인 경우가 있다고 지적했듯이 OP가 왜 그것을하지 말아야하는지에 대한 토론에 들어가면 물이 진흙 투성이 될 것 입니다. 그래서 우리는 주제에 충실하고 문제를 해결합니다.
Peter Lillevold

48

모든 인증서를 허용하는 것은 매우 강력하지만 위험 할 수도 있습니다. 유효한 인증서와 일부 특정 인증서 만 허용하려면 다음과 같이 할 수 있습니다.

.Net 코어 :

using (var httpClientHandler = new HttpClientHandler())
{
    httpClientHandler.ServerCertificateCustomValidationCallback = (message, cert, chain, sslPolicyErrors) => {
        if (sslPolicyErrors == SslPolicyErrors.None)
        {
            return true;   //Is valid
        }

        if (cert.GetCertHashString() == "99E92D8447AEF30483B1D7527812C9B7B3A915A7")
        {
            return true;
        }
        return false;
    };
    using (var httpClient = new HttpClient(httpClientHandler))
    {
        var httpResponse = httpClient.GetAsync("https://example.com").Result;
    }
}

.넷 프레임 워크:

System.Net.ServicePointManager.ServerCertificateValidationCallback += delegate (
    object sender,
    X509Certificate cert,
    X509Chain chain,
    SslPolicyErrors sslPolicyErrors)
{
    if (sslPolicyErrors == SslPolicyErrors.None)
    {
        return true;   //Is valid
    }

    if (cert.GetCertHashString() == "99E92D8447AEF30483B1D7527812C9B7B3A915A7")
    {
        return true;
    }

    return false;
};

최신 정보:

cert.GetCertHashString()Chrome에서 가치 를 얻는 방법 :

를 클릭 Secure하거나 Not Secure주소 표시 줄에.

여기에 이미지 설명 입력

여기에 이미지 설명 입력

그런 다음 인증서-> 세부 정보-> 지문을 클릭하고 값을 복사합니다. 을 기억하십시오 cert.GetCertHashString().ToLower().

여기에 이미지 설명 입력


3
@MiguelVeloso 완전히 동의합니다. 이를 통해 보안을 완전히 손상시키지 않고 하나 또는 두 개의 인증서에 대한 검사를 건너 뛸 수 있습니다.
Kemuel Sanchez

Hash String인증서는 어떻게 받을 수 있습니까?
Kiquenet

@Kiquenet 어느 코드 실행 디버깅 cert.GetCertHashString()에서 Immediate window또는 검사 인증서를 Thumbprint브라우저 또는 MMC이 로컬로 설치되어있는 경우.
Ogglas

서버는 우리의 통제하에 있습니다. 프로덕션에서 @Ogglas의 코드를 사용하는 것이 여전히 안전합니까? TLS / SSL을 사용하면 man-in-the-middle과 같은 공격을 차단할 수 있습니까?
Pingpong

대단히 감사합니다.
Wowo Ot

30

IgnoreBadCertificates 메서드 :

//I use a method to ignore bad certs caused by misc errors
IgnoreBadCertificates();

// after the Ignore call i can do what ever i want...
HttpWebRequest request_data = System.Net.WebRequest.Create(urlquerystring) as HttpWebRequest;

/*
and below the Methods we are using...
*/

/// <summary>
/// Together with the AcceptAllCertifications method right
/// below this causes to bypass errors caused by SLL-Errors.
/// </summary>
public static void IgnoreBadCertificates()
{
    System.Net.ServicePointManager.ServerCertificateValidationCallback = new System.Net.Security.RemoteCertificateValidationCallback(AcceptAllCertifications);
}  

/// <summary>
/// In Short: the Method solves the Problem of broken Certificates.
/// Sometime when requesting Data and the sending Webserverconnection
/// is based on a SSL Connection, an Error is caused by Servers whoes
/// Certificate(s) have Errors. Like when the Cert is out of date
/// and much more... So at this point when calling the method,
/// this behaviour is prevented
/// </summary>
/// <param name="sender"></param>
/// <param name="certification"></param>
/// <param name="chain"></param>
/// <param name="sslPolicyErrors"></param>
/// <returns>true</returns>
private static bool AcceptAllCertifications(object sender, System.Security.Cryptography.X509Certificates.X509Certificate certification, System.Security.Cryptography.X509Certificates.X509Chain chain, System.Net.Security.SslPolicyErrors sslPolicyErrors)
{
    return true;
} 

2
내 코드와 함께 작동하려면 한 줄을 더 추가해야했습니다 (websocket4net을 사용하고 있습니다). System.Net.ServicePointManager.CheckCertificateRevocationList = false; 서버 인증서 유효성 검사 콜백을 설정 한 직후.
kalyanswaroop

25

실패한 이유는 서명되지 않았기 때문이 아니라 클라이언트가 루트 인증서를 신뢰하지 않기 때문입니다. SSL 유효성 검사를 끄는 대신 앱이 신뢰하는 CA 목록에 루트 CA 인증서를 추가하는 것이 대안입니다.

앱이 현재 신뢰하지 않는 루트 CA 인증서입니다.

-----BEGIN CERTIFICATE-----
MIIFnDCCBISgAwIBAgIBZDANBgkqhkiG9w0BAQsFADBbMQswCQYDVQQGEwJDWjEs
MCoGA1UECgwjxIxlc2vDoSBwb8WhdGEsIHMucC4gW0nEjCA0NzExNDk4M10xHjAc
BgNVBAMTFVBvc3RTaWdudW0gUm9vdCBRQ0EgMjAeFw0xMDAxMTkwODA0MzFaFw0y
NTAxMTkwODA0MzFaMFsxCzAJBgNVBAYTAkNaMSwwKgYDVQQKDCPEjGVza8OhIHBv
xaF0YSwgcy5wLiBbScSMIDQ3MTE0OTgzXTEeMBwGA1UEAxMVUG9zdFNpZ251bSBS
b290IFFDQSAyMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAoFz8yBxf
2gf1uN0GGXknvGHwurpp4Lw3ZPWZB6nEBDGjSGIXK0Or6Xa3ZT+tVDTeUUjT133G
7Vs51D6z/ShWy+9T7a1f6XInakewyFj8PT0EdZ4tAybNYdEUO/dShg2WvUyfZfXH
0jmmZm6qUDy0VfKQfiyWchQRi/Ax6zXaU2+X3hXBfvRMr5l6zgxYVATEyxCfOLM9
a5U6lhpyCDf2Gg6dPc5Cy6QwYGGpYER1fzLGsN9stdutkwlP13DHU1Sp6W5ywtfL
owYaV1bqOOdARbAoJ7q8LO6EBjyIVr03mFusPaMCOzcEn3zL5XafknM36Vqtdmqz
iWR+3URAUgqE0wIDAQABo4ICaTCCAmUwgaUGA1UdHwSBnTCBmjAxoC+gLYYraHR0
cDovL3d3dy5wb3N0c2lnbnVtLmN6L2NybC9wc3Jvb3RxY2EyLmNybDAyoDCgLoYs
aHR0cDovL3d3dzIucG9zdHNpZ251bS5jei9jcmwvcHNyb290cWNhMi5jcmwwMaAv
oC2GK2h0dHA6Ly9wb3N0c2lnbnVtLnR0Yy5jei9jcmwvcHNyb290cWNhMi5jcmww
gfEGA1UdIASB6TCB5jCB4wYEVR0gADCB2jCB1wYIKwYBBQUHAgIwgcoagcdUZW50
byBrdmFsaWZpa292YW55IHN5c3RlbW92eSBjZXJ0aWZpa2F0IGJ5bCB2eWRhbiBw
b2RsZSB6YWtvbmEgMjI3LzIwMDBTYi4gYSBuYXZhem55Y2ggcHJlZHBpc3UvVGhp
cyBxdWFsaWZpZWQgc3lzdGVtIGNlcnRpZmljYXRlIHdhcyBpc3N1ZWQgYWNjb3Jk
aW5nIHRvIExhdyBObyAyMjcvMjAwMENvbGwuIGFuZCByZWxhdGVkIHJlZ3VsYXRp
b25zMBIGA1UdEwEB/wQIMAYBAf8CAQEwDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQW
BBQVKYzFRWmruLPD6v5LuDHY3PDndjCBgwYDVR0jBHwweoAUFSmMxUVpq7izw+r+
S7gx2Nzw53ahX6RdMFsxCzAJBgNVBAYTAkNaMSwwKgYDVQQKDCPEjGVza8OhIHBv
xaF0YSwgcy5wLiBbScSMIDQ3MTE0OTgzXTEeMBwGA1UEAxMVUG9zdFNpZ251bSBS
b290IFFDQSAyggFkMA0GCSqGSIb3DQEBCwUAA4IBAQBeKtoLQKFqWJEgLNxPbQNN
5OTjbpOTEEkq2jFI0tUhtRx//6zwuqJCzfO/KqggUrHBca+GV/qXcNzNAlytyM71
fMv/VwgL9gBHTN/IFIw100JbciI23yFQTdF/UoEfK/m+IFfirxSRi8LRERdXHTEb
vwxMXIzZVXloWvX64UwWtf4Tvw5bAoPj0O1Z2ly4aMTAT2a+y+z184UhuZ/oGyMw
eIakmFM7M7RrNki507jiSLTzuaFMCpyWOX7ULIhzY6xKdm5iQLjTvExn2JTvVChF
Y+jUu/G0zAdLyeU4vaXdQm1A8AEiJPTd0Z9LAxL6Sq2iraLNN36+NyEK/ts3mPLL

-----END CERTIFICATE-----

다음을 사용하여이 인증서를 디코딩하고 볼 수 있습니다.

이 인증서 디코더 또는 다른 인증서 디코더


예! 제 경우이지만 VM없이 Azure에서 인증서를 추가하려면 어떻게해야하나요? X509Store API 만 사용할 수 있습니까? 나는 내일 그것을 시도 할 것입니다. 그러나 어떤 정보라도 환영
João Antunes

7

클라이언트 구성에서 SSL 인증서 유효성 검사를 비활성화하려면

<behaviors>
   <endpointBehaviors>
      <behavior name="DisableSSLCertificateValidation">
         <clientCredentials>
             <serviceCertificate>
                <sslCertificateAuthentication certificateValidationMode="None" />
              </serviceCertificate>
           </clientCredentials>
        </behavior>

web.config 입니까? ASP.NET Core에 대한 대안이 있습니까?
Shimmy Weitzhandler

6

이 코드는 저에게 효과적이었습니다. 내가 관심있는 URL이 사용하고 있기 때문에 TLS2를 추가해야했습니다.

ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;
ServicePointManager.ServerCertificateValidationCallback +=
    (sender, cert, chain, sslPolicyErrors) => { return true; };
using (var client = new HttpClient())
{
    client.BaseAddress = new Uri(UserDataUrl);
    client.DefaultRequestHeaders.Accept.Clear();
    client.DefaultRequestHeaders.Accept.Add(new
      MediaTypeWithQualityHeaderValue("application/json"));
    Task<string> response = client.GetStringAsync(UserDataUrl);
    response.Wait();

    if (response.Exception != null)
    {
         return null;
    }

    return JsonConvert.DeserializeObject<UserData>(response.Result);
}

4

SSL 인증서 우회 ....

        HttpClientHandler clientHandler = new HttpClientHandler();
        clientHandler.ServerCertificateCustomValidationCallback = (sender, cert, chain, sslPolicyErrors) => { return true; };

        // Pass the handler to httpclient(from you are calling api)
        var client = new HttpClient(clientHandler)

2

소켓을 직접 사용하고 클라이언트로 인증하는 경우 Service Point Manager 콜백 메서드가 작동하지 않습니다. 여기 저에게 효과적이었습니다. 테스트 목적으로 만 사용하십시오 .

var activeStream = new SslStream(networkStream, false, (a, b, c, d) => { return true; });
await activeStream.AuthenticateAsClientAsync("computer.local");

여기서 핵심은 SSL 스트림의 생성자에서 원격 인증서 유효성 검사 콜백을 제공하는 것입니다.


2

이것은 .Net Core에서 작동합니다. Soap 클라이언트를 호출합니다.

client.ClientCredentials.ServiceCertificate.SslCertificateAuthentication =
                new X509ServiceCertificateAuthentication()
                {
                    CertificateValidationMode = X509CertificateValidationMode.None,
                    RevocationMode = X509RevocationMode.NoCheck
                };  

1

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

일종의 자체 서명 인증서가 필요합니다. 당신이 무엇을하는지 알고 있다면 게시 된 BIGNUM 바이너리를 사용할 수 있지만, 그렇지 않다면 인증서를 찾을 수 있습니다. IIS Express를 사용하는 경우 이미 이러한 항목 중 하나가있을 것이므로 찾아야합니다. Firefox 또는 원하는 브라우저를 열고 개발 웹 사이트로 이동하십시오. URL 표시 줄에서 인증서 정보를 볼 수 있어야하며 브라우저에 따라 인증서를 파일로 내보낼 수 있어야합니다.

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

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


0

오래되었지만 여전히 도움이됩니다 ...

동일한 동작을 달성하는 또 다른 좋은 방법은 구성 파일 (web.config)을 사용하는 것입니다.

 <system.net>
    <settings>
      <servicePointManager checkCertificateName="false" checkCertificateRevocationList="false" />
    </settings>
  </system.net>

참고 : .net 전체에서 테스트되었습니다.


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