C # Abaikan kesalahan sertifikat?


159

Saya mendapatkan kesalahan berikut selama permintaan layanan web ke layanan web jarak jauh:

Tidak dapat membangun hubungan saling percaya untuk saluran aman SSL / TLS. ---> System.Security.Authentication.AuthenticationException: Sertifikat jarak jauh tidak valid sesuai dengan prosedur validasi.

Apakah ada cara untuk mengabaikan kesalahan ini, dan melanjutkan?

Tampaknya sertifikat jarak jauh tidak ditandatangani.

Situs yang saya hubungkan adalah www.czebox.cz- jadi jangan ragu untuk mengunjungi situs tersebut, dan perhatikan bahkan browser memberikan pengecualian keamanan.

Jawaban:


341

Tambahkan penangan validasi sertifikat. Kembali trueakan memungkinkan mengabaikan kesalahan validasi:

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

6
Ini bahkan lebih berguna daripada saat pertama kali muncul. Saya mengalami masalah OP saat menggunakan Managed Exchanged Web Services (EWS). Saya berpikir bahwa saya tidak dapat menggunakan jawaban ini karena saya tidak memiliki akses ke panggilan SOAP tingkat rendah yang sedang dibuat oleh perpustakaan yang dikelola itu. Tetapi ketika saya melihat lagi, saya menyadari ServicePointManager berdiri sendiri. Jadi, saya menambahkan callback di atas sebelum menginisialisasi ExchangeService dan itu berfungsi seperti pesona.
Mark Meuer

2
Berikut adalah contoh cara menerapkan bypass secara global. Untuk kita semua menjadi praktik buruk. (Terkadang Anda tidak punya pilihan) jasig.275507.n4.nabble.com/...
snowYetis

1
Terima kasih banyak, ini menyelesaikan masalah sementara. Tambahkan kode ini di Startup.cs di Web Api
Sivalingaamorthy

2
@MarkMeuer hampir akan menyerah pada solusi ini untuk masalah API EWS saya, tapi kemudian saya melihat komentar Anda.
Mahen

7
@MiguelVeloso Anda bebas untuk downvote ofcourse, tetapi perlu diingat, baik pertanyaan maupun jawaban membahas sisi keamanan ini. Topiknya secara eksplisit "bagaimana mengabaikan kesalahan validasi", bukan "mengapa kita melakukan / tidak melakukan ini", yang merupakan topik yang berbeda secara keseluruhan. Pergi ke diskusi tentang mengapa OP seharusnya tidak melakukan itu hanya akan mengeruhkan air, karena komentator telah menunjukkan ada kasus yang masuk akal di mana Anda benar - benar akan melakukan ini. Jadi kami tetap berpegang pada topik dan memecahkan masalah.
Peter Lillevold

40

Mengizinkan semua sertifikat sangat kuat tetapi juga bisa berbahaya. Jika Anda hanya ingin mengizinkan sertifikat yang valid ditambah beberapa sertifikat tertentu, itu bisa dilakukan seperti ini.

Inti bersih:

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

Framework .Net:

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

Memperbarui:

Cara mendapatkan cert.GetCertHashString()nilai di Chrome:

Klik Secureatau Not Securedi bilah alamat.

masukkan deskripsi gambar di sini

masukkan deskripsi gambar di sini

Kemudian klik Certificate -> Details -> Thumbprint dan salin nilainya. Ingat untuk melakukannya cert.GetCertHashString().ToLower().

masukkan deskripsi gambar di sini


3
@MiguelVeloso Sepenuhnya setuju. Ini memungkinkan untuk melewatkan pemeriksaan pada (mudah-mudahan) satu atau dua sertifikat tanpa sepenuhnya mengganggu keamanan.
Kemuel Sanchez

Bagaimana saya bisa dapatkan Hash Stringdari sertifikat?
Kiquenet

@Kiquenet Baik debug kode dan jalankan cert.GetCertHashString()dari Immediate windowatau periksa cert Thumbprintdi browser Anda atau MMCjika diinstal secara lokal.
Ogglas

Server berada dalam kendali kami, apakah masih aman untuk menggunakan kode @ Ogglas pada produksi? Menggunakan TLS / SSL, dapatkah serangan seperti man-in-the-middle dihentikan?
Pingpong

