.NET Framework ile Aktarım Katmanı Güvenliği (TLS) en iyi yöntemleri

Not

Bu sayfa .NET Framework TLS bilgilerini içerir. .NET TLS bilgilerini arıyorsanız bkz. TLS/SSL En İyi Yöntemleri

.NET Framework, ağ iletişimlerinin güvenliğini sağlamak için Aktarım Katmanı Güvenliği (TLS) protokolünün kullanımını destekler.

Aktarım Katmanı Güvenliği (TLS) nedir?

Uyarı

TLS 1.0 ve 1.1 RFC8996 tarafından kullanım dışı bırakılmıştır. Bu belge yalnızca TLS 1.2 ve TLS 1.3'i kapsar.

Aktarım Katmanı Güvenliği (TLS) protokolü, İnternet üzerinden iletişim kuran bilgilerin gizliliğini korumaya yardımcı olmak için tasarlanmış, standardın endüstrinin en son sürümüdür. TLS 1.3 , önceki sürümlere göre güvenlik iyileştirmeleri sağlayan bir standarttır. Bu makalede, TLS protokolünü kullanan .NET Framework uygulamalarının güvenliğini sağlama önerileri sağlanır.

Bu belgeden kimler yararlanabilir?

.NET Framework'te TLS desteği

.NET Framework Windows'a Schannel bağımlı olduğundan, hangi sürümlerin üzerinde anlaşılabileceğini ve hangi sürümün kullanılacağını işletim sistemine bağlıdır.

aşağıda, işletim sistemi sürümlerinin ve .NET Framework hedef sürümlerinin farklı bileşimleri için desteklenen en yüksek TLS sürümünü gösteren güncelleştirilmiş bir örnek tablo verilmiştir:

.NET Framework Hedef Sürümü 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

Daha fazla bilgi için bkz. Schannel'de TLS protokol sürümü desteği.

Öneriler

  • TLS 1.3 için hedef .NET Framework 4.8 veya üzeri. Kodunuzu doğrulamak için Kodunuzu Denetleyin bölümünü kontrol edin ve target framework bölümünü nasıl doğrulayacağınız hakkında bilgi edinin.
  • TLS sürümünü açıkça belirtmeyin; örneğin, açık SslStream bir parametre alan yönteminin SslProtocols aşırı yüklemelerini kullanmayın.
    • Bu şekilde kodunuz işletim sisteminin TLS sürümüne karar vermesine izin verir.
    • Ayarlamanız gerekiyorsa ServicePointManager.SecurityProtocol, onu SecurityProtocolType.SystemDefault olarak ayarlayın. Bu, işletim sistemi varsayılanı da kullanır.
    • Eğer açık bir SslStream parametresi alan SslProtocols yöntem aşırı yüklemelerini kullanmanız gerekiyorsa, SslProtocols.SystemDefault'yi bağımsız değişken olarak geçirin. Bu, işletim sistemi varsayılanı da kullanır.
  • TlS veya SSL sürümünü açıkça belirtmediğinizden emin olmak için kapsamlı bir kod denetimi gerçekleştirin.

Uyarı

TLS sürümünü SSL3 ve TLS 1.0 olarak ayarladığından ve bu sürümün kullanımdan kaldırıldığı için kullanmayın SslProtocols.Default.

Uygulamanız işletim sisteminin TLS sürümünü seçmesine izin veriyorsa:

  • Gelecekte eklenen yeni TLS protokollerinden otomatik olarak yararlanır.
  • İşletim sistemi, güvenli olmadığı bulunan protokolleri engeller (örneğin, SSL3 ve TLS 1.0).

Bu makalede, uygulamanızın hedefleyip üzerinde çalıştığı .NET Framework sürümü için kullanılabilir en güçlü güvenliğin nasıl etkinleştirileceği açıklanmaktadır. Bir uygulama açıkça bir güvenlik protokolü ve sürümü belirlediğinde, başka bir alternatiften vazgeçer ve .NET Framework ve işletim sistemi varsayılan davranışından vazgeçer. Uygulamanızın TLS 1.3 bağlantısı anlaşması yapabilmesini istiyorsanız, açıkça daha düşük bir TLS sürümüne ayarlamak TLS 1.3 bağlantısını engeller.

