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 dapat memperoleh manfaat dari dokumen ini?

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.
  • Jangan tentukan versi TLS secara eksplisit. Konfigurasikan kode Anda untuk memungkinkan OS memutuskan versi TLS.
  • Lakukan audit kode menyeluruh untuk memverifikasi bahwa Anda tidak menentukan versi TLS atau SSL secara eksplisit.
  • Jangan gunakan SslProtocols.Default. (SslProtocols.Default menentukan versi SSL3 dan TLS1.0 yang usang.)

Saat aplikasi Anda memungkinkan OS memilih versi TLS:

  • Ini secara otomatis memanfaatkan protokol baru yang ditambahkan di masa mendatang.
  • OS memblokir protokol yang ditemukan tidak aman.

Bagian Mengaudit kode Anda dan membuat perubahan kode mencakup audit dan pembaruan kode Anda.

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 TLS1.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 AppContextSwitchSwitch.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: TLS Registry Pengaturan - 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.