Default SecurityProtocol di .NET 4.5

253

Apa protokol keamanan default untuk berkomunikasi dengan server yang mendukung hingga TLS 1.2? Akan .NETsecara 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.0hanya 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 SSLv3di 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 ServicePointManagerkelas di .NET 4.0saya tidak melihat nilai yang disebutkan TLS 1.0dan 1.1. Dalam keduanya .NET 4.0/4.5, standarnya adalah SecurityProtocolType.Tls|SecurityProtocolType.Ssl3. Semoga standar ini tidak akan rusak dengan menonaktifkan SSLv3di registri.

Namun, saya telah memutuskan saya harus memutakhirkan semua aplikasi .NET 4.5dan 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 SSLv3dan 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.0mungkin 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".

Luke Hutton
sumber
FYI: Praktik terbaik terbaru seputar TLS: docs.microsoft.com/en-us/dotnet/framework/network-programming/…
JohnLBevan
Bagi mereka yang ingin melihat jawaban terbaik untuk ini, urutkan berdasarkan suara!
navule
1
SO T&J terkait: stackoverflow.com/questions/41618766/... Pembaca harus memperhatikan bahwa pertanyaan ini semakin menua dan rekomendasi yang lebih baru sudah ada pada tahun 2020.
Tidak Ada Pengembalian Uang Tidak Ada Pengembalian

Jawaban:

280

Beberapa dari mereka yang meninggalkan komentar telah mencatat bahwa pengaturan System.Net.ServicePointManager.SecurityProtocolke 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:

System.Net.ServicePointManager.SecurityProtocol |= 
    SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12;

Perhatikan penggunaan |=untuk menyalakan bendera ini tanpa mematikan yang lain.

Untuk mematikan SSL3 tanpa memengaruhi protokol lain:

