Bagikan melalui


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?

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 untuk mengetahui cara memverifikasi .
  • Jangan tentukan versi TLS secara eksplisit, yaitu jangan gunakan metode kelebihan beban SslStream yang mengambil parameter eksplisit SslProtocols .
    • 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 overload metode SslStream dengan parameter eksplisit SslProtocols, maka berikan SslProtocols.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 secara otomatis menggunakan versi yang dikonfigurasi oleh 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 elemen <system.web><httpRuntime targetFramework> dari web.config untuk memverifikasi bahwa versi .NET Framework yang dimaksud digunakan untuk 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.

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)

Bagian berikut menunjukkan cara mengonfigurasi aplikasi Anda untuk menggunakan "versi yang saat ini dianggap aman" TLS (yaitu TLS 1.2 dan TLS 1.3) jika menargetkan .NET Framework 4.7 atau yang lebih baru.

Untuk HttpClient dan HttpWebRequest

ServicePointManager menggunakan protokol keamanan default yang dikonfigurasi dalam OS. Untuk mendapatkan pilihan OS default, jika memungkinkan, jangan tetapkan nilai untuk properti ServicePointManager.SecurityProtocol, yang default ke SecurityProtocolType.SystemDefault.

Karena pengaturan SecurityProtocolType.SystemDefault menyebabkan ServicePointManager menggunakan protokol keamanan default yang dikonfigurasi oleh sistem operasi, aplikasi Anda mungkin beroperasi secara berbeda tergantung pada sistem operasi yang digunakannya. Misalnya, Windows 10 menggunakan TLS 1.2, sedangkan Windows 11 menggunakan TLS 1.3.

Untuk SslStream

SslStream mengatur secara default ke protokol dan versi keamanan yang dipilih oleh sistem operasi. Untuk mendapatkan pilihan terbaik saat menggunakan OS default, sebisa mungkin jangan gunakan overload metode SslStream yang memerlukan parameter SslProtocols secara 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

Bagian berikut menunjukkan cara mengonfigurasi aplikasi Anda untuk menggunakan "versi yang saat ini dianggap aman" TLS (yaitu, TLS 1.2 dan 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, pada 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. Anda dapat mengatur ini 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.

Mengonfigurasi keamanan melalui sakelar AppContext

Sakelar AppContext yang dijelaskan di bagian ini relevan jika aplikasi Anda menargetkan atau berjalan pada .NET Framework 4.6.2 atau versi yang lebih tinggi. Baik secara default, atau dengan mengaturnya secara eksplisit, tombol harus false jika memungkinkan. Jika Anda ingin mengonfigurasi keamanan melalui satu atau kedua sakelar, maka jangan tentukan nilai protokol keamanan dalam kode Anda; melakukannya mengambil alih sakelar.

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, pengaturan ini bernilai 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, pengaturan otomatis akan default ke true. Dalam hal ini, Anda harus mengaturnya secara eksplisit ke false.

Mengonfigurasi protokol Schannel di Registri Windows

Anda dapat menggunakan registri untuk kontrol halus atas protokol yang dinegosiasikan oleh klien atau aplikasi server Anda. Jaringan aplikasi Anda melewati Schannel (yang merupakan nama lain untuk Secure Channel). 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

Pengaturan SCH_USE_STRONG_CRYPTO

Saat diaktifkan (secara default, atau dengan AppContext sakelar), .NET Framework menggunakan SCH_USE_STRONG_CRYPTO bendera saat aplikasi Anda memulai koneksi TLS ke server. .NET Framework meneruskan bendera ke Schannel untuk memintanya menonaktifkan algoritma kriptografi lemah yang diketahui, serta rangkaian sandi dan versi protokol TLS/SSL, yang mungkin diaktifkan sebaliknya untuk interoperabilitas yang lebih baik. Untuk informasi selengkapnya, lihat:

Flag SCH_USE_STRONG_CRYPTO juga diteruskan ke Schannel untuk koneksi klien (outgoing) ketika Anda secara eksplisit menggunakan nilai enumerasi Tls11 atau Tls12 dari 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.