Açıkça bir protokol sürümü belirtmekten kaçınamıyorsanız, TLS 1.2 veya TLS 1.3 (yani currently considered secure) belirtmenizi kesinlikle öneririz. TLS 1.0 bağımlılıklarını tanımlama ve kaldırma konusunda rehberlik için TLS 1.0 Sorununu Çözme teknik incelemesini indirin.

WCF, .NET Framework 4.7'de varsayılan olarak TLS 1.2'yi destekler. .NET Framework 4.7.1'den başlayarak, WCF varsayılan olarak işletim sistemi tarafından yapılandırılmış sürümü kullanır. Bir uygulama ile SslProtocols.Noneaçıkça yapılandırılmışsa, WCF NetTcp aktarımını kullanırken işletim sistemi varsayılan ayarını kullanır.

GitHub sorununda aktarım katmanı güvenliği (TLS) en iyi yöntemleri hakkında .NET Framework ile bu belge hakkında sorular sorabilirsiniz.

Kodunuzu denetleme ve kod değişiklikleri yapma

ASP.NET uygulamaları için web.config dosyasının elementini inceleyerek .NET Framework'ün hedeflenen sürümünü kullandığınızdan emin olun.

Windows Forms ve diğer uygulamalar için bkz Nasıl Yapılır: .NET Framework'ün Bir Sürümünü Hedefleme.

Belirli bir TLS veya SSL sürümü kullanmadığınızı doğrulamak için aşağıdaki bölümleri kullanın.

Güvenlik protokollerini açıkça ayarlama

.NET'in veya işletim sisteminin güvenlik protokollerini seçmesine izin vermek yerine açıkça bir güvenlik protokolü ayarlamanız gerekiyorsa şu protokolleri seçin:

  • .NET Framework 3.5 için: TLS 1.2
  • .NET Framework 4.6.2 veya üzeri için: TLS 1.3

Belirtilen protokolleri sabit listesinde bulamazsanız, bunları bir uzantı dosyası olarak ekleyebilirsiniz. Aşağıya bakın:

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;
    }
}

Daha fazla bilgi için bkz . Windows 8.1 ve Windows Server 2012 R2 üzerinde .NET Framework 3.5'te bulunan TLS Sistem Varsayılan Sürümleri desteği.

System.Net API'leri için (HttpClient, SslStream)

Aşağıdaki bölümlerde, uygulamanızın .NET Framework 4.7 veya üzerini hedeflediyse TLS'nin (TLS 1.2 ve TLS 1.3) "şu anda güvenli olarak kabul edilen sürümlerini" kullanacak şekilde nasıl yapılandırılır gösterilmektedir.

HttpClient ve HttpWebRequest için

ServicePointManager işletim sisteminde yapılandırılan varsayılan güvenlik protokollerini kullanır. Varsayılan işletim sistemi seçimini almak için, mümkünse ServicePointManager.SecurityProtocol özelliği için değer ayarlamayın; bu varsayılan olarak SecurityProtocolType.SystemDefault olarak ayarlıdır.

Ayarın SecurityProtocolType.SystemDefault işletim sistemi tarafından yapılandırılan varsayılan güvenlik protokollerini kullanmasına neden olduğundan ServicePointManager , uygulamanız üzerinde çalıştırıldığı işletim sistemine göre farklı çalışabilir. Örneğin, Windows 10 TLS 1.2 kullanırken Windows 11 TLS 1.3 kullanır.

SslStream için

SslStream varsayılan olarak işletim sistemi tarafından seçilen güvenlik protokolü ve sürümünü kullanır. Varsayılan işletim sistemi en iyi seçimini elde etmek için, mümkünse SslStream ile açıkça belirtilmiş SslProtocols parametresi alan metodun aşırı yüklemelerini kullanmayın. Aksi takdirde, devam edin SslProtocols.None. kullanmamanızı Defaultöneririz; ayarı SslProtocols.Default SSL 3.0 /TLS 1.0 kullanımını zorlar ve TLS 1.2'yi engeller.

