Permintaan dibatalkan: Tidak dapat membuat saluran aman SSL / TLS

432

Kami tidak dapat terhubung ke server HTTPS menggunakan WebRequestkarena pesan kesalahan ini:

The request was aborted: Could not create SSL/TLS secure channel.

Kami tahu bahwa server tidak memiliki sertifikat HTTPS yang valid dengan jalur yang digunakan, tetapi untuk mem-bypass masalah ini, kami menggunakan kode berikut yang telah kami ambil dari pos StackOverflow lain:

private void Somewhere() {
    ServicePointManager.ServerCertificateValidationCallback += new RemoteCertificateValidationCallback(AlwaysGoodCertificate);
}

private static bool AlwaysGoodCertificate(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors policyErrors) {
   return true;
}

Masalahnya adalah server tidak pernah memvalidasi sertifikat dan gagal dengan kesalahan di atas. Adakah yang tahu apa yang harus saya lakukan?


Saya harus menyebutkan bahwa seorang kolega dan saya melakukan tes beberapa minggu yang lalu dan itu bekerja dengan baik dengan sesuatu yang mirip dengan apa yang saya tulis di atas. Satu-satunya "perbedaan utama" yang kami temukan adalah bahwa saya menggunakan Windows 7 dan dia menggunakan Windows XP. Apakah itu mengubah sesuatu?

Simon Dugré
sumber
3
Periksa ini juga stackoverflow.com/questions/1600743/…
Oskar Kjellin
51
Ini 2018 dan pertanyaan ini telah dilihat 308.056 kali tetapi masih belum ada perbaikan yang tepat untuk ini !! Saya mendapatkan masalah ini secara acak dan tidak ada perbaikan yang disebutkan di sini atau di utas lain yang memecahkan masalah saya.
Nigel Fds
3
@NigelFds Kesalahan The request was aborted: Could not create SSL/TLS secure channelini sangat umum. Pada dasarnya dikatakan, "inisialisasi koneksi SSL / TLS / HTTPS gagal karena salah satu dari banyak alasan yang mungkin". Jadi, jika Anda mendapatkannya secara teratur dalam situasi tertentu, pilihan terbaik Anda adalah mengajukan pertanyaan spesifik memberikan rincian spesifik tentang situasi itu. Dan memeriksa Peraga Peristiwa untuk informasi lebih lanjut. Dan / atau aktifkan debugging sisi klien .NET untuk mendapatkan perincian lebih lanjut (apakah server tidak dapat dipercaya? Apakah ada ketidakcocokan cipher? SSL / TLS versi protokol tidak cocok? Dll).
MarnixKlooster ReinstateMonica
4
@MarnixKlooster Saya sudah memeriksa semua itu, Ini tidak bisa menjadi masalah dengan sertifikat seolah-olah saya coba lagi, itu berfungsi. Dan saya ragu saya bisa mengajukan pertanyaan ini pada SO tanpa seseorang datang dan menandainya sebagai duplikat atau sesuatu.
Nigel Fds
1
Saya berjuang masalah ini mungkin untuk yang ke-4 kalinya. Basis kode yang sama yang saya jalankan berfungsi dengan baik dalam produksi dan juga di lingkungan pengembang dari beberapa rekan pengembang saya. Terakhir kali, saya diperintahkan untuk menambahkan nilai registri Computer \ HKEY_LOCAL_MACHINE \ SOFTWARE \ WOW6432Node \ Microsoft \ .NETFramework \ v4.7.02046 \ SchUseStrongCrypto [DWORD] = 1. Dan itu bekerja untuk sementara waktu. Saya mulai bekerja di proyek yang berbeda untuk sementara waktu dan sekarang saya kembali ke proyek ini dan permintaan gagal lagi, bahkan dengan perbaikan kunci registri ini. Sangat menyebalkan.
Miguel

Jawaban:

598

Saya akhirnya menemukan jawabannya (saya belum mencatat sumber saya tetapi dari pencarian);

Sementara kode berfungsi 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 French; jika Anda mendapatkan masalah ini saat mengonfigurasi PayPal, harap perhatikan bahwa mereka tidak akan mendukung SSL3 mulai Desember, 3 2018. Anda harus menggunakan TLS. Inilah halaman Paypal tentang hal itu.

Simon Dugré
sumber
5
Turun ke SecurityProtocolType.Tls12 sebenarnya memperbaiki masalah ini untuk saya. Lihat jawaban saya di bawah ini.
Bryan Legend
24
SSLv3 berusia 18 tahun dan sekarang rentan terhadap eksploitasi POODLE - karena @LoneCoder merekomendasikan SecurityProtocolType.Tls12 adalah pengganti yang cocok untuk SecurityProtocolType.Ssl3
gary
4
SecurityProtocolType.Tls mungkin sebenarnya menjadi alternatif yang lebih baik sampai eksploit ditemukan untuk itu (tidak semua situs mendukung Tls12 pada saat penulisan)
gary
3
PayPal telah menetapkan tanggal 30 Juni 2017 untuk menonaktifkan SSL3 dan menerapkan TLS1.2. Ini sudah diterapkan di lingkungan kotak pasir mereka paypal-knowledge.com/infocenter/...
Robin French
11
Lihat ini juga. Anda tidak perlu secara eksklusif mengaturnya ke satu jenis, Anda dapat menambahkan juga. System.Net.ServicePointManager.SecurityProtocol |= System.Net.SecurityProtocolType.Tls12;
Nae
153

