Kami tidak bisa terhubung ke server HTTPS menggunakan WebRequest
karena pesan kesalahan ini:
Permintaan itu dibatalkan: tidak Bisa membuat SSL/TLS saluran aman.
Kita tahu bahwa server doesn't memiliki valid HTTPS sertifikat dengan jalur yang digunakan, tapi untuk melewati masalah ini, kita menggunakan kode berikut kami've diambil dari StackOverflow posting:
private void Somewhere() {
ServicePointManager.ServerCertificateValidationCallback += new RemoteCertificateValidationCallback(AlwaysGoodCertificate);
}
private static bool AlwaysGoodCertificate(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors policyErrors) {
return true;
}
Masalahnya adalah bahwa server tidak pernah memvalidasi sertifikat dan gagal dengan kesalahan di atas. Apakah ada yang punya ide apa yang harus saya lakukan?
Saya harus menyebutkan bahwa seorang rekan dan saya melakukan tes beberapa minggu yang lalu dan itu bekerja dengan baik dengan sesuatu yang mirip dengan apa yang saya tulis di atas. Hanya "perbedaan utama" kami've ditemukan adalah bahwa saya'm menggunakan Windows 7 dan ia menggunakan Windows XP. Apakah itu mengubah sesuatu?
Akhirnya saya menemukan jawabannya (saya belum't mencatat sumber saya tapi itu dari pencarian);
Sementara kode ini bekerja di Windows XP, di Windows 7, anda harus menambahkan ini di awal:
// using System.Net;
ServicePointManager.Expect100Continue = true;
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;
// Use SecurityProtocolType.Ssl3 if needed for compatibility reasons
Dan sekarang, ia bekerja dengan sempurna.
TAMBAHAN
Seperti yang disebutkan oleh Robin perancis; jika anda mendapatkan masalah ini ketika mengkonfigurasi PayPal, harap dicatat bahwa mereka tidak't dukungan SSL3 dimulai pada bulan desember, 3 tahun 2018. Anda'll perlu menggunakan TLS. Berikut ini's halaman Paypal tentang hal itu.
Pastikan ServicePointManager pengaturan yang dibuat sebelum HttpWebRequest dibuat, yang lain itu tidak akan bekerja.
Karya:
ServicePointManager.Expect100Continue = true;
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls
| SecurityProtocolType.Tls11
| SecurityProtocolType.Tls12
| SecurityProtocolType.Ssl3;
HttpWebRequest request = (HttpWebRequest)WebRequest.Create("https://google.com/api/")
Gagal:
HttpWebRequest request = (HttpWebRequest)WebRequest.Create("https://google.com/api/")
ServicePointManager.Expect100Continue = true;
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls
| SecurityProtocolType.Tls11
| SecurityProtocolType.Tls12
| SecurityProtocolType.Ssl3;
Masalah anda're memiliki adalah bahwa pengguna aspNet doesn't memiliki akses ke sertifikat. Anda harus memberikan akses menggunakan winhttpcertcfg.exe
Contoh tentang bagaimana untuk mengatur hal ini adalah: http://support.microsoft.com/kb/901183
Di bawah langkah 2 pada informasi lebih lanjut
EDIT: Di versi yang lebih baru dari IIS, fitur ini dibangun untuk manajer sertifikat alat dan dapat diakses dengan mengklik kanan pada sertifikat dan menggunakan opsi untuk mengelola kunci pribadi. Rincian lebih lanjut di sini: https://serverfault.com/questions/131046/how-to-grant-iis-7-5-access-to-a-certificate-in-certificate-store/132791#132791
Aku punya masalah ini mencoba untuk memukul https://ct.mob0.com/Styles/Fun.png, yang adalah gambar didistribusikan oleh CloudFlare pada itu's CDN yang mendukung hal-hal gila seperti SPDY dan aneh mengarahkan sertifikat SSL.
Bukannya menentukan Ssl3 seperti di Simons jawaban saya bisa memperbaikinya dengan masuk ke Tls12 seperti ini:
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;
new WebClient().DownloadData("https://ct.mob0.com/Styles/Fun.png");
Kesalahan generik dan ada banyak alasan mengapa SSL/TLS negosiasi mungkin gagal. Yang paling umum adalah yang tidak valid atau kadaluarsa sertifikat server, dan anda mengambil perawatan dengan menyediakan server anda sendiri validasi sertifikat hook, tapi belum tentu satu-satunya alasan. Server mungkin memerlukan otentikasi bersama, hal ini dapat dikonfigurasi dengan cipher suites tidak didukung oleh klien anda, mungkin memiliki waktu melayang terlalu besar untuk jabat tangan untuk berhasil dan banyak lagi alasan.
Solusi terbaik adalah dengan menggunakan SChannel alat pemecahan masalah yang ditetapkan. SChannel SSPI penyedia bertanggung jawab untuk SSL dan TLS dan klien anda akan menggunakannya untuk jabat tangan. Lihatlah TLS/SSL yang Sesuai dan Pengaturan.
Lihat juga Cara mengaktifkan Schannel event logging.
Setelah berjam-jam dengan masalah yang sama, saya menemukan bahwa ASP.NET akun klien layanan ini berjalan di bawah didn't memiliki akses ke sertifikat. Aku tetap dengan pergi ke Aplikasi IIS Outdoor bahwa aplikasi web berjalan di bawah, masuk ke Pengaturan Lanjutan, dan mengubah Identitas ke LocalSystem
account NetworkService
.
Solusi yang lebih baik adalah untuk mendapatkan sertifikat bekerja dengan default NetworkService
akun tapi ini bekerja untuk cepat pengujian fungsional.
Sesuatu yang asli jawabannya didn't memiliki. Saya menambahkan beberapa kode untuk membuat peluru bukti.
ServicePointManager.Expect100Continue = true;
ServicePointManager.DefaultConnectionLimit = 9999;
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12 | SecurityProtocolType.Ssl3;
Kemungkinan lain adalah tidak tepat sertifikat impor pada kotak. Pastikan untuk memilih dikelilingi kotak centang. Awalnya saya didn't melakukan itu, jadi kode itu baik waktu atau membuang sama pengecualian sebagai kunci pribadi tidak bisa ditemukan.
"permintaan itu dibatalkan: tidak Bisa membuat SSL/TLS saluran aman" pengecualian dapat terjadi jika server kembali HTTP 401 yang tidak Sah menanggapi permintaan HTTP.
Anda dapat menentukan jika hal ini terjadi dengan mengaktifkan trace-tingkat System.Net logging untuk aplikasi klien anda, seperti yang dijelaskan dalam jawaban.
Setelah itu konfigurasi penebangan di tempat, jalankan aplikasi dan mereproduksi kesalahan, kemudian lihat di log output untuk baris seperti ini:
System.Net Information: 0 : [9840] Connection#62912200 - Received status line: Version=1.1, StatusCode=401, StatusDescription=Unauthorized.
Dalam situasi saya, saya telah gagal untuk menetapkan cookie tertentu bahwa server mengharapkan, yang mengarah ke server menanggapi permintaan tersebut dengan 401 kesalahan, yang pada gilirannya menyebabkan "tidak Bisa membuat SSL/TLS saluran aman" pengecualian.
Akar dari pengecualian ini dalam kasus saya adalah bahwa di beberapa titik dalam kode berikut yang disebut:
ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3;
Ini benar-benar buruk. Tidak hanya itu memerintahkan .NET untuk menggunakan protokol yang tidak aman, tapi ini dampak setiap baru WebClient (dan sejenisnya) permintaan yang dibuat sesudahnya dalam appdomain. (Perhatikan bahwa permintaan web masuk tidak terpengaruh pada anda ASP.NET aplikasi, tapi baru WebClient permintaan, seperti untuk berbicara dengan layanan web eksternal, adalah).
Dalam kasus saya, itu tidak benar-benar diperlukan, sehingga aku hanya bisa menghapus pernyataan dan semua saya yang lain permintaan web mulai bekerja dengan baik lagi. Berdasarkan bacaan saya di tempat lain, saya belajar beberapa hal:
Seperti yang anda tahu ada banyak alasan kenapa hal ini bisa terjadi. Pikir saya akan tambahkan menyebabkan saya mengalami ...
Jika anda menetapkan nilai WebRequest.Timeout
ke 0
, ini adalah pengecualian yang dilemparkan. Di bawah ini adalah kode yang saya punya... (Kecuali bukan keras-kode 0
untuk nilai timeout, aku punya parameter yang secara tidak sengaja diset ke 0
).
WebRequest webRequest = WebRequest.Create(@"https://myservice/path");
webRequest.ContentType = "text/html";
webRequest.Method = "POST";
string body = "...";
byte[] bytes = Encoding.ASCII.GetBytes(body);
webRequest.ContentLength = bytes.Length;
var os = webRequest.GetRequestStream();
os.Write(bytes, 0, bytes.Length);
os.Close();
webRequest.Timeout = 0; //setting the timeout to 0 causes the request to fail
WebResponse webResponse = webRequest.GetResponse(); //Exception thrown here ...
Yang satu ini bekerja untuk saya di MVC webclient
public string DownloadSite(string RefinedLink)
{
try
{
Uri address = new Uri(RefinedLink);
ServicePointManager.ServerCertificateValidationCallback = delegate { return true; };
ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3;
System.Net.ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12;
using (WebClient webClient = new WebClient())
{
var stream = webClient.OpenRead(address);
using (StreamReader sr = new StreamReader(stream))
{
var page = sr.ReadToEnd();
return page;
}
}
}
catch (Exception e)
{
log.Error("DownloadSite - error Lin = " + RefinedLink, e);
return null;
}
}
Penyebab lain yang mungkin dari permintaan itu dibatalkan: tidak Bisa membuat SSL/TLS saluran aman
kesalahan adalah ketidakcocokan antara anda dan klien PC's dikonfigurasi cipher_suites nilai-nilai, dan nilai-nilai yang server dikonfigurasi sebagai yang bersedia dan mampu menerima. Dalam hal ini, ketika klien anda mengirimkan daftar cipher_suites nilai-nilai yang mampu menerima di awal SSL handshaking/negosiasi "Klien Hello" pesan, server melihat bahwa tidak ada yang diberikan nilai yang dapat diterima, dan mungkin kembali "Pemberitahuan" respon bukannya melanjutkan ke "Server Hello" langkah SSL handshake.
Untuk menyelidiki kemungkinan ini, anda dapat men-download Pesan Microsoft Analyzer, dan menggunakannya untuk melacak SSL negosiasi yang terjadi ketika anda mencoba dan gagal untuk membangun sebuah koneksi HTTPS ke server (dalam C# aplikasi).
Jika anda mampu membuat sukses koneksi HTTPS dari lingkungan lain (misalnya Windows XP mesin yang anda sebutkan -- atau mungkin dengan memukul HTTPS URL di browser non Microsoft yang doesn't menggunakan OS's cipher suite pengaturan, seperti Chrome atau Firefox), menjalankan Pesan lain Analyzer jejak di lingkungan tersebut untuk menangkap apa yang terjadi ketika negosiasi SSL berhasil.
Mudah-mudahan, anda'akan melihat beberapa perbedaan antara dua Klien Hello pesan yang akan memungkinkan anda untuk menentukan apa tepatnya yang tentang gagal negosiasi SSL ini menyebabkan ia gagal. Maka anda harus mampu membuat perubahan konfigurasi untuk Windows yang akan memungkinkan untuk berhasil. IISCrypto adalah alat yang hebat untuk digunakan untuk ini (bahkan untuk Pc klien, meskipun "IIS" nama).
Berikut dua kunci registri Windows mengatur cipher_suites nilai-nilai bahwa PC anda akan menggunakan:
Berikut ini's penuh langgan bagaimana aku diselidiki dan diselesaikan contoh dari varietas ini yang tidak Bisa membuat SSL/TLS saluran aman
masalah: http://blog.jonschneider.com/2016/08/fix-ssl-handshaking-error-in-windows.html
Dalam kasus saya, akun layanan menjalankan aplikasi tidak memiliki izin untuk mengakses kunci privat. Setelah saya memberikan izin ini, kesalahan yang pergi
Saya telah berjuang dengan masalah ini sepanjang hari.
Ketika saya membuat sebuah proyek baru dengan .NET 4.5 akhirnya aku mendapatkannya untuk bekerja.
Tapi jika saya diturunkan ke 4.0 aku punya masalah yang sama lagi, dan itu irreversable untuk proyek itu (bahkan ketika saya mencoba untuk meng-upgrade ke 4.5 lagi).
Aneh tidak ada pesan kesalahan lain tapi "permintaan itu dibatalkan: tidak Bisa membuat SSL/TLS saluran aman." datang untuk kesalahan ini
Dalam kasus bahwa klien adalah mesin windows, alasan yang mungkin bisa jadi tls atau ssl protokol yang diperlukan oleh layanan tidak diaktifkan.
Hal ini dapat terletak di:
Control Panel -> Jaringan dan Internet -> Internet Options -> Lanjutan
Gulir ke pengaturan yang turun ke "Keamanan" dan memilih di antara
System.Net.WebException: permintaan dibatalkan: tidak Bisa membuat SSL/TLS saluran aman.
Dalam kasus kami, kami menggunakan vendor perangkat lunak sehingga kita tidak't memiliki akses untuk memodifikasi .Kode BERSIH. Rupanya .NET 4 won't menggunakan TLS v 1.2 kecuali ada perubahan.
Perbaikan untuk menambahkan SchUseStrongCrypto kunci registri. Anda bisa copy/paste kode di bawah ini ke file teks dengan .reg ekstensi dan melaksanakannya. Ia menjabat sebagai "patch" untuk masalah ini.
Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\.NETFramework\v4.0.30319]
"SchUseStrongCrypto"=dword:00000001
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework\v4.0.30319]
"SchUseStrongCrypto"=dword:00000001