Terima kasih bantuannya sangat besar.
Wowo Ot

30

Metode Sertifikat IgnoreBad:

//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
Saya harus menambahkan satu baris lagi agar kode ini berfungsi dengan saya (saya menggunakan websocket4net). System.Net.ServicePointManager.CheckCertificateRevocationList = false; Tepat setelah pengaturan panggilan balik validasi sertifikat server.
kalyanswaroop

24

Alasan kegagalan itu bukan karena tidak ditandatangani tetapi karena sertifikat root tidak dipercaya oleh klien Anda. Daripada mematikan validasi SSL, pendekatan alternatif akan menambahkan root CA cert ke daftar CA trust aplikasi Anda.

Ini adalah root CA cert yang saat ini tidak dipercayai oleh aplikasi Anda:

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

Anda dapat memecahkan kode dan melihat sertifikat ini menggunakan

decoder sertifikat ini atau decoder sertifikat lainnya


Iya! Ini adalah kasus saya, tetapi bagaimana saya bisa menambahkan sertifikat pada Azure, tanpa VM? Bisakah saya menggunakan X509Store API? Saya akan mencobanya besok, tetapi info apa pun diterima di sini
João Antunes

7

Untuk menonaktifkan validasi ssl cert dalam konfigurasi klien.

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

Apakah ini web.config ? Ada alternatif untuk ASP.NET Core?
Shimmy Weitzhandler

5

Kode ini bekerja untuk saya. Saya harus menambahkan TLS2 karena itulah yang saya tertarik menggunakan URL.

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

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

Jika Anda menggunakan soket secara langsung dan mengautentikasi sebagai klien, maka metode panggilan balik Service Point Manager tidak akan berfungsi. Inilah yang berhasil bagi saya. HARAP GUNAKAN UNTUK MENGUJI TUJUAN HANYA .

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

Kuncinya di sini, adalah untuk menyediakan panggilan balik validasi sertifikat jarak jauh tepat di konstruktor aliran SSL.


1

Untuk lebih memperluas posting BIGNUM - Idealnya Anda menginginkan solusi yang akan mensimulasikan kondisi yang akan Anda lihat dalam produksi dan memodifikasi kode Anda tidak akan melakukan itu dan bisa berbahaya jika Anda lupa mengeluarkan kode sebelum Anda menyebarkannya.

Anda akan membutuhkan semacam sertifikat yang ditandatangani sendiri. Jika Anda tahu apa yang Anda lakukan, Anda dapat menggunakan BIGNUM biner yang diposting, tetapi jika tidak, Anda bisa mencari sertifikat. Jika Anda menggunakan IIS Express Anda sudah memiliki salah satu dari ini, Anda hanya perlu menemukannya. Buka Firefox atau browser apa pun yang Anda suka dan buka situs web dev Anda. Anda harus dapat melihat informasi sertifikat dari bilah URL dan tergantung pada browser Anda, Anda harus dapat mengekspor sertifikat ke file.

Selanjutnya, buka MMC.exe, dan tambahkan snap-in Sertifikat. Impor file sertifikat Anda ke toko Otoritas Sertifikat Akar Tepercaya dan hanya itu yang Anda butuhkan. Sangat penting untuk memastikan itu masuk ke toko itu dan bukan toko lain seperti 'Pribadi'. Jika Anda tidak terbiasa dengan MMC atau sertifikat, ada banyak situs web dengan informasi cara melakukan ini.

Sekarang, komputer Anda secara keseluruhan akan secara implisit mempercayai sertifikat apa pun yang telah dihasilkan sendiri dan Anda tidak perlu menambahkan kode untuk menangani ini secara khusus. Ketika Anda beralih ke produksi, itu akan terus bekerja asalkan Anda memiliki sertifikat yang sah yang terpasang di sana. Jangan lakukan ini di server produksi - itu akan buruk dan tidak akan berfungsi untuk klien lain selain yang ada di server itu sendiri.


1

Ini berfungsi untuk .Net Core. Hubungi klien Sabun Anda:

client.ClientCredentials.ServiceCertificate.SslCertificateAuthentication =
                new X509ServiceCertificateAuthentication()
                {
                    CertificateValidationMode = X509CertificateValidationMode.None,
                    RevocationMode = X509RevocationMode.NoCheck
                };  
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.