Saya kesulitan untuk membuat aplikasi Windows 8 saya berkomunikasi dengan API web pengujian saya melalui SSL.
Tampaknya HttpClient / HttpClientHandler tidak menyediakan dan opsi untuk mengabaikan sertifikat tidak tepercaya seperti WebRequest memungkinkan Anda untuk (meskipun dengan cara "hacky" ServerCertificateValidationCallback
).
Bantuan apa pun akan sangat dihargai!
c#
.net
windows-8
windows-runtime
Jamie
sumber
sumber
Jawaban:
Dengan Windows 8.1, Anda sekarang dapat mempercayai sertifikat SSL yang tidak valid. Anda harus menggunakan Windows.Web.HttpClient atau jika Anda ingin menggunakan System.Net.Http.HttpClient, Anda dapat menggunakan adaptor penangan pesan yang saya tulis: http://www.nuget.org/packages/WinRtHttpClientHandler
Docs ada di GitHub: https://github.com/onovotny/WinRtHttpClientHandler
sumber
Solusi cepat dan kotor adalah menggunakan
ServicePointManager.ServerCertificateValidationCallback
delegasi. Ini memungkinkan Anda untuk memberikan validasi sertifikat Anda sendiri. Validasi diterapkan secara global di seluruh Domain Aplikasi.Saya menggunakan ini terutama untuk pengujian unit dalam situasi di mana saya ingin menjalankan titik akhir yang saya hosting dalam proses dan saya mencoba untuk memukulnya dengan klien WCF atau
HttpClient
.Untuk kode produksi Anda mungkin menginginkan kontrol yang lebih halus dan akan lebih baik menggunakan properti
WebRequestHandler
danServerCertificateValidationCallback
delegasinya (Lihat jawaban dtb di bawah ). Atau jawaban ctacke menggunakanHttpClientHandler
. Saya lebih memilih salah satu dari keduanya sekarang bahkan dengan tes integrasi saya daripada bagaimana saya dulu melakukannya kecuali saya tidak dapat menemukan kait lain.sumber
ServicePointManager.GetServicePoint(Uri)
(lihat dokumen ) untuk mendapatkan titik layanan yang hanya berlaku untuk panggilan ke URI tersebut. Anda kemudian dapat menyetel properti dan menangani acara berdasarkan subset tersebut.Lihat Kelas WebRequestHandler dan Properti ServerCertificateValidationCallback -nya :
sumber
derived class
?HttpClientHandler
?Jika Anda mencoba melakukan ini di pustaka .NET Standard, berikut adalah solusi sederhana, dengan semua risiko hanya kembali
true
ke penangan Anda. Saya serahkan keamanan kepada Anda.sumber
Atau Anda bisa menggunakan untuk HttpClient di
Windows.Web.Http
namespace:sumber
System.Net.Http
,System.Web
danWindows.Web.Http
bersama - sama?Jika Anda menggunakan
System.Net.Http.HttpClient
Saya yakin pola yang benar adalahsumber
Sebagian besar jawaban di sini menyarankan untuk menggunakan pola tipikal:
karena antarmuka IDisposable. Tolong jangan!
Microsoft memberi tahu Anda alasannya:
Dan di sini Anda dapat menemukan analisis terperinci tentang apa yang terjadi di balik layar: https://aspnetmonsters.com/2016/08/2016-08-27-httpclientwrong/
Mengenai pertanyaan SSL Anda dan berdasarkan https://docs.microsoft.com/en-us/azure/architecture/antipatterns/improper-instantiation/#how-to-fix-the-problem
Inilah pola Anda:
sumber
Jika ini untuk aplikasi Windows Runtime, maka Anda harus menambahkan sertifikat yang ditandatangani sendiri ke proyek dan mereferensikannya di appxmanifest.
Dokumennya ada di sini: http://msdn.microsoft.com/en-us/library/windows/apps/hh465031.aspx
Hal yang sama jika berasal dari CA yang tidak tepercaya (seperti CA pribadi yang tidak dipercaya oleh mesin itu sendiri) - Anda perlu mendapatkan sertifikat publik CA, tambahkan sebagai konten ke aplikasi lalu tambahkan ke manifes.
Setelah selesai, aplikasi akan melihatnya sebagai sertifikat yang ditandatangani dengan benar.
sumber
Saya tidak punya jawaban, tapi saya punya alternatif.
Jika Anda menggunakan Fiddler2 untuk memantau lalu lintas DAN mengaktifkan Dekripsi HTTPS, lingkungan pengembangan Anda tidak akan mengeluh. Ini tidak akan berfungsi pada perangkat WinRT, seperti Microsoft Surface, karena Anda tidak dapat menginstal aplikasi standar pada perangkat tersebut. Tapi komputer Win8 pengembangan Anda akan baik-baik saja.
Untuk mengaktifkan enkripsi HTTPS di Fiddler2, buka Alat> Opsi Fiddler> HTTPS (Tab)> Centang "Dekripsi Lalu Lintas HTTPS" .
Saya akan terus mengawasi utas ini dengan harapan ada seseorang yang memiliki solusi yang elegan.
sumber
Saya menemukan contoh di klien Kubernetes ini di mana mereka menggunakan X509VerificationFlags.AllowUnknownCertificateAuthority untuk memercayai sertifikat akar yang ditandatangani sendiri yang ditandatangani sendiri. Saya sedikit mengerjakan ulang contoh mereka untuk bekerja dengan sertifikat dasar yang dikodekan PEM kami sendiri. Semoga ini membantu seseorang.
sumber
Saya menemukan contoh online yang tampaknya berfungsi dengan baik:
Pertama, Anda membuat ICertificatePolicy baru
Kemudian gunakan saja ini sebelum mengirim permintaan http Anda seperti:
http://www.terminally-incoherent.com/blog/2008/05/05/send-a-https-post-request-with-c/
sumber
ServicePointManager.CertificatePolicy
tidak digunakan lagi: docs.microsoft.com/en-us/dotnet/framework/whats-new/…