Solusi untuk ini, dalam .NET 4.5 adalah

ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;

Jika Anda tidak memiliki .NET 4.5 maka gunakan

ServicePointManager.SecurityProtocol = (SecurityProtocolType)3072;
Andrej Z
sumber
10
Terima kasih! Saya perlu menggunakan .net 4.0 dan tidak tahu bagaimana menyelesaikannya. Ini sepertinya bekerja di sini. :)
Fabiano
Tidak bekerja pada Windows Server 2008R2 (dan mungkin juga pada 2012)
Misam
@ billpg, baca ini untuk jawaban yang lebih tepat
Vikrant
Untuk tipe VB (karena jawaban ini muncul di Google), kode yang setara adalahServicePointManager.SecurityProtocol = DirectCast(3072, SecurityProtocolType)
ConfusionTowers
@Andrej Z bekerja pada .net framework 4. Terima kasih.
az fav
107

Pastikan pengaturan ServicePointManager dibuat sebelum HttpWebRequest dibuat, jika tidak maka tidak akan berfungsi.

Bekerja:

        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;
hogarth45
sumber
4
Apa perbedaan antara Pekerjaan dan Gagal yang Anda sebutkan di atas?
Chandy Kunhu
5
Luar biasa. Permintaan saya hanya berfungsi setelah percobaan kedua, yang tidak masuk akal dan kemudian saya melihat posting Anda, memindahkan protokol keamanan sebelum permintaan dan voila, diperbaiki. Terima kasih @ hogarth45
deanwilliammills
2
Persis! ketika saya menempatkan ServicePointManager tepat sebelum permintaan dibuat, itu berhasil untuk saya, Terima kasih, Anda menyelamatkan hari saya.
1
Sempurna ... ini luar biasa
Maryam Bagheri
1
Dalam kasus kami, permintaan gagal untuk pertama kalinya dan berhasil sesudahnya. Itu persis karena alasan yang disebutkan dalam jawaban ini!
Mohammad Dehghan
34

Masalah yang Anda alami adalah bahwa pengguna aspNet tidak memiliki akses ke sertifikat. Anda harus memberikan akses menggunakan winhttpcertcfg.exe

Contoh tentang cara mengatur ini adalah di: http://support.microsoft.com/kb/901183

Di bawah langkah 2 dalam informasi lebih lanjut

EDIT: Di versi IIS yang lebih baru, fitur ini terintegrasi dengan alat pengelola sertifikat - dan dapat diakses dengan mengklik kanan sertifikat dan menggunakan opsi untuk mengelola kunci pribadi. Lebih detail di sini: /server/131046/how-to-grant-iis-7-5-access-to-a-certificate-in-certificate-store/132791#132791

Avitus
sumber
Saya sudah mencoba menjalankan winhttpcertcfg.exe ... perhatikan bahwa saya menggunakan Windows 7. Bisakah itu mengubah sesuatu?
Simon Dugré
Saya tidak yakin apakah itu terkait, tetapi posting ini memberi saya ide untuk menjalankan VS sebagai admin ketika melakukan panggilan ini dari VS dan itu memperbaiki masalah bagi saya.
PFranchise
2
Di Windows 7 dan yang lebih baru, sertifikat harus berada di toko untuk Komputer Lokal daripada Pengguna Saat Ini untuk "Mengelola Kunci Pribadi"
Lukos
1
Yap, ini masalah saya. gunakan mmc.exe, tambahkan snap-in sertifikat (bagi saya saya kemudian memilih 'komputer lokal'). Klik kanan sertifikat, semua tugas, kelola kunci pribadi. Tambahkan 'semua orang' (untuk pengembang lokal ini paling mudah - prod jelas membutuhkan kumpulan aplikasi / situs web IIS eksplisit Anda)
Ian Yates
@LIan Yates, solusi ini hanya bekerja untuk saya (y)
Usman Younas
31

Kesalahannya bersifat umum dan ada banyak alasan mengapa negosiasi SSL / TLS mungkin gagal. Yang paling umum adalah sertifikat server yang tidak valid atau kedaluwarsa, dan Anda menanganinya dengan memberikan kait validasi sertifikat server Anda sendiri, tetapi tidak selalu menjadi satu-satunya alasan. Server mungkin memerlukan otentikasi timbal balik, mungkin dikonfigurasikan dengan serangkaian sandi yang tidak didukung oleh klien Anda, mungkin ada waktu melayang terlalu besar untuk jabat tangan agar berhasil dan banyak alasan lainnya.