özelliği için SecurityProtocol bir değer ayarlamayın (HTTP ağı için).

Açıkça belirtilen SslStream parametresi alan SslProtocols yöntemi aşırı yüklemelerini kullanmayın (TCP soket ağı için). Uygulamanızı .NET Framework 4.7 veya sonraki sürümlerine yeniden hedeflediğinizde en iyi yöntemler önerisini izlersiniz.

WCF uygulamaları için

Aşağıdaki bölümlerde uygulamanızı TLS'nin "şu anda güvenli sürümleri olarak kabul ediliyor" (TLS 1.2 ve TLS 1.3) kullanacak şekilde nasıl yapılandırılır gösterilmektedir.

Sertifika kimlik bilgileriyle aktarım güvenliğini kullanarak TCP aktarımını kullanma

WCF, .NET Framework'ün geri kalanıyla aynı ağ yığınını kullanır.

4.7.1'i hedeflediyseniz WCF, açıkça yapılandırılmadığı sürece işletim sisteminin varsayılan olarak en iyi güvenlik protokollerini seçmesine izin verecek şekilde yapılandırılır:

  • Uygulama yapılandırma dosyanızda.
  • Veya kaynak kodundaki uygulamanızda.

Varsayılan olarak, .NET Framework 4.7 ve sonraki sürümleri TLS 1.2 kullanacak şekilde yapılandırılır ve TLS 1.1 veya TLS 1.0 kullanan bağlantılara izin verir. WCF'yi, bağlamanızı kullanacak SslProtocols.Noneşekilde yapılandırarak işletim sisteminin en iyi güvenlik protokollerini seçmesine izin verecek şekilde yapılandırın. Bunu SslProtocols üzerinde ayarlayabilirsiniz. SslProtocols.None 'den Transporterişilebilir. NetTcpSecurity.Transport 'den Securityerişilebilir.

Özel bağlama kullanıyorsanız:

  • WCF'yi, işletim sisteminin en iyi güvenlik protokolünü seçmesine izin verecek şekilde, SslProtocols kullanarak SslProtocols.None ayarlayın.
  • Veya yapılandırma yolu system.serviceModel/bindings/customBinding/binding/sslStreamSecurity:sslProtocolsile kullanılan protokolü yapılandırın.

Özel bir bağlama kullanmıyorsanız ve WCF bağlamanızı yapılandırma kullanarak ayarlıyorsanız, kullanılan protokolü system.serviceModel/bindings/netTcpBinding/binding/security/transport:sslProtocols yapılandırma yoluyla ayarlayın.

İleti Güvenliği'ni sertifika kimlik bilgileriyle kullanma

.NET Framework 4.7 ve sonraki sürümleri varsayılan olarak özelliğinde SecurityProtocol belirtilen protokolü kullanır. AppContextSwitchSwitch.System.ServiceModel.DisableUsingServicePointManagerSecurityProtocols olarak ayarlandığında trueWCF, TLS 1.0'a kadar en iyi protokolü seçer.

AppContext anahtarları aracılığıyla güvenliği yapılandırma

Bu bölümde açıklanan AppContext anahtarları, uygulamanızın .NET Framework 4.6.2 veya sonraki bir sürümü hedeflemesi veya üzerinde çalışması durumunda geçerlidir. İster varsayılan olsun, ister açıkça ayarlayın, anahtarlar mümkünse false olmalıdır. Güvenliği bir veya her iki anahtar aracılığıyla yapılandırmak istiyorsanız, kodunuzda bir güvenlik protokolü değeri belirtmeyin; bunu yapmak anahtarları geçersiz kılar.

HTTP ağ iletişimi (ServicePointManager) veya TCP soket ağ iletişimi (SslStream) yapıyor olun, anahtarlar aynı etkiye sahiptir.

Switch.System.Net.DontEnableSchUseStrongCrypto

false için Switch.System.Net.DontEnableSchUseStrongCrypto değeri, uygulamanızın güçlü şifreleme kullanmasına neden olur. için false değeri DontEnableSchUseStrongCrypto daha güvenli ağ protokolleri (TLS 1.2 ve TLS 1.1) kullanır ve güvenli olmayan protokolleri engeller. Daha fazla bilgi için bkz . SCH_USE_STRONG_CRYPTO bayrağı. değeri true , uygulamanız için güçlü şifrelemeyi devre dışı bırakır. Uygulamanızdaki bu anahtar yalnızca istemci (dışa giden) bağlantılarını etkiler.

