C # Sertifika hatalarını yoksay?


159

Uzak bir web hizmetine bir web hizmeti isteği sırasında aşağıdaki hatayı alıyorum:

SSL / TLS güvenli kanalı için güven ilişkisi kurulamadı. ---> System.Security.Authentication.AuthenticationException: Doğrulama yordamına göre uzak sertifika geçersiz.

Bu hatayı yok sayıp devam etmek için yine de var mı?

Uzak sertifika imzalanmamış gibi görünüyor.

Bağlandığım site www.czebox.cz- siteyi ziyaret etmekten çekinmeyin ve tarayıcıların bile güvenlik istisnaları attığını fark edin.

Yanıtlar:


341

Sertifika doğrulama işleyicisi ekleyin. Geri dönmek true, doğrulama hatasının yok sayılmasına izin verir:

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

6
Bu, ilk göründüğünden daha da yararlıdır. Yönetilen Borsa Web Hizmetleri (EWS) kullanırken OP sorununa koştum. Yönetilen kütüphane tarafından yapılan düşük seviyeli SOAP çağrılarına erişimim olmadığından bu cevabı kullanamayacağımı düşündüm. Ama bir kez daha baktığımda, ServicePointManager'ın kendi başına durduğunu fark ettim. Bu yüzden, ExchangeService'i başlatmadan önce yukarıdaki geri çağrıyı ekledim ve bir cazibe gibi çalıştı.
Mark Meuer

2
İşte baypasın küresel olarak nasıl uygulanacağına dair bir örnek. Hepimiz için kötü uygulamalara. (Bazen başka seçeneğiniz yoktur) jasig.275507.n4.nabble.com/…
snowYetis

1
büyük bir teşekkür, bu sorunu geçici olarak çözer. Bu kodu Web Api'deki Startup.cs dosyasına ekleyin
Sivalingaamorthy

2
@MarkMeuer neredeyse EWS API sorunum için bu çözümden vazgeçecekti, ama sonra yorumunuzu gördüm.
Mahen

7
@MiguelVeloso tabii ki aşağıya oy vermekte özgürsünüz, ancak ne sorunun ne de yanıtın bunun güvenlik tarafını tartıştığını unutmayın. Konu, farklı bir konu olan "neden yapmalıyız / yapmamalıyız" değil, açıkça "doğrulama hatasını nasıl göz ardı edeceğidir" dir. OP'nin neden yapmaması gerektiği üzerine bir tartışmaya gitmek, sadece suları çamurlandıracaktır, çünkü yorumcular aslında bunu yapacağınız makul durumlar olduğunu belirtti . Bu yüzden konuya sadık kalıyoruz ve sorunu çözüyoruz.
Peter Lillevold

40

Tüm sertifikalara izin vermek çok güçlü ancak tehlikeli de olabilir. Yalnızca geçerli sertifikalara ve bazı belirli sertifikalara izin vermek istiyorsanız, bu şekilde yapılabilir.

Net çekirdek:.

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;
    }
}

Net çerçeve:

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;
};

Güncelleme:

cert.GetCertHashString()Chrome'da nasıl değer elde edilir :

Adres çubuğunda Secureveya üzerine tıklayın Not Secure.

resim açıklamasını buraya girin

resim açıklamasını buraya girin

Ardından Sertifika -> Ayrıntılar -> Parmakizi'ye tıklayın ve değeri kopyalayın. Yapmayı unutma cert.GetCertHashString().ToLower().

resim açıklamasını buraya girin


3
@MiguelVeloso Tamamen katılıyorum. Bu, güvenlikten tamamen ödün vermeden bir veya iki sertifikanın kontrolünü atlamayı (umarız) atlamanızı sağlar.
Kemuel Sanchez

Hash StringBir sertifikadan nasıl alabilirim ?
Kiquenet

@Kiquenet Ya kodunu ve çalıştırmak hata ayıklama cert.GetCertHashString()gelen Immediate windowveya çek sertifika Thumbprinttarayıcınızda veya MMCyerel olarak yüklü olup olmadığını.
18'de Ogglas

Sunucu kontrolümüz altında, üretimde @ Ogglas'ın kodunu kullanmak hala güvenli mi? TLS / SSL kullanarak, ortadaki adam gibi saldırılar durdurulabilir mi?
Pingpong

Teşekkürler Çok Büyük Yardım.
Wowo Ot

30