Solusi terbaik adalah dengan menggunakan set alat pemecahan masalah SChannel. SChannel adalah penyedia SSPI yang bertanggung jawab untuk SSL dan TLS dan klien Anda akan menggunakannya untuk jabat tangan. Lihatlah Alat dan Pengaturan TLS / SSL .

Juga lihat Cara mengaktifkan pencatatan acara Schannel .

Remus Rusanu
sumber
Di mana jalur untuk Schannel event loggingdi Windows 7-8-10 ?
PreguntonCojoneroCabrón
memecahkan masalah TLS / SSL secara programatik dalam C #?
Kiquenet
27

Saya mengalami masalah ini untuk mencoba https://ct.mob0.com/Styles/Fun.png , yang merupakan gambar yang didistribusikan oleh CloudFlare di CDN-nya yang mendukung hal-hal gila seperti SPDY dan sertifikat SSL pengalihan aneh.

Alih-alih menentukan Ssl3 seperti dalam jawaban Simons saya bisa memperbaikinya dengan turun ke Tls12 seperti ini:

ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;
new WebClient().DownloadData("https://ct.mob0.com/Styles/Fun.png");
Bryan Legend
sumber
Terima kasih Lone ... ini gila bagaimana tampaknya ada banyak kemungkinan masalah tergantung situasi ... Dan, seperti yang saya lihat, tidak ada dokumentasi nyata mengenai hal itu. Baiklah, terima kasih untuk menunjukkan kepada seseorang yang mungkin akan mengalami masalah yang sama.
Simon Dugré
Ini berhasil untuk saya. Saya menghadapi Kesalahan saat saya beralih dari LAN kantor ke jaringan rumah saya. Kode yang sama, laptop yang sama!
Amal
Apakah Anda selalu mendapatkan kesalahan (dalam semua permintaan) atau kadang - kadang ?
PreguntonCojoneroCabrón
24

Setelah berjam-jam dengan masalah yang sama, saya menemukan bahwa akun ASP.NET yang dijalankan oleh layanan klien tidak memiliki akses ke sertifikat. Saya memperbaikinya dengan masuk ke Kumpulan Aplikasi IIS tempat aplikasi web berjalan, masuk ke Pengaturan Lanjutan, dan mengubah identitas dari LocalSystemakun NetworkService.

Solusi yang lebih baik adalah membuat sertifikat berfungsi dengan NetworkServiceakun default tetapi ini berfungsi untuk pengujian fungsional cepat.

Nick Gotch
sumber
3
Jawaban ini seharusnya mendapat lebih banyak suara. Setelah seminggu meneliti, ini adalah satu-satunya solusi yang bekerja untuk saya. Terima kasih!!
user224567893
Ini berhasil untuk saya. terima kasih sempurna
Emy Stats
18

Pendekatan dengan pengaturan

ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12

Tampaknya baik-baik saja, karena Tls1.2 adalah versi terbaru dari protokol aman. Tapi saya memutuskan untuk melihat lebih dalam dan menjawab apakah kita benar-benar perlu untuk melakukan hardcode.

Spesifikasi: Windows Server 2012R2 x64.

Dari internet dikatakan bahwa .NetFramework 4.6+ harus menggunakan Tls1.2 secara default. Tetapi ketika saya memperbarui proyek saya menjadi 4,6 tidak ada yang terjadi. Saya telah menemukan beberapa info yang mengatakan bahwa saya perlu secara manual melakukan beberapa perubahan untuk mengaktifkan Tls1.2 secara default

https://support.microsoft.com/en-in/help/3140245/update-to-enable-tls-1-1-and-tls-1-2-as-default-secure-protocols-in-wi

Tetapi pembaruan windows yang diusulkan tidak berfungsi untuk versi R2

Tetapi yang membantu saya adalah menambahkan 2 nilai ke dalam registri. Anda dapat menggunakan skrip PS berikutnya sehingga akan ditambahkan secara otomatis

Set-ItemProperty -Path 'HKLM:\SOFTWARE\Wow6432Node\Microsoft\.NetFramework\v4.0.30319' -Name 'SchUseStrongCrypto' -Value '1' -Type DWord
Set-ItemProperty -Path 'HKLM:\SOFTWARE\Microsoft\.NetFramework\v4.0.30319' -Name 'SchUseStrongCrypto' -Value '1' -Type DWord

Itulah yang saya cari. Tapi saya tetap tidak bisa menjawab pertanyaan mengapa NetFramework 4.6+ tidak mengatur ini ... Nilai protokol secara otomatis?

cukup bagus
sumber
17

Sesuatu yang tidak dimiliki jawaban aslinya. Saya menambahkan beberapa kode lagi untuk membuatnya menjadi bukti.