Uygulamanız .NET Framework 4.6.2 veya daha sonraki sürümleri hedefliyorsa, bu anahtar varsayılan olarak false olur. Bu, güvenli bir varsayılan değerdir ve bunu öneririz. Uygulamanız .NET Framework 4.6.2 üzerinde çalışıyorsa, ancak daha önceki bir sürümünü hedefliyorsa, ayar varsayılan olarak true olur. Bu durumda, bunu açıkça olarak falseolarak ayarlamanız gerekir.

DontEnableSchUseStrongCrypto değeri yalnızca güçlü şifrelemeyi desteklemeyen ve yükseltilemeyen eski hizmetlere bağlanmanız gerekiyorsa true olmalıdır.

Switch.System.Net.DontEnableSystemDefaultTlsVersions

false değeri için Switch.System.Net.DontEnableSystemDefaultTlsVersions uygulamanız, işletim sisteminin protokolü seçmesine izin verir. true değeri, uygulamanızın .NET Framework tarafından seçilen protokolleri kullanmasına neden olur.

Uygulamanız .NET Framework 4.7 veya sonraki sürümleri hedefliyorsa, bu anahtar varsayılan değer olarak false ayarlanır. Bu, önerdiğimiz güvenli bir varsayılan değerdir. Uygulamanız .NET Framework 4.7 veya sonraki sürümlerinde çalışıyorsa ancak önceki bir sürümü hedefliyorsa, ayar varsayılan olarak true şeklindedir. Bu durumda, bunu açıkça olarak falseolarak ayarlamanız gerekir.

Windows Kayıt Defteri'nde Schannel protokollerini yapılandırma

İstemci veya sunucu uygulamanızın anlaşma yaptığı protokoller üzerinde ayrıntılı denetim için kayıt defterini kullanabilirsiniz. Uygulamanızın ağı Schannel üzerinden gider (Güvenli Kanal için başka bir addır). Schannel öğesini ayarlayarak uygulamanızın davranışını yapılandırabilirsiniz.

Kayıt defteri anahtarıyla HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols başlayın. Bu anahtarın altında, TLS 1.2kümesinde TLS 1.3herhangi bir alt anahtar oluşturabilirsiniz. Bu alt anahtarların her birinin altında Client ve/veya Server alt anahtarlarını oluşturabilirsiniz. Client ve Server altında DWORD değerlerini DisabledByDefault (0 veya 1) ve Enabled (0 veya 1) oluşturabilirsiniz.

Daha fazla bilgi için bkz. TLS Kayıt Defteri Ayarları - Schannel

SCH_USE_STRONG_CRYPTO bayrağı

Etkinleştirildiğinde (varsayılan olarak veya bir AppContext anahtarla), uygulamanız bir sunucuya TLS bağlantısı başlattığında .NET Framework SCH_USE_STRONG_CRYPTO bayrağını kullanır. .NET Framework, daha iyi birlikte çalışabilirlik için aksi takdirde etkinleştirilebilen bilinen zayıf şifreleme algoritmalarını, şifreleme paketlerini ve TLS/SSL protokolü sürümlerini devre dışı bırakmasını bildirmek için bayrağını Schannel iletir. Daha fazla bilgi için bkz.

SCH_USE_STRONG_CRYPTO veya Schannel numaralandırılmış değerlerini açıkça kullandığınızda, Tls11 bayrağı da istemci (giden) bağlantıları için Tls12SecurityProtocolType ile SslProtocols öğesine geçirilir. SCH_USE_STRONG_CRYPTO Bayrağı yalnızca uygulamanızın istemcinin rolünü üstlendiği bağlantılar için kullanılır. Uygulamalarınız sunucu rolünü üstlendiğinde makine genelinde Schannel kayıt defteri ayarlarını yapılandırarak zayıf protokolleri ve algoritmaları devre dışı bırakabilirsiniz.