Saya telah menggunakan HttpClient
untuk membuat panggilan WebApi menggunakan C #. Tampak rapi & cepat dibandingkan dengan WebClient
. Namun saya terjebak saat melakukan Https
panggilan.
Bagaimana saya bisa membuat kode di bawah ini untuk melakukan Https
panggilan?
HttpClient httpClient = new HttpClient();
httpClient.BaseAddress = new Uri("https://foobar.com/");
httpClient.DefaultRequestHeaders.Accept.Clear();
httpClient.DefaultRequestHeaders.Accept.Add(
new MediaTypeWithQualityHeaderValue("application/xml"));
var task = httpClient.PostAsXmlAsync<DeviceRequest>(
"api/SaveData", request);
EDIT 1: Kode di atas berfungsi dengan baik untuk membuat panggilan http. Tetapi ketika saya mengubah skema ke https tidak berfungsi. Inilah kesalahan yang didapat:
Koneksi yang mendasarinya ditutup: Tidak dapat membangun hubungan saling percaya untuk saluran aman SSL / TLS.
EDIT 2: Mengubah skema ke https adalah: langkah pertama.
Bagaimana saya menyediakan sertifikat & kunci publik / pribadi bersama dengan permintaan C #.
c#
asp.net-web-api
dotnet-httpclient
Abhijeet
sumber
sumber
new Uri("https://foobar.com/");
Jawaban:
Jika server hanya mendukung versi TLS yang lebih tinggi seperti TLS 1.2 saja, itu masih akan gagal kecuali PC klien Anda dikonfigurasi untuk menggunakan versi TLS yang lebih tinggi secara default. Untuk mengatasi masalah ini tambahkan berikut ini dalam kode Anda.
Mengubah kode contoh Anda, itu akan menjadi
sumber
SecurityProtocolType.Tls12
tidak dapat menemukan nilai enum yang Anda sebutkanCukup tentukan HTTPS di URI.
Foobar.com perlu memiliki sertifikat SSL tepercaya atau panggilan Anda akan gagal dengan kesalahan yang tidak tepercaya.
Jawaban EDIT: Sertifikat Klien dengan HttpClient
EDIT Answer2: Jika server yang Anda sambungkan telah menonaktifkan SSL, TLS 1.0, dan 1.1 dan Anda masih menjalankan .NET framework 4.5 (atau di bawah), Anda harus menentukan pilihan
sumber
ServicePointManager.ServerCertificateValidationCallback += (sender, cert, chain, sslPolicyErrors) => true;
GetMyX509Certificate
?Kode Anda harus dimodifikasi dengan cara ini:
Anda baru saja menggunakan
https:
skema URI. Ada halaman yang berguna di sini di MSDN tentang koneksi HTTP aman. Memang:Selain itu, pertimbangkan bahwa koneksi HTTPS menggunakan sertifikat SSL. Pastikan koneksi aman Anda memiliki sertifikat ini jika tidak, permintaan akan gagal.
EDIT:
Apa artinya itu tidak berhasil? Permintaan gagal? Pengecualian dilemparkan? Jelaskan pertanyaan Anda.
Jika permintaan gagal, maka masalahnya adalah sertifikat SSL.
Untuk memperbaiki masalah ini, Anda bisa menggunakan kelas
HttpWebRequest
dan kemudian propertinyaClientCertificate
. Selanjutnya, Anda dapat menemukan di sini contoh yang berguna tentang cara membuat permintaan HTTPS menggunakan sertifikat.Contohnya adalah sebagai berikut (seperti yang ditunjukkan pada halaman MSDN yang ditautkan sebelumnya):
sumber
Ketika terhubung ke
https
saya mendapat kesalahan ini juga, saya menambahkan baris ini sebelumnyaHttpClient httpClient = new HttpClient();
dan terhubung dengan sukses:Saya tahu itu dari Jawaban Ini dan Anwser Lain yang Mirip dan komentarnya menyebutkan:
Selain itu, saya tidak mencoba metode dalam Jawaban Lain yang menggunakan
new X509Certificate()
ataunew X509Certificate2()
untuk membuat Sertifikat, saya tidak yakinnew()
apakah hanya akan berhasil atau tidak.EDIT: Beberapa Referensi:
Buat Sertifikat Server yang Ditandatangani Sendiri di IIS 7
Impor dan Ekspor Sertifikat SSL di IIS 7
Konversikan .pfx ke .cer
Praktik terbaik untuk menggunakan ServerCertificateValidationCallback
Saya menemukan nilai Thumbprint sama dengan
x509certificate.GetCertHashString()
:Ambil kembali Cap Jempol Sertifikat
sumber
Saya memiliki masalah yang sama saat menghubungkan ke GitHub, yang membutuhkan agen pengguna. Jadi itu sudah cukup untuk memberikan ini daripada menghasilkan sertifikat
sumber
123456789
??Ada pengaturan non-global di tingkat
HttpClientHandler
:Dengan demikian orang mengaktifkan versi TLS terbaru.
Perhatikan, bahwa nilai default
SslProtocols.Default
sebenarnyaSslProtocols.Ssl3 | SslProtocols.Tls
(diperiksa untuk .Net Core 2.1 dan .Net Framework 4.7.1).sumber
Hanya menentukan HTTPS di URI harus melakukan trik.
Jika permintaan berfungsi dengan HTTP tetapi gagal dengan HTTPS maka ini pasti masalah sertifikat . Pastikan pemanggil mempercayai penerbit sertifikat dan bahwa sertifikat itu tidak kedaluwarsa. Cara cepat dan mudah untuk memeriksa itu adalah dengan mencoba membuat kueri di browser.
Anda juga mungkin ingin memeriksa di server (apakah itu milik Anda dan / atau jika Anda bisa) apakah itu diatur untuk melayani permintaan HTTPS dengan benar.
sumber
Saya juga mendapatkan kesalahan:
... dengan aplikasi Xamarin Forms Android yang mencoba meminta sumber daya dari penyedia API yang memerlukan TLS 1.3.
Solusinya adalah memperbarui konfigurasi proyek untuk menukar klien http Xamarin "managed" (.NET) (yang tidak mendukung TLS 1.3 pada Xamarin Forms v2.5), dan sebagai gantinya menggunakan klien asli android.
Ini adalah proyek sederhana beralih di studio visual. Lihat tangkapan layar di bawah ini.
sumber
Tambahkan deklarasi di bawah ini ke kelas Anda:
Setelah:
Dan:
Senang? :)
sumber
Saya punya masalah ini dan dalam kasus saya solusinya sangat sederhana: buka Visual Studio dengan hak Administrator. Saya mencoba semua solusi di atas dan tidak berhasil sampai saya melakukan ini. Semoga itu menghemat waktu berharga seseorang.
sumber
Anda dapat mencoba menggunakan Paket Nugget ModernHttpClient: Setelah mengunduh paket, Anda dapat mengimplementasikannya seperti ini:
sumber
Saya setuju dengan felickz tetapi saya juga ingin menambahkan contoh untuk memperjelas penggunaan dalam c #. Saya menggunakan layanan SSL di windows sebagai berikut.
Jika saya akan menggunakannya dalam aplikasi web, saya hanya mengubah implementasi di sisi proxy seperti ini:
sumber
Untuk kesalahan:
Saya pikir Anda perlu menerima sertifikat tanpa syarat dengan kode berikut
sebagai Oposisi menulis dalam jawaban untuk pertanyaan . NET klien yang terhubung ke ssl Web API .
sumber