Lewati kesalahan sertifikat SSL yang tidak valid saat memanggil layanan web di .Net


88

Kami sedang menyiapkan SharePoint baru yang sertifikat SSL-nya belum kami miliki. Saya ingin memanggil layanan web Daftar di atasnya untuk mengambil beberapa data meta tentang penyiapan. Namun, ketika saya mencoba melakukan ini, saya mendapatkan pengecualian:

Koneksi yang mendasari ditutup: Tidak dapat membangun hubungan kepercayaan untuk saluran aman SSL / TLS.

Pengecualian bersarang berisi pesan kesalahan:

Sertifikat jarak jauh tidak valid menurut prosedur validasi.

Ini benar karena kami menggunakan sertifikat sementara.

Pertanyaan saya adalah: bagaimana saya bisa memberi tahu klien layanan web .Net ( SoapHttpClientProtocol ) untuk mengabaikan kesalahan ini?

Jawaban:


18

Pendekatan yang saya gunakan ketika menghadapi masalah ini adalah dengan menambahkan penanda tangan sertifikat sementara ke daftar otoritas tepercaya di komputer yang bersangkutan.

Saya biasanya melakukan pengujian dengan sertifikat yang dibuat dengan CACERT, dan menambahkannya ke daftar otoritas tepercaya saya bekerja dengan lancar.

Melakukannya dengan cara ini berarti Anda tidak perlu menambahkan kode khusus apa pun ke aplikasi Anda dan itu benar mensimulasikan apa yang akan terjadi ketika aplikasi Anda diterapkan. Karena itu, menurut saya ini adalah solusi terbaik untuk menonaktifkan centang secara terprogram.


Itu juga ide pertamaku. Sayangnya sertifikatnya juga sudah kadaluwarsa, jadi tidak mungkin bisa dipercaya.
jan.vdbergh

Apakah ada alasan Anda tidak dapat menggunakan seseorang seperti sertifikat CA? Jika itu adalah sertifikat tes maka Anda bisa melanjutkannya. Saya tidak yakin apakah ada cara untuk menonaktifkan centang ini!
Simon Johnson

113

Alternatifnya, Anda dapat mendaftarkan delegasi panggilan balik yang mengabaikan kesalahan sertifikasi:

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

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

1
Saya menambahkan metode statis ini ke global.asax dan menyetel acara di "OnApplicationStart". bekerja seperti pesona. Terima kasih
Juan Zamora

1
@JuanZamora Saya melakukan hal yang sama yang Anda lakukan. Berhasil!
Sachin BR

5
Hanya ini yang perlu Anda lakukan, jika Anda ingin bersikap vulnar terhadap serangan "Man in the Middle" ...
Houtman

2
Idealnya, Anda hanya melakukan ini di lingkungan pengembangan.
Ron DeFreitas

79

Seperti jawaban Jason S:

ServicePointManager.ServerCertificateValidationCallback = delegate { return true; };

Saya meletakkan ini di Utama saya dan melihat ke saya app.configdan menguji apakah (ConfigurationManager.AppSettings["IgnoreSSLCertificates"] == "True")sebelum memanggil baris kode itu.


24

Saya menyelesaikannya dengan cara ini:

Panggil yang berikut ini tepat sebelum memanggil webservice ssl Anda yang menyebabkan kesalahan itu:

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

Saya mengalami kesalahan yang sama saat menggunakan DownloadString; dan mampu membuatnya bekerja seperti di bawah ini dengan saran di halaman ini

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;

akan melewati invaild ssl. Tuliskan ke konstruktor layanan web Anda.


1

Untuk pemula, Anda dapat memperluas kelas layanan parsial Anda dalam file cs terpisah dan menambahkan kode kode yang disediakan oleh "imanabidi" untuk membuatnya terintegrasi


1

Untuk memperluas posting Simon Johnsons lebih lanjut - Idealnya Anda menginginkan solusi yang akan mensimulasikan kondisi yang akan Anda lihat dalam produksi dan memodifikasi kode Anda tidak akan melakukannya dan bisa berbahaya jika Anda lupa untuk mengeluarkan kode sebelum Anda menerapkannya.

Anda akan membutuhkan semacam sertifikat yang ditandatangani sendiri. Jika Anda menggunakan IIS Express, Anda akan memiliki salah satunya, Anda hanya perlu menemukannya. Buka Firefox atau browser apa pun yang Anda suka dan buka situs web pengembang Anda. Anda seharusnya dapat melihat informasi sertifikat dari bilah URL dan tergantung pada browser Anda, Anda harus dapat mengekspor sertifikat ke sebuah file.

Selanjutnya, buka MMC.exe, dan tambahkan snap-in Sertifikat. Impor file sertifikat Anda ke penyimpanan Trusted Root Certificate Authorities dan hanya itu yang Anda perlukan. Penting untuk memastikannya masuk ke toko itu dan bukan toko lain seperti 'Pribadi'. Jika Anda tidak terbiasa dengan MMC atau sertifikat, ada banyak situs web dengan informasi bagaimana melakukan ini.

Sekarang, komputer Anda secara keseluruhan akan secara implisit mempercayai sertifikat apa pun yang telah dibuatnya sendiri dan Anda tidak perlu menambahkan kode untuk menangani ini secara khusus. Ketika Anda pindah ke produksi, itu akan terus berfungsi asalkan Anda memiliki sertifikat valid yang tepat 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.

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.