ServicePointManager.Expect100Continue = true;
        ServicePointManager.DefaultConnectionLimit = 9999;
        ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12 | SecurityProtocolType.Ssl3;
SpoiltTechie.com
sumber
8
Saya tidak akan merekomendasikan protokol SSL3 yang ditambahkan.
Peter de Bruijn
SSL3 memiliki masalah keamanan parah yang disebut 'Pudel'.
Peter de Bruijn
@PeterdeBruijn Tls and Tls11sudah usang ?
Kiquenet
1
@Kiquenet - ya. Pada Juni 2018 PCI (Industri Kartu Pembayaran) tidak akan mengizinkan protokol yang lebih rendah dari TLS1.2. (Ini awalnya dijadwalkan untuk 06/2017 tetapi ditunda selama satu tahun)
GlennG
Ada lima protokol dalam keluarga SSL / TLS: SSL v2, SSL v3, TLS v1.0, TLS v1.1, dan TLS v1.2 : github.com/ssllabs/research/wiki/…. SSL v2 unsecure, SSL v3 is insecure when used with HTTP (the POODLE attack), TLS v1.0, TLS v1.1 obsoletes Hanya pilihan yang valid akan menjadi ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12?
Kiquenet
14

Kemungkinan lain adalah impor sertifikat yang tidak benar pada kotak. Pastikan untuk memilih kotak centang yang dilingkari. Awalnya saya tidak melakukannya, jadi kode waktu atau melemparkan pengecualian yang sama seperti kunci pribadi tidak dapat ditemukan.

dialog impor sertifikat

Sherlock
sumber
Klien tetap harus menginstal ulang sertifikat untuk menggunakan program klien. Berkali-kali mereka harus menginstal ulang sertifikat sebelum menggunakan program. Saya berharap jawaban ini memperbaiki masalah itu.
Pangamma
11

Pengecualian "Permintaan dibatalkan: Tidak dapat membuat saluran aman SSL / TLS" dapat terjadi jika server mengembalikan respons HTTP 401 yang tidak sah ke permintaan HTTP.

Anda dapat menentukan apakah ini terjadi dengan mengaktifkan penelusuran tingkat System.Net jejak untuk aplikasi klien Anda, seperti yang dijelaskan dalam jawaban ini .

Setelah konfigurasi pendataan di tempat, jalankan aplikasi dan mereproduksi kesalahan, kemudian lihat output logging 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 gagal menetapkan cookie tertentu yang diharapkan oleh server, yang mengarah ke server menanggapi permintaan dengan kesalahan 401, yang pada gilirannya menyebabkan pengecualian "Tidak dapat membuat saluran aman SSL / TLS".

Jon Schneider
sumber
1
Penjadwal tugas saya dieksekusi setiap hari (bukan akhir pekan). Saya mendapatkan kesalahan yang sama, tetapi terkadang ( 2 errors in 2 months). Ketika saya mendapatkan kesalahan, beberapa menit kemudian saya mencoba lagi secara manual dan semuanya baik-baik saja.
Kiquenet
10

Kemungkinan penyebab The request was aborted: Could not create SSL/TLS secure channelkesalahan lainnya adalah ketidaksesuaian antara nilai-nilai cipher_suites yang dikonfigurasi PC klien Anda, dan nilai-nilai yang dikonfigurasikan oleh server sebagai yang bersedia dan dapat diterima . Dalam hal ini, ketika klien Anda mengirim daftar nilai cipher_suites yang dapat diterima dalam pesan "klien Halo" handshaking / negosiasi SSL, server melihat bahwa tidak ada nilai yang diberikan yang dapat diterima, dan dapat mengembalikan "Peringatan" "respons alih-alih melanjutkan ke langkah" Server Hello "dari jabat tangan SSL.