IgnoreBadCertificates Yöntemi:

//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
Bu benim kod ile çalışmak için bir satır daha eklemek zorunda kaldı (websocket4net kullanıyorum). System.Net.ServicePointManager.CheckCertificateRevocationList = false; Sunucu sertifika doğrulaması geri aramasını ayarladıktan hemen sonra.
16:19

24

Başarısız olmasının nedeni, imzalanmadığı için değil, kök sertifika istemciniz tarafından güvenilmediği içindir. SSL doğrulamasını kapatmak yerine alternatif bir yaklaşım, kök CA sertifikasını uygulamanızın güvendiği CA'lar listesine eklemek olacaktır.

Bu, uygulamanızın şu anda güvenmediği kök CA sertifikasıdır:

-----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-----

Bu sertifikayı kullanarak kodu çözebilir ve görüntüleyebilirsiniz

bu sertifika dekoderi veya başka bir sertifika dekoderi


Evet! Bu benim durumum, ancak bir VM olmadan sertifikayı Azure'a nasıl ekleyebilirim? Sadece X509Store API'sını kullanabilir miyim? Ben yarın deneyeceğim ama herhangi bir bilgi burada açığız
João Antunes

7

İstemci yapılandırmasında SSL sertifika doğrulamasını devre dışı bırakmak için.

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

Bu web.config mi? ASP.NET Core için alternatif var mı?
Shimmy Weitzhandler

5

Bu kod benim için çalıştı. TLS2 eklemek zorunda kaldım, çünkü ilgilendiğim URL de buydu.

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);
}

3

SSL Sertifikasını Atla ....

        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

Doğrudan soketleri kullanıyorsanız ve istemci olarak kimlik doğrulaması yapıyorsanız, Service Point Manager geri arama yöntemi çalışmaz. İşte benim için işe yarayan. SADECE AMAÇLARIN TEST EDİLMESİ İÇİN LÜTFEN KULLANIN .

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

Buradaki anahtar, doğrudan SSL akışının yapıcısında uzaktan sertifika doğrulama geri aramasını sağlamaktır.


1

BIGNUM'un yayınını daha da genişletmek için - İdeal olarak, üretimde göreceğiniz koşulları simüle edecek bir çözüm istiyorsunuz ve kodunuzu değiştirmek bunu yapmaz ve dağıtmadan önce kodu çıkarmayı unutursanız tehlikeli olabilir.

Bir tür kendinden imzalı sertifikaya ihtiyacınız olacaktır. Ne yaptığınızı biliyorsanız, yayınlanan ikili BIGNUM'u kullanabilirsiniz, ancak değilse sertifika için avlanabilirsiniz. IIS Express kullanıyorsanız bunlardan birine zaten sahip olacaksınız, sadece bulmanız gerekecek. Firefox'u veya istediğiniz tarayıcıyı açın ve geliştirici web sitenize gidin. Sertifika bilgilerini URL çubuğundan görüntüleyebilmeniz ve tarayıcınıza bağlı olarak sertifikayı bir dosyaya aktarabilmeniz gerekir.

Ardından, MMC.exe dosyasını açın ve Sertifika ek bileşenini ekleyin. Sertifika dosyanızı Güvenilen Kök Sertifika Yetkilileri deposuna alın ve ihtiyacınız olan tek şey budur. 'Kişisel' gibi başka bir mağazaya değil, o mağazaya gittiğinden emin olmak önemlidir. MMC veya sertifikalara aşina değilseniz, bunun nasıl yapılacağı hakkında bilgi içeren çok sayıda web sitesi vardır.

Şimdi, bilgisayarınız bir bütün olarak kendi ürettiği sertifikalara dolaylı olarak güvenecek ve bunu özel olarak işlemek için kod eklemeniz gerekmeyecek. Üretime geçtiğinizde, orada uygun bir geçerli sertifikanız olması koşuluyla çalışmaya devam edecektir. Bunu bir üretim sunucusunda yapmayın - bu kötü olur ve sunucunun kendisinden başka istemciler için çalışmaz.


1

Bu .Net Core için çalışır. Sabun istemcinizi arayın:

client.ClientCredentials.ServiceCertificate.SslCertificateAuthentication =
                new X509ServiceCertificateAuthentication()
                {
                    CertificateValidationMode = X509CertificateValidationMode.None,
                    RevocationMode = X509RevocationMode.NoCheck
                };  
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.