System.Net.ServicePointManager.SecurityProtocol &= ~SecurityProtocolType.Ssl3;
Scott
sumber
6
Ini benar-benar jawaban yang benar. Jawaban yang diterima akan memastikan bahwa aplikasi Anda akan selalu mematikan versi TLS baru kecuali Anda kembali dan memperbarui kode Anda.
Connor
5
@ Gertsen Tidak, ini bitwise atau, jadi itu hanya bit yang sesuai jika mati. Jika bit-bit itu sudah aktif, tidak ada perubahan yang terjadi.
Scott
3
Dan PowerShell setara dengan ini adalah [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.
Martin Hollingsworth
15
Karena tidak ada yang berbicara tentang di mana harus meletakkan kode ini, saya berhasil memasukkannya ke Application_Start Global.asax.cs untuk aplikasi ASP.NET MVC saya. Saya sedang mencari cara untuk mendapatkan permintaan SMTP saya untuk dikirim melalui TLS1.2 dan TIDAK lebih dari TLS1.0. Saya juga menambahkan & = ~ SecurityProtocolType.Tls untuk mematikan TLS 1.0
Greg Veres
2
Dalam VB, yang setara adalahNet.ServicePointManager.SecurityProtocol = Net.ServicePointManager.SecurityProtocol OR Net.SecurityProtocolType.Tls12 OR Net.SecurityProtocolType.Tls12
Codespaced
188

Default System.Net.ServicePointManager.SecurityProtocoldi kedua .NET 4.0/4.5adalah SecurityProtocolType.Tls|SecurityProtocolType.Ssl3.

.NET 4.0mendukung hingga TLS 1.0saat .NET 4.5mendukung hinggaTLS 1.2

Namun, penargetan aplikasi .NET 4.0masih dapat mendukung hingga TLS 1.2jika .NET 4.5diinstal di lingkungan yang sama. .NET 4.5menginstal di atas .NET 4.0, menggantikan System.dll.

Saya telah memverifikasi ini dengan mengamati protokol keamanan yang benar yang diatur dalam lalu lintas dengan fiddler4dan dengan secara manual menetapkan nilai yang disebutkan dalam .NET 4.0proyek:

ServicePointManager.SecurityProtocol = (SecurityProtocolType)192 |
(SecurityProtocolType)768 | (SecurityProtocolType)3072;

Referensi:

namespace System.Net
{
    [System.Flags]
    public enum SecurityProtocolType
    {
       Ssl3 = 48,
       Tls = 192,
       Tls11 = 768,
       Tls12 = 3072,
    }
}

Jika Anda mencoba meretas lingkungan yang HANYA .NET 4.0diinstal, Anda akan mendapatkan pengecualian:

Pengecualian Tidak Tertangani: System.NotSupportedException: Protokol keamanan yang diminta tidak didukung. di System.Net.ServicePointManager.set_SecurityProtocol (SecurityProtocolType v alue)

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 SSLv3adalah:

  1. Tingkatkan semua aplikasi ke .NET 4.5
  2. 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

Luke Hutton
sumber
6
Silakan lihat imperialviolet.org/2014/12/08/poodleagain.html "Ini sepertinya saat yang tepat untuk menegaskan kembali bahwa semuanya kurang dari TLS 1.2 dengan paket sandi AEAD rusak secara kriptografi."
Neil
3
@Mathew, dengan melihat kode sumber ServicePointManager.cslihat referenceource.microsoft.com/#System/net/System/Net/…
Luke Hutton
12
Saya terus melihat orang mengklaim .NET 4.5default ke Tls12 - tetapi seperti yang Anda taruh di sini, tidak. Ini memberi Anda opsi untuk menggunakannya untukSecurityProtocol
Don Cheadle
17
Saya tidak akan menghapuskan jawaban ini karena memang memberikan banyak informasi bermanfaat, tetapi menerapkan versi protokol hardcode bukan ide yang baik karena akan membatasi aplikasi dari menggunakan enkripsi terbaik yang tersedia dan dapat mengakibatkan masalah keamanan di jalan. Perubahan registri untuk mengubah perilaku default. Net untuk benar-benar mendukung protokol modern sangat disukai. (Namun, perlu dicatat bahwa perubahan registri juga menonaktifkan SSL v3.)
AJ Henderson
6
Pada FW 4.6 dan 4.7, standarnya sekarang SecurityProtocolType.Tls | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12sesuai support.microsoft.com/en-us/help/3069494/...
Ian Kemp
68

Anda dapat mengganti perilaku default di registri berikut:

Key  : HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework\v4.0.30319 
Value: SchUseStrongCrypto
Type: REG_DWORD
Data : 1

dan

Key  : HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\.NETFramework\v4.0.30319
Value: SchUseStrongCrypto
Type: REG_DWORD
Data : 1

Untuk detailnya, silakan lihat implementasiServicePointManager .

Jiri Mares
sumber
Terima kasih, saya tidak tahu tentang ini. Saya akan mengujinya. Saya membuat skrip powershel untuk mengaturnya: gist.github.com/lukehutton/ab80d207172a923401b1
Luke Hutton
6
Mengubah registri sepertinya bukan solusi yang baik. Jika aplikasi ingin mendukung TLS1, maka aplikasi tersebut harus mempertimbangkannya. Bukan lingkungan yang berjalan. Kalau tidak, itu bisa membahayakan aplikasi lain atau membuat neraka dari penggelaran dan peningkatan aplikasi Anda.
Mikhail G
13
@MikhailG justru sebaliknya. Perubahan registri adalah metode yang lebih disukai. SChannel menyediakan abstraksi dari negosiasi yang mendasarinya dan Anda ingin aplikasi Anda menggunakan apa pun tingkat keamanan tertinggi yang didukung. Membatasinya secara artifisial dalam perangkat lunak akan menghasilkan masalah di masa mendatang ketika protokol baru dirilis dan perangkat lunak Anda tidak dapat menggunakannya. Akan lebih baik jika ada opsi untuk mengatakan menggunakan hanya lebih baik daripada protokol yang diberikan dalam perangkat lunak, tetapi tidak ada pilihan untuk itu tanpa juga mencegah versi masa depan dari bekerja. Itu menonaktifkan SSL v3 dengan perubahan itu ..
AJ Henderson
13
Baris perintah: reg add HKLM\SOFTWARE\Microsoft\.NETFramework\v4.0.30319 /v SchUseStrongCrypto /t REG_DWORD /d 1 /reg:64(dan / atau /reg:32)
Kevin Smyth
7
@MikhailG: Pengaturan registri tidak mencegah aplikasi mendukung protokol yang lebih lama. Ini hanya mengubah default (yang termasuk tls 1.0 pada sekarang). Selanjutnya, perilaku default di .Net 4.6+ adalah menggunakan crypto yang kuat; dalam hal ini entri registri ini hanya akan berguna sebagai sarana untuk menonaktifkan crypto yang kuat.
Brian
51

Buat file teks dengan .regekstensi dan konten berikut:

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework\v4.0.30319]
"SchUseStrongCrypto"=dword:00000001

[HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\.NETFramework\v4.0.30319]
"SchUseStrongCrypto"=dword:00000001

Atau unduh dari sumber berikut:

https://tls1test.salesforce.com/s/NET40-Enable-TLS-1_2.reg

Klik dua kali untuk menginstal ...

dana
sumber
3
Tautan yang Anda berikan tampaknya memiliki masalah sertifikat SSL.
NathanAldenSr
Bahkan ketika saya menambahkan kunci registri ini, saya masih memiliki masalah itu. Ada ide ?
Samidjo
@ Samidjo - Apa. Versi NET yang Anda gunakan? Jawaban Luke jauh lebih detail daripada milik saya, tetapi sepertinya Anda harus setidaknya menginstal .NET 4.5. Juga, jika Anda baru saja membuat perubahan, Anda mungkin harus mendaur ulang kumpulan aplikasi. Ini adalah semacam tebakan, jadi tanpa lebih detail saya mungkin bisa membantu lebih jauh :)
dana
2
Patch support.microsoft.com/en-us/help/4019114/… yang baru-baru ini diterapkan ke server menyebabkan aplikasi .net 4.5.2 kami gagal pada permintaan https REST. Kunci-kunci ini memecahkan masalah kami.
Kleinux
21

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.

Jim
sumber
2
Apa protokol keamanan yang didukung di server? Saya percaya itu adalah faktor di sini juga dan mungkin 1.1 adalah yang terbaru di server. www.passionatecoder.ca
Ehsan
14
Terpilih karena ini adalah satu-satunya jawaban yang menyatakan DI MANA untuk meletakkan baris kode yang merupakan solusinya.
jgerman
1
Klien (mis. C # WebClient Anda) dan Server (server API yang Anda panggil) akan bernegosiasi untuk menggunakan protokol tertinggi yang didukung keduanya. Jadi jika klien Anda mendukung TLS 1.2, tetapi server hanya TLS 1.1 - Klien akan menggunakan TLS 1.1 (kecuali jika Anda HAPUS TLS 1.1 dari klien Anda - dalam hal ini mereka mungkin tidak menemukan protokol yang didukung bersama, dan Klien akan kesalahan)
Don Cheadle
Harus menambahkan menggunakan System.Net di global.asax.cs
Patrick
16

Kode berikut akan:

  • cetak protokol yang diaktifkan
  • cetak protokol yang tersedia
  • aktifkan TLS1.2 jika platform mendukungnya dan jika tidak diaktifkan untuk memulai
  • nonaktifkan SSL3 jika diaktifkan
  • hasil akhir cetak

Konstanta:

  • 48 adalah SSL3
  • 192 adalah TLS1
  • 768 adalah TLS1.1
  • 3072 adalah TLS1.2

Protokol lain tidak akan terpengaruh. Ini membuat ini kompatibel dengan protokol masa depan (Tls1.3, dll).

Kode

// print initial status
    Console.WriteLine("Runtime: " + System.Diagnostics.FileVersionInfo.GetVersionInfo(typeof(int).Assembly.Location).ProductVersion);
    Console.WriteLine("Enabled protocols:   " + ServicePointManager.SecurityProtocol);
    Console.WriteLine("Available protocols: ");
    Boolean platformSupportsTls12 = false;
    foreach (SecurityProtocolType protocol in Enum.GetValues(typeof(SecurityProtocolType))) {                
        Console.WriteLine(protocol.GetHashCode());
        if (protocol.GetHashCode() == 3072){
            platformSupportsTls12 = true;
        }
    }
    Console.WriteLine("Is Tls12 enabled: " + ServicePointManager.SecurityProtocol.HasFlag((SecurityProtocolType)3072));    


// enable Tls12, if possible
    if (!ServicePointManager.SecurityProtocol.HasFlag((SecurityProtocolType)3072)){
        if (platformSupportsTls12){
            Console.WriteLine("Platform supports Tls12, but it is not enabled. Enabling it now.");
            ServicePointManager.SecurityProtocol |= (SecurityProtocolType)3072;
        } else {
            Console.WriteLine("Platform does not supports Tls12.");
        }
    }

// disable ssl3
   if (ServicePointManager.SecurityProtocol.HasFlag(SecurityProtocolType.Ssl3)) { 
      Console.WriteLine("Ssl3SSL3 is enabled. Disabling it now.");
      // disable SSL3. Has no negative impact if SSL3 is already disabled. The enclosing "if" if just for illustration.
      System.Net.ServicePointManager.SecurityProtocol &= ~SecurityProtocolType.Ssl3;                      
   }
    Console.WriteLine("Enabled protocols:   " + ServicePointManager.SecurityProtocol);

Keluaran

Runtime: 4.7.2114.0
Enabled protocols:   Ssl3, Tls
Available protocols: 
0
48
192
768
3072
Is Tls12 enabled: False
Platform supports Tls12, but it is not enabled. Enabling it now.
Ssl3 is enabled. Disabling it now.
Enabled protocols:   Tls, Tls12
gerasoras
sumber
14

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:

  1. Perbaiki program

Sebelum menelepon HttpWebRequest.GetResponse () tambahkan perintah ini:

ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3 | SecurityProtocolType.Tls | SecurityProtocolTypeExtensions.Tls11 | SecurityProtocolTypeExtensions.Tls12;

Extensions 2 DLL dengan menambahkan 2 kelas baru: System.Net dan System.Security.Authentication

    namespace System.Net
    {
        using System.Security.Authentication;
        public static class SecurityProtocolTypeExtensions
        {
            public const SecurityProtocolType Tls12 = (SecurityProtocolType)SslProtocolsExtensions.Tls12;
            public const SecurityProtocolType Tls11 = (SecurityProtocolType)SslProtocolsExtensions.Tls11;
            public const SecurityProtocolType SystemDefault = (SecurityProtocolType)0;
        }
    } 

    namespace System.Security.Authentication
    {
        public static class SslProtocolsExtensions
        {
            public const SslProtocols Tls12 = (SslProtocols)0x00000C00;
            public const SslProtocols Tls11 = (SslProtocols)0x00000300;
        }
    } 
  1. Perbarui kumpulan Microsoft

Unduh batch:

  • Untuk windows 2008 R2: windows6.1-kb3154518-x64.msu
  • Untuk windows 2012 R2: windows8.1-kb3154520-x64.msu

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

Hieu
sumber
1
apakah mungkin perubahan SecurityProtocol tanpa mengubah kode sumber? seperti machine.config atau app.config.
ahankendi
1
Wow. Itu voodoo of the year award..stuff ... di sana. Anda mengguncang pinggiran kota!
granadaCoder
14

Mekanisme perubahan registri bekerja untuk saya setelah perjuangan. Sebenarnya aplikasi saya berjalan sebagai 32bit. Jadi saya harus mengubah nilainya.

HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft.NETFramework\v4.0.30319

Tipe nilai harus DWORD dan nilai di atas 0. Lebih baik gunakan 1.Pengaturan registri untuk mendapatkan aplikasi .Net 4.0 menggunakan TLS 1.2 asalkan .Net 4.5 diinstal di mesin.

Joy George Kunjikkuru
sumber
Itu tidak akurat. Untuk .NET 4.5.2, ini harus diatur ke 1 (atau lebih tinggi); tetapi untuk .NET 4.6, itu sudah cukup untuk tidak diatur ke 0 (yaitu, itu bisa tidak disetel).
Jirka Hanika
Oh, aku tidak menguji. Net 4.6. Temuan saya ada di blogpost joymonscode.blogspot.com/2015/08/...
Joy George Kunjikkuru
Kunci registri yang Anda sebutkan harus membaca "Wow6432Node". Anda menghilangkan bagian "Node" karena beberapa alasan. Saya mencoba mengedit tanggapan Anda tetapi perubahan saya hanya 4 huruf sehingga tidak akan membiarkan saya. : \
Jeffrey LeCours
Saya harus bangkit IIS agar pengaturan ini aktif sendiri sebagai default.
Jeff Mitchell
10

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 memeriksaServicePointManager.SecurityProtocol . Di bawah .NET 4.7, ada yang baruSystemDefaultmode 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:

SecurityProtocolType securityProtocols = ServicePointManager.SecurityProtocol;
if (securityProtocols.HasFlag(SecurityProtocolType.Ssl3) || securityProtocols.HasFlag(SecurityProtocolType.Tls) || securityProtocols.HasFlag(SecurityProtocolType.Tls11))
{
    securityProtocols &= ~(SecurityProtocolType.Ssl3 | SecurityProtocolType.Tls | SecurityProtocolType.Tls11);
    if (securityProtocols == 0)
    {
        securityProtocols |= SecurityProtocolType.Tls12;
    }
    ServicePointManager.SecurityProtocol = securityProtocols;
}

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 baruSystemDefaultmenyatakan 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.

Roger Sanders
sumber
1
Jawaban ini sepertinya yang paling dipikirkan, kecuali jika saya kehilangan sesuatu, saya tidak yakin itu akan kompatibel ke depan setiap kali TLS 1.2 mau tidak mau rusak. Dari apa yang saya lihat di aplikasi .NET 4.7.2 saya, SecurityProtocolType.SystemDefaultflag dievaluasi 0, jadi memeriksa if (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.
Griswald_911
Saya telah memodifikasi kode Anda untuk menyertakan ini dan tampaknya untuk bekerja dan menjadi maju kompatibel: if (!Enum.IsDefined(typeof(SecurityProtocolType), 0) && securityProtocols == 0) { securityProtocols |= SecurityProtocolType.Tls12; }.
Griswald_911
@ Griswald_911, saya memiliki kode serupa di aplikasi konsol 4.7.2 saya, dan saya menemukan baris ini 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?
Yang
@ Ya - Benar. securityProtocols |= SecurityProtocolType.Tls12;' will add TLS 1.2, but because the Enum SecurityProtocolType` baris memiliki [Flags]atribut, dan nilai enumerasi SystemDefault adalah 0, nilai SystemDefault akan dilucuti, bahkan jika sebelumnya ditetapkan. Hasil akhirnya adalah bahwa Anda dapat mengatur SevicePointManager.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.
Griswald_911
1
@Yang - Intinya adalah bahwa, setelah menetapkan nilai ke SystemDefault, aplikasi Anda harus menggunakan apa pun yang ditentukan OS - yaitu TLS 1.2 di versi terbaru Windows 10. Idenya adalah, di masa mendatang ketika TLS 1.3 menjadi standar, Anda tidak harus memodifikasi aplikasi Anda untuk mewarisi fungsi itu. Lihat dokumentasi di sini , di mana SystemDefault "memungkinkan sistem operasi untuk memilih protokol terbaik untuk digunakan, dan untuk memblokir protokol yang tidak aman".
Griswald_911
6

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.

OS                          TLS 1.2 support

Windows 10                  \_ Supported, and enabled by default.
Windows Server 2016         /   
Windows 8.1                 \_ Supported, and enabled by default.
Windows Server 2012 R2      /
Windows 8.0                 \_ Supported, and enabled by default.
Windows Server 2012         /
Windows 7 SP1               \_ Supported, but not enabled by default*.
Windows Server 2008 R2 SP1  /
Windows Server 2008         -  Support for TLS 1.2 and TLS 1.1 requires an update. See Update to add support for TLS 1.1 and TLS 1.2 in Windows Server 2008 SP2.
Windows Vista               -  Not supported.

* To enable TLS1.2 via the registry see https://docs.microsoft.com/en-us/windows-server/security/tls/tls-registry-settings#tls-12 

    Path: HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS1.2\Server

        Property: Enabled
        Type: REG_DWORD
        Value: 1

        Property: DisabledByDefault 
        Type: REG_DWORD
        Value: 0

    Path: HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS1.2\Client

        Property: Enabled
        Type: REG_DWORD
        Value: 1

        Property: DisabledByDefault 
        Type: REG_DWORD
        Value: 0

Untuk informasi lebih lanjut dan kerangka kerja yang lebih lama, silakan merujuk ke tautan MS.

JohnLBevan
sumber
3
Masalahnya adalah bahwa tls 1.1 dan tls 1.2 tidak akan berfungsi pada Windows 7 dan Server 2008 jika Anda mengikuti pedoman (menjaga SecurityProtocolType.SystemDefault) karena mereka tidak "diaktifkan" (apa pun artinya) di os ini tanpa perubahan registri. Ini membuat SystemDefault dalam praktiknya rusak oleh desain. Microsoft benar-benar mengacaukan yang satu ini.
osexpert
Bagus, terima kasih @osexpert, tangkapan bagus. Saya telah mengubah jawaban untuk menyertakan info tentang OS yang didukung, jadi tidak ada kejutan bagi orang-orang yang menjalankan OS lama di mana hanya menargetkan 4,7 tidak cukup.
JohnLBevan
1
NB: Ada juga KB untuk mengaktifkan protokol yang lebih baru pada beberapa OS: support.microsoft.com/en-my/help/3140245/…
JohnLBevan
1
Jika pengaturan registri bukan pilihan saya pikir ini adalah solusi terbaik untuk .NET 4.7+: if (System.Environment.OSVersion.Version < new Version(6, 2) /* Windows 8 */) ServicePointManager.SecurityProtocol |= SecurityProtocolType.Tls | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12; else ServicePointManager.SecurityProtocol = SecurityProtocolType.SystemDefault;
osexpert
5

Untuk kelengkapan, berikut ini adalah skrip Powershell yang menetapkan kunci registri yang disebutkan di atas:

new-itemproperty -path "HKLM:\SOFTWARE\Microsoft\.NETFramework\v4.0.30319" -name "SchUseStrongCrypto" -Value 1 -PropertyType "DWord";
new-itemproperty -path "HKLM:\SOFTWARE\Wow6432Node\Microsoft\.NETFramework\v4.0.30319" -name "SchUseStrongCrypto" -Value 1 -PropertyType "DWord"
qbik
sumber
2

Alternatif untuk hard-coding ServicePointManager.SecurityProtocolatau kunci SchUseStrongCrypto eksplisit seperti yang disebutkan di atas:
Anda dapat memberitahu .NET untuk menggunakan pengaturan SCHANNEL default dengan kunci SystemDefaultTlsVersions,
mis .:

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework\v4.0.30319] "SystemDefaultTlsVersions"=dword:00000001
[HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\.NETFramework\v4.0.30319] "SystemDefaultTlsVersions"=dword:00000001
Alfred
sumber
2

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.

GWC
sumber
Klarifikasi: Anda hanya perlu mengatur SevicePointManager.SecurityProtocol ATAU mengatur pengaturan registri. Tidak perlu melakukan keduanya. Untuk aplikasi saya, saya memilih untuk hanya mengatur ServicePointManager.SecurityProtocol. Alasan saya adalah bahwa pengaturan registri memengaruhi seluruh mesin, dan saya tidak ingin aplikasi orang lain rusak karena tergantung pada TLS 1.0.
GWC
1

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 dan SchUseStrongCrypto :

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\.NETFramework\v2.0.50727]
"SystemDefaultTlsVersions"=dword:00000001
"SchUseStrongCrypto"=dword:00000001

[HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\.NETFramework\v4.0.30319]
"SystemDefaultTlsVersions"=dword:00000001
"SchUseStrongCrypto"=dword:00000001

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework\v2.0.50727]
"SystemDefaultTlsVersions"=dword:00000001
"SchUseStrongCrypto"=dword:00000001

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework\v4.0.30319]
"SystemDefaultTlsVersions"=dword:00000001
"SchUseStrongCrypto"=dword:00000001
Benjamin Freitag
sumber
0

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:

To ensure .NET Framework applications remain secure, the TLS version should not be hardcoded. .NET Framework applications should use the TLS version the operating system (OS) supports.
yanivhs
sumber
-2

Untuk Kunci: HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft.NETFramework \ v4.0.30319 Nilai: SchUseStrongCrypto

Anda harus mengatur nilai ke 1.

kgw
sumber
5
Saya pikir Anda sedang downvoted karena itu adalah jawaban yang sama @Jira Mares ditawarkan, tetapi dengan kurang detail
Stuart Siegler