Praktik terbaik Keamanan Lapisan Transportasi (TLS) dengan .NET Framework
Catatan
Halaman ini berisi informasi TLS .NET Framework. Jika Anda mencari informasi TLS .NET, lihat: Praktik Terbaik TLS/SSL
.NET Framework mendukung penggunaan protokol Keamanan Lapisan Transportasi (TLS) untuk mengamankan komunikasi jaringan.
Apa itu Keamanan Lapisan Transportasi (TLS)?
Peringatan
TLS 1.0 dan 1.1 tidak digunakan lagi oleh RFC8996. Dokumen ini hanya mencakup TLS 1.2 dan TLS 1.3.
Protokol Keamanan Lapisan Transportasi (TLS) adalah versi terbaru industri dari standar yang dirancang untuk membantu melindungi privasi informasi yang dikomunikasikan melalui Internet. TLS 1.3 adalah standar yang menyediakan peningkatan keamanan atas versi sebelumnya. Artikel ini menyajikan rekomendasi untuk mengamankan aplikasi .NET Framework yang menggunakan protokol TLS.
Siapa yang bisa mendapat manfaat dari dokumen ini?
- Secara langsung menggunakan API System.Net (misalnya, System.Net.Http.HttpClient dan System.Net.Security.SslStream).
- Secara langsung menggunakan klien dan layanan WCF menggunakan namespace System.ServiceModel.
Dukungan TLS di .NET Framework
Karena .NET Framework bergantung pada Schannel
Windows, versi mana yang dapat dinegosiasikan dan versi mana yang akan digunakan tergantung pada sistem operasi.
Berikut adalah tabel contoh yang diperbarui yang menunjukkan versi TLS tertinggi yang didukung untuk kombinasi versi sistem operasi yang berbeda dan versi target .NET Framework:
Versi Target .NET Framework | Windows 10 | Windows 11 |
---|---|---|
3.5 | TLS 1.2 | TLS 1.2 |
4.6.2 | TLS 1.2 | TLS 1.3 |
4.7 | TLS 1.2 | TLS 1.3 |
4.7.1 | TLS 1.2 | TLS 1.3 |
4.7.2 | TLS 1.2 | TLS 1.3 |
4.8 | TLS 1.2 | TLS 1.3 |
4.8.1 | TLS 1.2 | TLS 1.3 |
Untuk informasi selengkapnya, lihat dukungan versi protokol TLS di Schannel.
Rekomendasi
- Untuk TLS 1.3, targetkan .NET Framework 4.8 atau yang lebih baru. Periksa bagian Audit kode Anda cara memverifikasi
target framework
. - Jangan tentukan versi TLS secara eksplisit, yaitu jangan gunakan metode kelebihan beban
SslStream
yang mengambil parameter eksplisitSslProtocols
.- Dengan begitu kode Anda akan membiarkan OS memutuskan versi TLS.
- Jika Anda harus mengatur ServicePointManager.SecurityProtocol, maka atur ke SecurityProtocolType.SystemDefault. Itu juga akan menggunakan default OS.
- Jika Anda harus menggunakan metode kelebihan beban
SslStream
yang mengambil parameter eksplisitSslProtocols
, maka teruskanSslProtocols.SystemDefault
sebagai argumen. Itu juga akan menggunakan default OS.
- Lakukan audit kode menyeluruh untuk memverifikasi bahwa Anda tidak menentukan versi TLS atau SSL secara eksplisit.
Peringatan
Jangan gunakan SslProtocols.Default
, karena mengatur versi TLS ke SSL3 dan TLS 1.0 yang usang.
Saat aplikasi Anda memungkinkan OS memilih versi TLS:
- Ini secara otomatis memanfaatkan protokol TLS baru yang ditambahkan di masa mendatang.
- OS memblokir protokol yang ditemukan tidak aman (misalnya SSL3 dan TLS 1.0).
Artikel ini menjelaskan cara mengaktifkan keamanan terkuat yang tersedia untuk versi .NET Framework yang ditargetkan dan dijalankan aplikasi Anda. Ketika aplikasi menetapkan protokol dan versi keamanan secara eksplisit, ia menolak alternatif lain serta menolak perilaku default .NET Framework dan OS. Jika Anda ingin aplikasi Anda dapat menegosiasikan koneksi TLS 1.3, secara eksplisit mengatur ke versi TLS yang lebih rendah mencegah koneksi TLS 1.3.
Jika Anda tidak dapat menghindari menentukan versi protokol secara eksplisit, kami sangat menyarankan Anda menentukan TLS 1.2 atau TLS 1.3 (yaitu currently considered secure
). Untuk panduan mengidentifikasi dan menghapus dependensi TLS 1.0, unduh laporan resmi Pemecahan Masalah TLS 1.0.
WCF mendukung TLS 1.2 sebagai default dalam .NET Framework 4.7. Dimulai dengan .NET Framework 4.7.1, WCF ,menjadi default ke versi yang dikonfigurasi sistem operasi. Jika aplikasi dikonfigurasi secara eksplisit dengan SslProtocols.None
, WCF menggunakan pengaturan default sistem operasi saat menggunakan transportasi NetTcp.
Anda dapat mengajukan pertanyaan tentang dokumen ini dalam GitHub yang mengeluarkan Praktik terbaik Keamanan Lapisan Transportasi (TLS) dengan .NET Framework.
Mengaudit kode Anda dan membuat perubahan kode
Untuk aplikasi ASP.NET, periksa <system.web><httpRuntime targetFramework>
elemen web.config untuk memverifikasi bahwa Anda menggunakan versi .NET Framework yang dimaksudkan penargetan.
Untuk Formulir Windows dan aplikasi lainnya, lihat Cara: Menargetkan Versi .NET Framework.
Gunakan bagian berikut untuk memverifikasi bahwa Anda tidak menggunakan versi TLS atau SSL tertentu.
Jika Anda harus secara eksplisit mengatur Protokol Keamanan
Jika Anda harus secara eksplisit mengatur protokol keamanan alih-alih membiarkan .NET atau OS memilih protokol keamanan, pilih protokol ini:
- Untuk .NET Framework 3.5: TLS 1.2
- Untuk .NET Framework 4.6.2 atau yang lebih baru: TLS 1.3
Jika Anda tidak dapat menemukan protokol yang ditentukan dalam enum, Anda dapat menambahkannya sebagai file ekstensi. Lihat di bawah ini:
SslProtocolExtensions.cs
namespace System.Security.Authentication
{
public static class SslProtocolsExtensions
{
// For .NET Framework 3.5
public const SslProtocols Tls12 = (SslProtocols)3072;
// For .NET Framework 4.6.2 and later
public const SslProtocols Tls13 = (SslProtocols)12288;
}
}
SecurityProtocolExtensions.cs
using System.Security.Authentication;
namespace System.Net
{
public static class SecurityProtocolTypeExtensions
{
// For .NET Framework 3.5
public const SecurityProtocolType Tls12 = (SecurityProtocolType)SslProtocolsExtensions.Tls12;
// For .NET Framework 4.6.2 and later
public const SecurityProtocolType Tls13 = (SecurityProtocolType)SslProtocolsExtensions.Tls13;
}
}
Untuk informasi selengkapnya, lihat Dukungan untuk Versi Default Sistem TLS yang termasuk dalam .NET Framework 3.5 pada Windows 8.1 dan Windows Server 2012 R2.
Untuk API System.Net (HttpClient, SslStream)
Jika aplikasi Anda menargetkan .NET Framework 4.7 atau versi yang lebih baru
Bagian berikut menunjukkan cara mengonfigurasi aplikasi Anda untuk menggunakan currently considered secure versions
TLS. (TLS 1.2, TLS 1.3)
Untuk HttpClient dan HttpWebRequest
ServicePointManager, menggunakan .NET Framework 4.7 dan versi yang lebih baru, akan menggunakan protokol keamanan default yang dikonfigurasi di OS. Untuk mendapatkan pilihan OS default, jika memungkinkan, jangan tetapkan nilai untuk properti ServicePointManager.SecurityProtocol, yang default ke SecurityProtocolType.SystemDefault.
Karena SecurityProtocolType.SystemDefault pengaturan menyebabkan ServicePointManager menggunakan protokol keamanan default yang dikonfigurasi oleh sistem operasi, aplikasi Anda dapat berjalan secara berbeda berdasarkan OS yang dijalankannya. Misalnya, Windows 10 menggunakan TLS 1.2 sementara Windows 11 menggunakan TLS 1.3.
Untuk SslStream
SslStream, menggunakan .NET Framework 4.7 dan versi yang lebih baru, default ke OS memilih protokol dan versi keamanan terbaik. Untuk mendapatkan pilihan terbaik OS default, jika memungkinkan, jangan gunakan metode yang kelebihan SslStream yang menggunakan parameter SslProtocols eksplisit. Jika tidak, lewati SslProtocols.None. Kami menyarankan agar Anda tidak menggunakan Default; pengaturan SslProtocols.Default
memaksa penggunaan SSL 3.0 /TLS 1.0 dan mencegah TLS 1.2.
Jangan tetapkan nilai untuk properti SecurityProtocol (untuk jaringan HTTP).
Jangan gunakan metode kelebihan beban SslStream yang menggunakan parameter SslProtocols eksplisit (untuk jaringan soket TCP). Saat menargetkan ulang aplikasi Anda ke .NET Framework 4.7 atau versi yang lebih baru, Anda akan mengikuti rekomendasi praktik terbaik berikut.
Untuk aplikasi WCF
Jika aplikasi Anda menargetkan .NET Framework 4.7 atau versi yang lebih baru
Bagian berikut menunjukkan cara mengonfigurasi aplikasi Anda untuk menggunakan currently considered secure versions
TLS. (TLS 1.2, TLS 1.3)
Menggunakan transportasi TCP menggunakan keamanan transportasi dengan kredensial sertifikat
WCF menggunakan tumpukan jaringan yang sama dengan .NET Framework lainnya.
Jika Anda menargetkan 4.7.1, WCF dikonfigurasi untuk memungkinkan OS memilih protokol keamanan terbaik secara default kecuali dikonfigurasi secara eksplisit:
- Dalam file konfigurasi aplikasi Anda.
- Atau, di aplikasi Anda dalam kode sumber.
Secara default, .NET Framework 4.7 dan versi yang lebih baru dikonfigurasi untuk menggunakan TLS 1.2 dan mengizinkan koneksi menggunakan TLS 1.1 atau TLS 1.0. Konfigurasikan WCF untuk memungkinkan OS memilih protokol keamanan terbaik dengan mengonfigurasi pengikatan Anda menggunakan SslProtocols.None. Ini dapat diatur pada SslProtocols. SslProtocols.None
dapat diakses dari Transport. NetTcpSecurity.Transport
dapat diakses dari Security.
Jika Anda menggunakan pengikatan kustom:
- Konfigurasikan WCF untuk memungkinkan OS memilih protokol keamanan terbaik dengan mengatur SslProtocols untuk menggunakan SslProtocols.None.
- Atau konfigurasikan protokol yang digunakan dengan jalur konfigurasi
system.serviceModel/bindings/customBinding/binding/sslStreamSecurity:sslProtocols
.
Jika Anda tidak menggunakan pengikatan kustom dan mengatur pengikatan WCF menggunakan konfigurasi, atur protokol yang digunakan dengan jalur konfigurasi system.serviceModel/bindings/netTcpBinding/binding/security/transport:sslProtocols
.
Menggunakan Keamanan Pesan dengan kredensial sertifikat
.NET Framework 4.7 dan versi yang lebih baru secara default menggunakan protokol yang ditentukan dalam SecurityProtocol properti . Ketika AppContextSwitch Switch.System.ServiceModel.DisableUsingServicePointManagerSecurityProtocols
diatur ke true
, WCF memilih protokol terbaik, hingga TLS 1.0.
Jika aplikasi Anda menargetkan versi .NET Framework sebelum versi 4.7
Bagian berikut menunjukkan cara mengonfigurasi aplikasi Anda untuk menggunakan currently considered secure versions
TLS. (TLS 1.2, TLS 1.3)
Menggunakan .NET Framework 4.6.2 menggunakan keamanan transportasi TCP dengan Kredensial Sertifikat
Kerangka kerja WCF secara otomatis memilih protokol tertinggi yang tersedia hingga TLS 1.2 kecuali Anda mengonfigurasi versi protokol secara eksplisit. Untuk informasi selengkapnya, lihat bagian sebelumnya Untuk Transportasi TCP WCF yang menggunakan keamanan transportasi dengan mandat sertifikat.
Menggunakan .NET Framework 3.5 menggunakan keamanan transportasi TCP dengan Kredensial Sertifikat
Versi kerangka kerja WCF ini secara eksplisit ditentukan untuk menggunakan nilai SSL 3.0 dan TLS 1.0. Nilai ini tidak dapat diubah. Anda harus memperbarui dan menargetkan ulang ke NET Framework 4.6.2 atau versi yang lebih baru untuk menggunakan TLS 1.2.
Mengonfigurasi keamanan melalui sakelar AppContext (untuk .NET Framework 4.6.2 atau versi yang lebih baru)
Sakelar AppContext yang dijelaskan di bagian ini relevan jika aplikasi Anda menargetkan , atau berjalan, .NET Framework 4.6.2 atau versi yang lebih baru. Baik secara default, atau dengan mengaturnya secara eksplisit, tombol harus false
jika memungkinkan. Jika Anda ingin mengonfigurasi keamanan melalui salah satu atau kedua tombol, jangan tentukan nilai protokol keamanan tertentu dalam kode Anda; melakukannya akan mengambil alih tombol.
Untuk API System.Net (HttpClient, SslStream)
Tombol memiliki efek yang sama, baik Anda melakukan jaringan HTTP (ServicePointManager) atau pun jaringan soket TCP (SslStream).
Switch.System.Net.DontEnableSchUseStrongCrypto
Nilai false
untuk Switch.System.Net.DontEnableSchUseStrongCrypto
menyebabkan aplikasi Anda menggunakan kriptografi yang kuat. Nilai false
untuk DontEnableSchUseStrongCrypto
menggunakan protokol jaringan yang lebih aman (TLS 1.2 dan TLS 1.1) dan memblokir protokol yang tidak aman. Untuk info selengkapnya, lihat Bendera SCH_USE_STRONG_CRYPTO. Nilai true
menonaktifkan kriptografi yang kuat untuk aplikasi Anda. Tombol ini hanya memengaruhi koneksi klien (keluar) di aplikasi Anda.
Jika aplikasi Anda menargetkan .NET Framework 4.6.2 atau versi yang lebih baru, pengalihan ini akan default ke false
. Itu merupakan default yang aman, yang kami sarankan. Jika aplikasi Anda berjalan pada .NET Framework 4.6.2, tetapi menargetkan versi yang lebih lama, sakelar akan default ke true
. Dalam hal ini, Anda harus mengaturnya secara eksplisit ke false
.
DontEnableSchUseStrongCrypto
seharusnya hanya memiliki nilai true
jika Anda perlu terhubung ke layanan warisan yang tidak mendukung kriptografi yang kuat dan tidak dapat ditingkatkan.
Switch.System.Net.DontEnableSystemDefaultTlsVersions
Nilai false
untuk Switch.System.Net.DontEnableSystemDefaultTlsVersions
menyebabkan aplikasi Anda memungkinkan sistem operasi memilih protokol. Nilai true
menyebabkan aplikasi Anda menggunakan protokol yang dipilih oleh .NET Framework.
Jika aplikasi Anda menargetkan .NET Framework 4.7 atau versi yang lebih baru, tombol ini default ke false
. Itu merupakan default aman yang kami rekomendasikan. Jika aplikasi Anda berjalan di .NET Framework 4.7 atau versi yang lebih baru tetapi menargetkan versi sebelumnya, tombol akan default ke true
. Dalam hal ini, Anda harus mengaturnya secara eksplisit ke false
.
Untuk aplikasi WCF
Switch.System.ServiceModel.DisableUsingServicePointManagerSecurityProtocols
Nilai false
untuk Switch.System.ServiceModel.DisableUsingServicePointManagerSecurityProtocols
menyebabkan aplikasi Anda menggunakan nilai yang ditentukan di ServicePointManager.SecurityProtocols
untuk keamanan pesan menggunakan mandat sertifikat. Nilai true
menggunakan protokol tertinggi yang tersedia, hingga TLS1.0
Untuk aplikasi yang menargetkan .NET Framework 4.7 dan versi yang lebih baru, nilai ini akan default ke false
. Untuk aplikasi yang menargetkan .NET Framework 4.6.2 dan lebih awal, nilai ini default ke true
.
Switch.System.ServiceModel.DontEnableSystemDefaultTlsVersions
Nilai false
untuk Switch.System.ServiceModel.DontEnableSystemDefaultTlsVersions
mengatur konfigurasi default untuk memungkinkan sistem operasi memilih protokol. Nilai true
menetapkan default ke protokol tertinggi yang tersedia hingga TLS1.2.
Untuk aplikasi yang menargetkan .NET Framework 4.7.1 dan versi yang lebih baru, nilai ini default kerangka kerja false
. Untuk aplikasi yang menargetkan .NET Framework 4.7 dan lebih awal, nilai ini default ke true
.
Untuk informasi selengkapnya tentang protokol TLS, lihat Mitigasi: Protokol TLS. Untuk informasi selengkapnya tentang tombol AppContext
, lihat <AppContextSwitchOverrides> Element
.
Mengonfigurasi keamanan melalui Windows Registry
Peringatan
Pengaturan kunci registri memengaruhi semua aplikasi pada sistem. Gunakan opsi ini hanya jika Anda memegang kendali penuh atas mesin dan dapat mengontrol perubahan yang dilakukan pada registri.
Jika mengatur satu atau kedua tombol AppContext
bukan merupakan opsi, Anda dapat mengontrol protokol keamanan yang digunakan aplikasi Anda dengan kunci Windows Registri yang dijelaskan di bagian ini. Anda mungkin tidak dapat menggunakan satu atau kedua AppContext
sakelar jika aplikasi Anda berjalan di .NET Framework 3.5, atau jika Anda tidak dapat mengedit file konfigurasi. Jika Anda ingin mengonfigurasi keamanan dengan registri, jangan tentukan nilai protokol keamanan dalam kode Anda; melakukannya mengambil alih pengaturan registri.
Nama kunci registri mirip dengan nama tombol AppContext
yang sesuai tetapi tanpa DontEnable
di depan namanya. Misalnya, AppContext
tombol DontEnableSchUseStrongCrypto
adalah kunci registri yang disebut SchUseStrongCrypto.
Kunci ini tersedia di semua versi .NET Framework.
Semua kunci registri yang dijelaskan di bawah ini memiliki efek yang sama, baik Anda melakukan jaringan HTTP (ServicePointManager) atau pun jaringan soket TCP (SslStream).
SchUseStrongCrypto
Entri HKEY_LOCAL_MACHINE\SOFTWARE\[Wow6432Node\]Microsoft\.NETFramework\<VERSION>: SchUseStrongCrypto
registri memiliki nilai jenis DWORD. Nilai 1 menyebabkan aplikasi Anda menggunakan kriptografi yang kuat. Kriptografi yang kuat menggunakan protokol jaringan yang lebih aman (TLS 1.2 dan TLS 1.1) dan memblokir protokol yang tidak aman. Nilai 0 menonaktifkan kriptografi yang kuat. Untuk informasi selengkapnya, lihat Bendera SCH_USE_STRONG_CRYPTO. Pengaturan registri ini hanya memengaruhi koneksi (keluar) di aplikasi Anda.
Jika aplikasi Anda menargetkan .NET Framework 4.6 atau versi yang lebih baru, kunci ini akan default ke nilai 1. Itu merupakan default aman yang kami rekomendasikan. Jika aplikasi Anda menargetkan .NET Framework 4.5.2 atau versi sebelumnya, kunci akan default ke 0. Dalam hal ini, Anda haru mengatur nilainya ke 1 secara eksplisit.
Kunci ini hanya boleh memiliki nilai 0 jika Anda perlu terhubung ke layanan lama yang tidak mendukung kriptografi yang kuat dan tidak dapat diperbarui.
SystemDefaultTlsVersions
Entri HKEY_LOCAL_MACHINE\SOFTWARE\[Wow6432Node\]Microsoft\.NETFramework\<VERSION>: SystemDefaultTlsVersions
registri memiliki nilai jenis DWORD. Nilai 1 menyebabkan aplikasi Anda memungkinkan sistem operasi untuk memilih protokol. Nilai 0 menyebabkan aplikasi Anda menggunakan protokol yang dipilih oleh .NET Framework.
<VERSION>
harus merupakan v4.0.30319 (untuk .NET Framework 4 dan setelahnya) atau v2.0.50727 (untuk .NET Framework 3.5).
Jika Aplikasi Anda menargetkan .NET Framework 4.7 atau versi yang lebih baru, kunci ini akan default ke nilai 1. Itu merupakan default aman yang kami rekomendasikan. Jika aplikasi Anda menargetkan .NET Framework 4.6.1 atau versi sebelumnya, kunci akan default ke 0. Dalam hal ini, Anda haru mengatur nilainya ke 1 secara eksplisit.
Untuk info selengkapnya, lihat Pembaruan Kumulatif untuk Windows 10 Versi 1511 dan Pratinjau Teknis 4 Windows Server 2016: 10 Mei 2016.
Untuk informasi selengkapnya tentang .NET Framework 3.5.1, lihat Dukungan untuk Versi Default Sistem TLS yang termasuk dalam .NET Framework 3.5.1 pada Windows 7 SP1 dan Server 2008 R2 SP1.
Berikut ini . File REG mengatur entri registri dan variannya ke nilai yang paling aman:
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
Mengonfigurasi protokol Schannel di Registri Windows
Anda dapat menggunakan registri untuk kontrol mendetail atas protokol yang dinegosiasikan klien dan/atau aplikasi Anda. Jaringan aplikasi Anda melewati Schannel (yang merupakan nama lain untuk Saluran Aman). Dengan mengonfigurasi Schannel
, Anda dapat mengonfigurasi perilaku aplikasi Anda.
Mulailah dengan kunci registri HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols
. Di bawah kunci itu, Anda dapat membuat subkunci apa pun di set TLS 1.2
, TLS 1.3
. Dengan masing-masing subkunci, Anda dapat membuat subkunci Client
dan/atau Server
. Dengan Client
dan Server
, Anda dapat membuat nilai DWORD DisabledByDefault
(0 atau 1) dan Enabled
(0 atau 1).
Untuk informasi selengkapnya lihat: Pengaturan Registri TLS - Schannel
Bendera SCH_USE_STRONG_CRYPTO
Saat diaktifkan (secara default, dengan AppContext
sakelar, atau oleh Windows Registry), .NET Framework menggunakan SCH_USE_STRONG_CRYPTO
bendera saat aplikasi Anda memulai koneksi TLS ke server. .NET Framework meneruskan bendera untuk Schannel
memintanya menonaktifkan algoritma kriptografi lemah, rangkaian sandi, dan versi protokol TLS/SSL yang diketahui, yang mungkin sebaliknya diaktifkan untuk interoperabilitas yang lebih baik. Untuk informasi selengkapnya, lihat:
Bendera SCH_USE_STRONG_CRYPTO
juga diteruskan ke Schannel
untuk koneksi klien (keluar) ketika Anda secara eksplisit menggunakan Tls11
atau Tls12
menghitung nilai SecurityProtocolType atau SslProtocols. Bendera SCH_USE_STRONG_CRYPTO
hanya digunakan untuk koneksi di mana aplikasi Anda bertindak sebagai klien. Anda dapat menonaktifkan protokol dan algoritma yang lemah ketika aplikasi Anda berperan sebagai server dengan mengonfigurasi pengaturan registri Schannel
di seluruh mesin.