Apa protokol keamanan default untuk berkomunikasi dengan server yang mendukung hingga TLS 1.2
? Akan .NET
secara default, pilih protokol keamanan tertinggi yang didukung di sisi server atau apakah saya harus menambahkan baris kode ini secara eksplisit:
System.Net.ServicePointManager.SecurityProtocol =
SecurityProtocolType.Tls | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12;
Apakah ada cara untuk mengubah default ini, selain perubahan kode?
Terakhir, apakah .NET 4.0
hanya mendukung hingga TLS 1.0
? yaitu saya harus meningkatkan proyek klien ke 4,5 untuk mendukung TLS 1.2
.
Motivasi saya adalah untuk menghapus dukungan untuk SSLv3
di sisi klien bahkan jika server mendukungnya (saya sudah memiliki skrip PowerShell untuk menonaktifkan ini di registri mesin) dan untuk mendukung protokol TLS tertinggi yang didukung server.
Pembaruan:
Melihat ServicePointManager
kelas di .NET 4.0
saya tidak melihat nilai yang disebutkan TLS 1.0
dan 1.1
. Dalam keduanya .NET 4.0/4.5
, standarnya adalah SecurityProtocolType.Tls|SecurityProtocolType.Ssl3
. Semoga standar ini tidak akan rusak dengan menonaktifkan SSLv3
di registri.
Namun, saya telah memutuskan saya harus memutakhirkan semua aplikasi .NET 4.5
dan untuk menambahkan secara eksplisit SecurityProtocolType.Tls | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12;
pula ke semua kode bootstrap semua aplikasi.
Ini akan membuat permintaan keluar ke berbagai apis dan layanan untuk tidak menurunkan ke SSLv3
dan harus memilih tingkat tertinggi TLS
.
Apakah pendekatan ini terdengar masuk akal atau berlebihan? Saya memiliki banyak aplikasi untuk diperbarui, dan saya ingin membuktikannya di masa depan karena saya mendengar bahkan TLS 1.0
mungkin akan ditinggalkan dalam waktu dekat oleh beberapa penyedia.
Sebagai klien yang membuat permintaan keluar ke API, apakah menonaktifkan SSL3 di registri bahkan memiliki efek dalam .NET framework? Saya melihat secara default, TLS 1.1 dan 1.2 tidak diaktifkan, apakah kita harus mengaktifkannya melalui registri? RE http://support.microsoft.com/kb/245030 .
Setelah sedikit penyelidikan, saya yakin pengaturan registri tidak akan berpengaruh karena mereka berlaku untuk IIS (server subkey) dan browser (subkey klien).
Maaf posting ini berubah menjadi beberapa pertanyaan, diikuti dengan jawaban "mungkin".
Jawaban:
Beberapa dari mereka yang meninggalkan komentar telah mencatat bahwa pengaturan
System.Net.ServicePointManager.SecurityProtocol
ke nilai-nilai spesifik berarti bahwa aplikasi Anda tidak akan dapat mengambil keuntungan dari versi TLS masa depan yang mungkin menjadi nilai default dalam pembaruan di masa depan untuk .NET. Alih-alih menentukan daftar protokol tetap, Anda dapat mengaktifkan atau menonaktifkan protokol yang Anda ketahui dan pedulikan, membiarkan yang lain tetap ada.Untuk mengaktifkan TLS 1.1 dan 1.2 tanpa memengaruhi protokol lain:
Perhatikan penggunaan
|=
untuk menyalakan bendera ini tanpa mematikan yang lain.Untuk mematikan SSL3 tanpa memengaruhi protokol lain:
sumber
[Net.ServicePointManager]::SecurityProtocol = ([Net.ServicePointManager]::SecurityProtocol -bor [Net.SecurityProtocolType]::Tls11 -bor [Net.SecurityProtocolType]::Tls12)
Invoke-RestMethod bergantung pada pustaka .NET framework yang mendasari yang sama.Net.ServicePointManager.SecurityProtocol = Net.ServicePointManager.SecurityProtocol OR Net.SecurityProtocolType.Tls12 OR Net.SecurityProtocolType.Tls12
Default
System.Net.ServicePointManager.SecurityProtocol
di kedua .NET4.0/4.5
adalahSecurityProtocolType.Tls|SecurityProtocolType.Ssl3
..NET 4.0
mendukung hinggaTLS 1.0
saat.NET 4.5
mendukung hinggaTLS 1.2
Namun, penargetan aplikasi
.NET 4.0
masih dapat mendukung hinggaTLS 1.2
jika.NET 4.5
diinstal di lingkungan yang sama..NET 4.5
menginstal di atas.NET 4.0
, menggantikanSystem.dll
.Saya telah memverifikasi ini dengan mengamati protokol keamanan yang benar yang diatur dalam lalu lintas dengan
fiddler4
dan dengan secara manual menetapkan nilai yang disebutkan dalam.NET 4.0
proyek:Referensi:
Jika Anda mencoba meretas lingkungan yang HANYA
.NET 4.0
diinstal, Anda akan mendapatkan pengecualian:Namun, saya tidak akan merekomendasikan "peretasan" ini karena tambalan di masa depan, dll. Dapat memecahkannya. *
Karena itu, saya telah memutuskan rute terbaik untuk menghapus dukungan
SSLv3
adalah:.NET 4.5
Tambahkan berikut ini untuk meningkatkan kode untuk menimpa default dan bukti masa depan itu:
System.Net.ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12;
* Seseorang mengoreksi saya jika peretasan ini salah, tetapi tes awal saya melihatnya berhasil
sumber
ServicePointManager.cs
lihat referenceource.microsoft.com/#System/net/System/Net/….NET 4.5
default ke Tls12 - tetapi seperti yang Anda taruh di sini, tidak. Ini memberi Anda opsi untuk menggunakannya untukSecurityProtocol
SecurityProtocolType.Tls | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12
sesuai support.microsoft.com/en-us/help/3069494/...Anda dapat mengganti perilaku default di registri berikut:
dan
Untuk detailnya, silakan lihat implementasi
ServicePointManager
.sumber
reg add HKLM\SOFTWARE\Microsoft\.NETFramework\v4.0.30319 /v SchUseStrongCrypto /t REG_DWORD /d 1 /reg:64
(dan / atau/reg:32
)Buat file teks dengan
.reg
ekstensi dan konten berikut:Atau unduh dari sumber berikut:
https://tls1test.salesforce.com/s/NET40-Enable-TLS-1_2.reg
Klik dua kali untuk menginstal ...
sumber
Saya telah menemukan bahwa ketika saya menentukan hanya TLS 1.2 yang masih akan dinegosiasikan ke 1.1.
System.Net.ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;
Saya telah menentukan ini dalam metode startup Global.asax untuk aplikasi web .net 4.5 saya.
sumber
Kode berikut akan:
Konstanta:
Protokol lain tidak akan terpengaruh. Ini membuat ini kompatibel dengan protokol masa depan (Tls1.3, dll).
Kode
Keluaran
sumber
Saya mendapat masalah ketika pelanggan saya memutakhirkan TLS dari 1.0 menjadi 1.2. Aplikasi saya menggunakan .net framework 3.5 dan berjalan di server. Jadi saya memperbaikinya dengan cara ini:
Sebelum menelepon HttpWebRequest.GetResponse () tambahkan perintah ini:
Extensions 2 DLL dengan menambahkan 2 kelas baru: System.Net dan System.Security.Authentication
Unduh batch:
Untuk kumpulan unduhan dan detail lainnya, Anda dapat melihat di sini:
https://support.microsoft.com/en-us/help/3154518/support-for-tls-system-default-versions-included-in-the-.net-framework-3.5.1-on-windows-7 -sp1-and-server-2008-r2-sp1
sumber
Mekanisme perubahan registri bekerja untuk saya setelah perjuangan. Sebenarnya aplikasi saya berjalan sebagai 32bit. Jadi saya harus mengubah nilainya.
Tipe nilai harus DWORD dan nilai di atas 0. Lebih baik gunakan 1.
sumber
Saya berjalan di bawah .NET 4.5.2, dan saya tidak senang dengan jawaban ini. Saat saya berbicara dengan sistem yang mendukung TLS 1.2, dan melihat SSL3, TLS 1.0, dan TLS 1.1 semuanya rusak dan tidak aman untuk digunakan, saya tidak ingin mengaktifkan protokol ini. Di bawah .NET 4.5.2, protokol SSL3 dan TLS 1.0 keduanya diaktifkan secara default, yang dapat saya lihat dalam kode dengan memeriksa
ServicePointManager.SecurityProtocol
. Di bawah .NET 4.7, ada yang baruSystemDefault
mode protokol yang secara eksplisit menyerahkan pemilihan protokol ke OS, di mana saya percaya mengandalkan registri atau pengaturan konfigurasi sistem lainnya akan sesuai. Namun itu tampaknya tidak didukung di bawah .NET 4.5.2. Untuk kepentingan penulisan kode yang kompatibel ke depan, itu akan tetap membuat keputusan yang tepat bahkan ketika TLS 1.2 pasti rusak di masa depan, atau ketika saya memutakhirkan ke .NET 4.7+ dan menyerahkan lebih banyak tanggung jawab untuk memilih protokol yang sesuai untuk OS , Saya mengadopsi kode berikut:Kode ini akan mendeteksi ketika protokol tidak aman yang dikenal diaktifkan, dan dalam hal ini, kami akan menghapus protokol tidak aman ini. Jika tidak ada protokol eksplisit lainnya yang tersisa, kami kemudian akan memaksa mengaktifkan TLS 1.2, sebagai satu-satunya protokol aman yang dikenal yang didukung oleh .NET pada saat ini. Kode ini kompatibel ke depan, karena akan mempertimbangkan jenis protokol baru yang tidak diketahuinya tentang penambahan di masa depan, dan kode ini juga akan cocok dengan yang baru
SystemDefault
menyatakan dalam. NET 4.7, yang berarti saya tidak perlu mengunjungi kembali kode ini di masa depan. Saya sangat merekomendasikan mengadopsi pendekatan seperti ini, daripada mengkode status protokol keamanan tertentu tanpa syarat, jika tidak Anda harus mengkompilasi ulang dan mengganti klien Anda dengan versi baru untuk meningkatkan ke protokol keamanan baru ketika TLS 1.2 pasti rusak, atau lebih mungkin Anda harus membiarkan protokol tidak aman yang ada dihidupkan selama bertahun-tahun di server Anda, membuat organisasi Anda menjadi target serangan.sumber
SecurityProtocolType.SystemDefault
flag dievaluasi0
, jadi memeriksaif (securityProtocols == 0)
dengan inklusif bitwise atau flag untuk TLS 1.2 akan selalu menyertakan TLS 1.2, bahkan setelah "break", kan? Penembakan tidak tajam di sini. Saya benar-benar berusaha menemukan jalan terbaik ke depan.if (!Enum.IsDefined(typeof(SecurityProtocolType), 0) && securityProtocols == 0) { securityProtocols |= SecurityProtocolType.Tls12; }
.securityProtocols |= SecurityProtocolType.Tls12;
(tanpa blok jika) tidak memelihara SystemDefault, securityProtocols hanya memiliki TLS2 sesudahnya. Jadi maksud Anda ketika nilai SystemDefault, tidak ada nilai yang harus diperbarui? Mengenai forward kompatibel, apakah Anda mengasumsikan OS akan mengurus memungkinkan protokol yang lebih baru seperti TLS 1.3?securityProtocols |= SecurityProtocolType.Tls12;' will add TLS 1.2, but because the
Enum SecurityProtocolType` baris memiliki[Flags]
atribut, dan nilai enumerasi SystemDefault adalah0
, nilai SystemDefault akan dilucuti, bahkan jika sebelumnya ditetapkan. Hasil akhirnya adalah bahwa Anda dapat mengaturSevicePointManager.SecurityProtocol
ke 0, atau ke kombinasi nilai enumerasi lainnya. Jika Anda mengaturnya ke SystemDefault, Anda pada dasarnya memilih untuk tidak menentukan protokol sendiri dan membiarkan OS memutuskan.Microsoft baru-baru ini menerbitkan praktik terbaik tentang ini. https://docs.microsoft.com/en-us/dotnet/framework/network-programming/tls
Ringkasan
Target .Net Framework 4.7, hapus semua pengaturan kode SecurityProtocol, sehingga OS akan memastikan Anda menggunakan solusi yang paling aman.
NB: Anda juga perlu memastikan bahwa versi TLS terbaru didukung & diaktifkan di OS Anda.
Untuk informasi lebih lanjut dan kerangka kerja yang lebih lama, silakan merujuk ke tautan MS.
sumber
if (System.Environment.OSVersion.Version < new Version(6, 2) /* Windows 8 */) ServicePointManager.SecurityProtocol |= SecurityProtocolType.Tls | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12; else ServicePointManager.SecurityProtocol = SecurityProtocolType.SystemDefault;
Untuk kelengkapan, berikut ini adalah skrip Powershell yang menetapkan kunci registri yang disebutkan di atas:
sumber
Alternatif untuk hard-coding
ServicePointManager.SecurityProtocol
atau kunci SchUseStrongCrypto eksplisit seperti yang disebutkan di atas:Anda dapat memberitahu .NET untuk menggunakan pengaturan SCHANNEL default dengan kunci SystemDefaultTlsVersions,
mis .:
sumber
Solusi TERBAIK untuk masalah ini tampaknya adalah memutakhirkan ke .NET 4.6 atau lebih baru, yang secara otomatis akan memilih protokol yang kuat serta cipher yang kuat.
Jika Anda tidak dapat memutakhirkan ke .NET 4.6, saran pengaturan
System.Net.ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12;
Dan menggunakan pengaturan registri:
HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft.NETFramework \ v4.0.30319 - SchUseStrongCrypto = DWORD dari 1 HKEY_LOCAL_MACHINE \ SOFTWARE \ Wow6432Node \ Microsoft.NETFramework \ v4.0.30.30319 - SchUseStrongCrypto = DWORD of 1
Hasil dalam menggunakan sesuatu selain TLS 1.0 dan cipher yang kuat.
Dalam pengujian saya, hanya pengaturan di Wow6432Node yang membuat perbedaan, meskipun aplikasi pengujian saya dibuat untuk CPU apa pun.
sumber
Menurut praktik terbaik Transport Layer Security (TLS) dengan .NET Framework : Untuk memastikan aplikasi .NET Framework tetap aman, versi TLS tidak boleh di-hardcode. Alih-alih mengatur kunci registri:
SystemDefaultTlsVersions
danSchUseStrongCrypto
:sumber
Jika Anda dapat menggunakan .NET 4.7.1 atau yang lebih baru, itu akan menggunakan TLS 1.2 sebagai protokol minimum berdasarkan kemampuan sistem operasi. Per rekomendasi Microsoft:
sumber
Untuk Kunci: HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft.NETFramework \ v4.0.30319 Nilai: SchUseStrongCrypto
Anda harus mengatur nilai ke 1.
sumber