Untuk menyelidiki kemungkinan ini, Anda dapat mengunduh Microsoft Message Analyzer , dan menggunakannya untuk menjalankan jejak negosiasi SSL yang terjadi saat Anda mencoba dan gagal membuat koneksi HTTPS ke server (di aplikasi C # Anda).

Jika Anda dapat membuat koneksi HTTPS yang berhasil dari lingkungan lain (mis. Mesin Windows XP yang Anda sebutkan - atau mungkin dengan menekan URL HTTPS di browser non-Microsoft yang tidak menggunakan pengaturan cipher suite OS, seperti Chrome atau Firefox), jalankan jejak Analyzer Pesan lain di lingkungan itu untuk menangkap apa yang terjadi ketika negosiasi SSL berhasil.

Mudah-mudahan, Anda akan melihat beberapa perbedaan antara dua pesan Halo Klien yang akan memungkinkan Anda menentukan dengan tepat bagaimana dengan negosiasi SSL yang gagal menyebabkannya gagal. Maka Anda harus dapat membuat perubahan konfigurasi ke Windows yang akan membuatnya berhasil. IISCrypto adalah alat yang hebat untuk digunakan untuk ini (bahkan untuk PC klien, meskipun nama "IIS").

Dua kunci registri Windows berikut ini mengatur nilai-nilai cipher_suites yang akan digunakan PC Anda:

  • HKLM \ SOFTWARE \ Policies \ Microsoft \ Cryptography \ Configuration \ SSL \ 00010002
  • HKLM \ SYSTEM \ CurrentControlSet \ Control \ Cryptography \ Configuration \ Local \ SSL \ 00010002

Berikut ini adalah artikel lengkap tentang bagaimana saya menyelidiki dan memecahkan contoh berbagai Could not create SSL/TLS secure channelmasalah ini: http://blog.jonschneider.com/2016/08/fix-ssl-handshaking-error-in-windows.html

Jon Schneider
sumber
1
Dalam kasus saya, jawaban ini sangat membantu. Juga, karena saya mencurigai PC klien saya melewatkan beberapa suite sandi, saya mengambil jalan pintas dan menginstal Pembaruan Windows ini secara langsung untuk mencoba keberuntungan saya ( support.microsoft.com/en-hk/help/3161639 , perlu reboot Windows) sebelum benar-benar memulai Pencarian Analyzer Pesan, dan ternyata saya beruntung dan itu memecahkan masalah saya, menyelamatkan diri saya pencarian.
sken130
1
Perhatikan bahwa ketika Anda menguji tautan HTTPS di browser seperti Firefox, bahkan jika Anda mendapatkan cipher yang berbeda dari yang disediakan oleh Pembaruan Windows yang diberikan, Pembaruan Windows masih layak untuk dicoba, karena memasang cipher baru akan mempengaruhi negosiasi cipher. antara PC klien dan server, sehingga meningkatkan harapan menemukan kecocokan.
sken130
Untuk jawaban langsung untuk masalah saya. Dua hal yang membantu saya menemukan perubahan yang harus dilakukan. 1. Cipher Suites didukung oleh server web: ssllabs.com/ssltest 2. Cipher Suites yang didukung oleh berbagai versi Windows: docs.microsoft.com/en-us/windows/win32/secauthn/…
Paul B.
10

Akar pengecualian ini dalam kasus saya adalah bahwa pada suatu titik dalam kode berikut ini disebut:

ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3;

Ini sangat buruk. Tidak hanya menginstruksikan .NET untuk menggunakan protokol tidak aman, tetapi ini berdampak pada setiap permintaan WebClient baru (dan yang serupa) yang dibuat sesudahnya di dalam appdomain Anda. (Perhatikan bahwa permintaan web yang masuk tidak terpengaruh di aplikasi ASP.NET Anda, tetapi permintaan WebClient baru, seperti berbicara dengan layanan web eksternal, adalah).

Dalam kasus saya, itu sebenarnya tidak diperlukan, jadi saya bisa menghapus pernyataan itu dan semua permintaan web saya yang lain mulai berfungsi dengan baik lagi. Berdasarkan bacaan saya di tempat lain, saya belajar beberapa hal:

  • Ini adalah pengaturan global di appdomain Anda, dan jika Anda memiliki aktivitas bersamaan, Anda tidak dapat secara andal mengaturnya ke satu nilai, melakukan tindakan Anda, dan kemudian mengembalikannya. Tindakan lain mungkin terjadi selama jendela kecil itu dan terkena dampak.
  • Pengaturan yang benar adalah membiarkannya default. Ini memungkinkan .NET untuk terus menggunakan apa pun yang merupakan nilai default paling aman seiring berjalannya waktu dan Anda memutakhirkan kerangka kerja. Mengaturnya ke TLS12 (yang paling aman pada penulisan ini) akan berfungsi sekarang tetapi dalam 5 tahun mungkin mulai menyebabkan masalah misterius.
  • Jika Anda benar-benar perlu menetapkan nilai, Anda harus mempertimbangkan untuk melakukannya di aplikasi atau appdomain khusus yang terpisah dan menemukan cara untuk membicarakannya dengan kumpulan utama Anda. Karena ini adalah nilai global tunggal, mencoba mengelolanya dalam kumpulan aplikasi yang sibuk hanya akan menimbulkan masalah. Jawaban ini: https://stackoverflow.com/a/26754917/7656 menyediakan solusi yang memungkinkan melalui proxy khusus. (Catatan saya belum menerapkannya secara pribadi.)
Tyler Forsythe
sumber
2
Berlawanan dengan aturan umum Anda, saya akan menambahkan bahwa ada pengecualian ketika Anda HARUS mengaturnya ke TLS 1.2, daripada membiarkan default berjalan. Jika Anda berada pada kerangka kerja yang lebih lama dari .NET 4.6, dan Anda menonaktifkan protokol tidak aman di server Anda (SSL atau TLS 1.0 / 1.1), maka Anda tidak bisa mengeluarkan permintaan kecuali Anda memaksa program ke TLS 1.2.
Paul
10

Saya punya masalah ini karena web.config saya punya:

<httpRuntime targetFramework="4.5.2" />

dan tidak:

<httpRuntime targetFramework="4.6.1" />
Terje Solem
sumber
Saya memiliki masalah yang sama dan telah menambahkan jawaban yang lebih rinci di bawah ini, yang masuk ke lebih banyak seluk beluk masalah ini.
JLRishe
9

Seperti yang Anda tahu ada banyak alasan ini mungkin terjadi. Kupikir aku akan menambahkan penyebab yang aku temui ...

Jika Anda mengatur nilai WebRequest.Timeoutke 0, ini adalah pengecualian yang dilemparkan. Di bawah ini adalah kode yang saya miliki ... (Kecuali alih-alih hard-kode 0untuk nilai batas waktu, saya memiliki parameter yang secara tidak sengaja diatur 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 ...
TCC
sumber
2
Wow! Terima kasih telah menyebutkan ini. Tidak dapat mempercayai ini sejak awal dan mencoba banyak hal yang berbeda terlebih dahulu. Kemudian, akhirnya, atur batas waktu menjadi 10dtk dan pengecualiannya menghilang! Ini solusi untuk saya. (y)
derFunk
9

The jawaban atas sebagai mungkin akan cukup bagi kebanyakan orang. Namun, dalam beberapa keadaan, Anda bisa terus mendapatkan kesalahan "Tidak dapat membuat saluran aman SSL / TLS" bahkan setelah memaksa TLS 1.2. Jika demikian, Anda mungkin ingin berkonsultasi artikel bermanfaat iniuntuk langkah pemecahan masalah tambahan. Untuk meringkas: terlepas dari masalah versi TLS / SSL, klien dan server harus menyetujui "suite sandi." Selama fase "jabat tangan" dari koneksi SSL, klien akan mendaftar suite-cipher yang didukung untuk server untuk memeriksa daftar sendiri. Tetapi pada beberapa mesin Windows, cipher-suites umum tertentu mungkin telah dinonaktifkan (tampaknya karena upaya yang bermaksud baik untuk membatasi permukaan serangan), mengurangi kemungkinan klien & server menyetujui paket cipher. Jika mereka tidak setuju, maka Anda mungkin melihat "kode peringatan fatal 40" di penampil acara dan "Tidak dapat membuat saluran aman SSL / TLS" di program .NET Anda.

Artikel tersebut menjelaskan cara membuat daftar semua cipher suites yang berpotensi didukung mesin dan mengaktifkan suites suites tambahan melalui Windows Registry. Untuk membantu memeriksa suite sandi mana yang diaktifkan pada klien, coba kunjungi halaman diagnostik ini di MSIE. (Menggunakan pelacakan System.Net dapat memberikan hasil yang lebih pasti.) Untuk memeriksa cipher suites mana yang didukung oleh server, coba alat online ini (dengan asumsi server dapat diakses melalui internet). Seharusnya tanpa mengatakan bahwa suntingan Registry harus dilakukan dengan hati-hati , terutama di mana jaringan terlibat. (Apakah mesin Anda VM yang di-host dari jarak jauh? Jika Anda memutuskan jaringan, apakah VM akan dapat diakses sama sekali?)

Dalam kasus perusahaan saya, kami mengaktifkan beberapa suite "ECDHE_ECDSA" tambahan melalui penyuntingan Registri, untuk memperbaiki masalah langsung dan menjaga dari masalah di masa depan. Tetapi jika Anda tidak dapat (atau tidak mau) mengedit Registry, maka banyak solusi (tidak harus cantik) muncul di pikiran. Misalnya: program .NET Anda dapat mendelegasikan lalu lintas SSL ke program Python yang terpisah (yang mungkin dapat berfungsi dengan baik, karena alasan yang sama bahwa permintaan Chrome mungkin berhasil ketika permintaan MSIE gagal pada mesin yang terpengaruh).

APW
sumber
9

Salah satu penyebab terbesar masalah ini adalah versi .NET Framework yang aktif. Versi runtime .NET framework memengaruhi protokol keamanan mana yang diaktifkan secara default.

Tampaknya tidak ada dokumentasi resmi tentang cara kerjanya secara khusus di versi yang berbeda, tetapi tampaknya default ditentukan lebih atau kurang sebagai berikut:

  • .NET Framework 4.5 dan sebelumnya - SSL 3.0, TLS 1.0
  • .NET Framework 4.6.x - TLS 1.0, 1.1, 1.2, 1.3
  • .NET Framework 4.7+ - Default Sistem (OS)

(Untuk versi yang lebih lama, jarak tempuh Anda mungkin agak beragam berdasarkan pada mana .NET runtimes diinstal pada sistem. Misalnya, mungkin ada situasi di mana Anda menggunakan kerangka kerja yang sangat lama dan TLS 1.0 tidak didukung, atau menggunakan 4.6. x dan TLS 1.3 tidak didukung)

Dokumentasi Microsoft sangat menyarankan untuk menggunakan 4.7+ dan standar sistem:

Kami menyarankan Anda:

  • Targetkan .NET Framework 4.7 atau versi yang lebih baru pada aplikasi Anda. Target .NET Framework 4.7.1 atau versi yang lebih baru pada aplikasi WCF Anda.
  • Jangan menentukan versi TLS. Konfigurasikan kode Anda untuk membiarkan OS memutuskan versi TLS.
  • Lakukan audit kode menyeluruh untuk memverifikasi Anda tidak menentukan versi TLS atau SSL.

Untuk situs ASP.NET , periksa versi .NET framework di <httpRuntime>elemen Anda , karena ini menentukan runtime mana yang sebenarnya digunakan oleh situs Anda:

<httpRuntime targetFramework="4.5" />

Lebih baik:

<httpRuntime targetFramework="4.7" />
JLRishe
sumber
8

Yang ini bekerja untuk saya di webclient MVC

    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;
        }
    }
