Saya mencoba menemukan cara untuk mengabaikan pemeriksaan sertifikat ketika meminta sumber daya Https, sejauh ini, saya menemukan beberapa artikel bermanfaat di internet.
Tetapi saya masih memiliki beberapa masalah. Harap tinjau kode saya. Saya hanya tidak mengerti apa artinya kode ServicePointManager.ServerCertificateValidationCallback
.
Kapan metode delegasi ini dipanggil? Dan satu pertanyaan lagi, di tempat mana saya harus menulis kode ini? Sebelum ServicePointManager.ServerCertificateValidationCallback
dieksekusi atau sebelumnya Stream stream = request.GetRequestStream()
?
public HttpWebRequest GetRequest()
{
CookieContainer cookieContainer = new CookieContainer();
// Create a request to the server
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(_remoteUrl);
#region Set request parameters
request.Method = _context.Request.HttpMethod;
request.UserAgent = _context.Request.UserAgent;
request.KeepAlive = true;
request.CookieContainer = cookieContainer;
request.PreAuthenticate = true;
request.AllowAutoRedirect = false;
#endregion
// For POST, write the post data extracted from the incoming request
if (request.Method == "POST")
{
Stream clientStream = _context.Request.InputStream;
request.ContentType = _context.Request.ContentType;
request.ContentLength = clientStream.Length;
ServicePointManager.ServerCertificateValidationCallback = delegate(
Object obj, X509Certificate certificate, X509Chain chain,
SslPolicyErrors errors)
{
return (true);
};
Stream stream = request.GetRequestStream();
....
}
....
return request;
}
}
c#
ssl
httpwebrequest
certificate
Joe.wang
sumber
sumber
Jawaban:
Karena hanya ada satu ServicePointManager global , pengaturan ServicePointManager.ServerCertificateValidationCallback akan menghasilkan hasil bahwa semua permintaan selanjutnya akan mewarisi kebijakan ini. Karena ini adalah "pengaturan" global, akan lebih disukai untuk mengaturnya dalam metode Application_Start di Global.asax .
Mengatur panggilan balik mengabaikan perilaku default dan Anda sendiri dapat membuat rutin validasi khusus.
sumber
HttpWebRequest
. Jika Anda menggunakan cara lain, Anda harus melihat dalam dokumentasi cara melakukannya.Bagi siapa pun yang tertarik menerapkan solusi ini berdasarkan permintaan, ini adalah opsi dan menggunakan ekspresi Lambda. Ekspresi Lambda yang sama dapat diterapkan pada filter global yang disebutkan oleh blak3r juga. Metode ini tampaknya memerlukan .NET 4.5.
Di .NET 4.0, Ekspresi Lambda dapat diterapkan ke filter global
sumber
true
adalah sesuatu yang dapat Anda lakukan saat bereksperimen selama pengembangan, namun tidak aman. Itu harus bersyarat.(HttpWebRequest)WebRequest.Create(url)
sangat valid, tetapi di kotak saya,HttpWebRequest.Create(url)
masih ada dalam penargetan proyek .Net 4.6.2. Pilihan Chef, tetapi pada titikHttpClient
ini mungkin API yang lebih baik untuk digunakan.Ini bekerja untuk saya:
Cuplikan dari sini: http://www.west-wind.com/weblog/posts/2011/Feb/11/HttpWebRequest-and-Ignoring-SSL-Certificate-Errors
sumber
Juga ada solusi delegasi singkat:
sumber
true
tidak aman.Sebutkan bahwa sebelum .NET 4.5 properti pada permintaan untuk mengaksesnya
ServicePointManager
tidak tersedia.Berikut adalah .NET 4.0 kode yang akan memberi Anda akses ke
ServicePoint
berdasarkan permintaan per. Itu tidak memberi Anda akses ke panggilan balik per-permintaan, tetapi seharusnya memberi Anda informasi lebih lanjut tentang masalah tersebut. Akses sajascvPoint.Certificate
(atauClientCertificate
jika Anda suka) properti.sumber
ignore
mereka, bukan mempercayai mereka.ServicePoint
Saya tidak selalu bisa mempercayai semua sertifikat SSL, juga tidak mengabaikan semua sertifikat , karena belumServerCertificateValidationCallback
mendelegasikan di ServicePointSecara kebetulan, ini adalah cara paling tidak resmi untuk mematikan semua validasi sertifikat di aplikasi tertentu yang saya ketahui:
sumber
Daripada menambahkan panggilan balik ke ServicePointManager yang akan mengesampingkan validasi sertifikat secara global, Anda bisa mengatur panggilan balik pada instance lokal HttpClient. Pendekatan ini hanya akan memengaruhi panggilan yang dibuat menggunakan instance HttpClient itu.
Berikut adalah contoh kode yang menunjukkan bagaimana mengabaikan kesalahan validasi sertifikat untuk server tertentu mungkin diimplementasikan dalam pengontrol Web API.
sumber
Berdasarkan jawaban Adam dan komentar Rob, saya menggunakan ini:
yang menyaring "pengabaian" agak. Emiten lain dapat ditambahkan seperti yang dipersyaratkan tentunya. Ini diuji dalam. NET 2.0 karena kami perlu mendukung beberapa kode lawas.
sumber
CA5386: Alat analisis kerentanan akan memberi tahu Anda tentang kode-kode ini.
Kode yang benar:
sumber
Untuk .net core
sumber
Dinyatakan secara eksplisit ...
sumber
Menambah jawaban Sani dan blak3r, saya telah menambahkan kode startup berikut untuk aplikasi saya, tetapi dalam VB:
Tampaknya melakukan trik.
sumber
Tip: Anda juga dapat menggunakan metode ini untuk melacak sertifikat yang akan segera kedaluwarsa. Ini dapat menghemat daging Anda jika Anda menemukan sertifikat yang akan kedaluwarsa dan dapat memperbaikinya tepat waktu. Bagus juga untuk perusahaan pihak ketiga - bagi kami ini adalah DHL / FedEx. DHL membiarkan sertifikat berakhir yang mengacaukan kami 3 hari sebelum Thanksgiving. Untungnya saya ada untuk memperbaikinya ... kali ini!
sumber
ProwlUtil.StepReached
?Beberapa jawaban di atas berhasil. Saya ingin pendekatan yang saya tidak harus terus membuat perubahan kode dan tidak membuat kode saya tidak aman. Karenanya saya membuat daftar putih. Daftar putih dapat dipertahankan di datastore apa pun. Saya menggunakan file konfigurasi karena ini adalah daftar yang sangat kecil.
Kode saya di bawah.
sumber
Unity C # Versi dari solusi ini:
sumber