Arun Prasad ES
sumber
2
Akankah menimpa ServerCertificateValidationCallback memperkenalkan lubang keamanan baru?
7

Jika klien adalah mesin windows, kemungkinan alasannya adalah protokol tls atau ssl yang diperlukan oleh layanan tidak diaktifkan.

Ini dapat diatur dalam:

Panel Kontrol -> Jaringan dan Internet -> Opsi Internet -> Lanjutan

Gulir pengaturan ke bawah ke "Keamanan" dan pilih di antara

  • Gunakan SSL 2.0
  • Gunakan SSL 3.0
  • Gunakan TLS 1.0
  • Gunakan TLS 1.1
  • Gunakan TLS 1.2

masukkan deskripsi gambar di sini

bu
sumber
ada masalah dalam mencentang semuanya?
Nigel Fds
tidak ada masalah, sejauh yang saya tahu ... kecuali bahwa ssl tidak lagi direkomendasikan ... mereka tidak dianggap cukup aman.
cnom
bagaimana melakukannya secara terprogram di PowerShell?
Kiquenet
Ini adalah sesuatu yang mempengaruhi versi Windows yang lebih lama, Lakukan riset, cari tahu opsi keamanan apa yang saat ini digunakan. Sampai hari ini lihat tautan ini: tecadmin.net/enable-tls-on-windows-server-and-iis
Tod
7

Dalam kasus saya, akun layanan yang menjalankan aplikasi tidak memiliki izin untuk mengakses kunci pribadi. Setelah saya memberikan izin ini, kesalahan hilang

  1. mmc
  2. sertifikat
  3. Perluas ke pribadi
  4. pilih sertifikat
  5. klik kanan
  6. Semua tugas
  7. Kelola kunci pribadi
  8. Menambahkan
Dinesh Rajan
sumber
7

Jika Anda menjalankan kode dari Visual Studio, coba jalankan Visual Studio sebagai administrator. Memperbaiki masalah untuk saya.

bplus
sumber
Sayangnya bukan untukku!
benedict_w
Ini adalah satu-satunya yang membantu dalam kasus saya! Terima kasih!!!
alexander ostrikov
6

Saya telah berjuang dengan masalah ini sepanjang hari.

Ketika saya membuat proyek baru dengan .NET 4.5 akhirnya saya berhasil.

Tetapi jika saya turun ke 4.0 saya mendapatkan masalah yang sama lagi, dan itu tidak dapat dipulihkan untuk proyek itu (bahkan ketika saya mencoba untuk meningkatkan ke 4,5 lagi).

Aneh tidak ada pesan kesalahan lain tetapi "Permintaan dibatalkan: Tidak dapat membuat saluran aman SSL / TLS." muncul untuk kesalahan ini

hantu
sumber
5
Alasan ini berhasil mungkin karena versi .NET yang berbeda mendukung versi protokol SSL / TLS yang berbeda. Info lebih lanjut: blogs.perficient.com/microsoft/2016/04/tsl-1-2-and-net-support
Jon Schneider
4

System.Net.WebException: Permintaan dibatalkan: Tidak dapat membuat saluran aman SSL / TLS.

Dalam kasus kami, kami menggunakan vendor perangkat lunak sehingga kami tidak memiliki akses untuk mengubah kode .NET. Rupanya .NET 4 tidak akan menggunakan TLS v 1.2 kecuali jika ada perubahan.

Perbaikan untuk kami adalah menambahkan kunci SchUseStrongCrypto ke registri. Anda dapat menyalin / menempelkan kode di bawah ini ke file teks dengan ekstensi .reg dan jalankan. Ini berfungsi sebagai "tambalan" kami terhadap masalah.

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
capdragon
sumber
3
Sini PS untuk edit cepat: New-ItemProperty -Path "HKLM:\SOFTWARE\Microsoft\.NETFramework\v4.0.30319" -Name "SchUseStrongCrypto" -Value "1" -Type DWord
Tilo
2
Sini PS untuk edit2 cepat: New-ItemProperty -Path "HKLM:\SOFTWARE\Wow6432Node\Microsoft\.NETFramework\v4.0.30319" -Name "SchUseStrongCrypto" -Value "1" -Type DWord
Tilo
4

Coba ini:

ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;
Muhammad Awais
sumber
Saya menambahkan baris ini. Kadang-kadang gagal dan saya mendapatkan kesalahan yang samaSystem.Net.WebException: The request was aborted: Could not create SSL/TLS secure channel.
Joseph Katzman
4

Ini diperbaiki untuk saya, tambahkan Layanan Jaringan ke izin. Klik kanan pada sertifikat> Semua Tugas> Kelola Kunci Pribadi ...> Tambah ...> Tambahkan "Layanan Jaringan".

jayasurya_j
sumber
3

Masalahnya bagi saya adalah bahwa saya mencoba untuk menggunakan IIS sebagai layanan web, saya menginstal sertifikat di server, tetapi pengguna yang menjalankan IIS tidak memiliki izin yang benar pada sertifikat.

Bagaimana cara memberi ASP.NET akses ke kunci pribadi dalam sertifikat di toko sertifikat?

Danny Cullen
sumber
Ya, sudah. Untuk memperbaikinya, saya melakukan apa yang dikatakan oleh jawaban Nick Gotch: mengubah identitas kumpulan aplikasi ke LocalSystem. Ini menyelesaikannya untuk saya.
Yehuda Gabriel Himango
1
Terima kasih untuk ini
Denis Pitcher
3

Saya mengalami masalah yang sama dan menemukan jawaban ini berfungsi dengan baik untuk saya. Kuncinya adalah 3072. Tautan ini memberikan detail tentang perbaikan '3072'.

ServicePointManager.SecurityProtocol = (SecurityProtocolType)3072;

XmlReader r = XmlReader.Create(url);
SyndicationFeed albums = SyndicationFeed.Load(r);

Dalam kasus saya, dua umpan diperlukan perbaikan:

https://www.fbi.gov/feeds/fbi-in-the-news/atom.xml
https://www.wired.com/feed/category/gear/latest/rss
joeydood
sumber
3

Pertanyaan ini dapat memiliki banyak jawaban karena ini tentang pesan kesalahan umum. Kami mengalami masalah ini pada beberapa server kami, tetapi tidak pada mesin pengembangan kami. Setelah mencabut sebagian besar rambut kami, kami menemukan itu adalah bug Microsoft.

https://support.microsoft.com/en-us/help/4458166/applications-that-rely-on-tls-1-2-strong-encryption-experience-connect

Pada dasarnya, MS mengasumsikan Anda menginginkan enkripsi yang lebih lemah, tetapi OS ditambal untuk hanya mengizinkan TLS 1.2, jadi Anda menerima ketakutan "Permintaan dibatalkan: Tidak dapat membuat saluran aman SSL / TLS."

Ada tiga perbaikan.

1) Patch OS dengan pembaruan yang tepat: http://www.catalog.update.microsoft.com/Search.aspx?q=kb4458166

2) Tambahkan pengaturan ke file app.config / web.config Anda.

3) Tambahkan pengaturan registri yang sudah disebutkan dalam jawaban lain.

Semua ini disebutkan dalam artikel basis pengetahuan yang saya posting.

Michael Silver
sumber
Juga, pastikan Anda hanya mengatur ServicePointManager.SecurityProtocol sekali di aplikasi Anda. Kami menemukan panggilan kedua di aplikasi kami (yang agak rumit dengan majelis opsional dimuat saat runtime) yang mengaturnya ke SSL3, yang kemudian melemparkan pesan kesalahan yang sama.
Michael Silver
3

Kemungkinan lain adalah bahwa kode yang dieksekusi tidak memiliki premis yang diperlukan.

Dalam kasus saya, saya mendapatkan kesalahan ini saat menggunakan debugger Visual Studio untuk menguji panggilan ke layanan web. Visual Studio tidak berjalan sebagai Administrator, yang menyebabkan pengecualian ini.

Hei jude
sumber
2

Ini terjadi pada saya di satu situs saja, dan ternyata hanya tersedia cipher RC4. Dalam upaya sebelumnya untuk mengeraskan server, saya telah menonaktifkan cipher RC4, setelah saya mengaktifkan kembali masalah ini terpecahkan.

Mark Reid
sumber
1
Jangan menggunakan tautan pada tanggapan, karena mereka mungkin tidak bekerja di masa depan, tunjukkan aspek yang paling relevan di dalamnya dalam jawaban Anda
Rodrigo López