Osvědčené postupy pro protokol TLS (Transport Layer Security) s rozhraním .NET Framework

Poznámka:

Tato stránka obsahuje informace o protokolu TLS rozhraní .NET Framework. Pokud hledáte informace o protokolu TLS .NET, přečtěte si téma: Osvědčené postupy pro protokol TLS/SSL

Rozhraní .NET Framework podporuje použití protokolu TLS (Transport Layer Security) k zabezpečení síťové komunikace.

Co je tls (Transport Layer Security)?

Upozorňující

Protokoly TLS 1.0 a 1.1 jsou RFC8996 zastaralé. Tento dokument se zabývá pouze protokoly TLS 1.2 a TLS 1.3.

Protokol TLS (Transport Layer Security) je oborová nejnovější verze standardu navržená tak, aby chránila soukromí informací předávaných přes internet. TLS 1.3 je standard, který poskytuje vylepšení zabezpečení oproti předchozím verzím. Tento článek obsahuje doporučení k zabezpečení aplikací rozhraní .NET Framework, které používají protokol TLS.

Kdo může tento dokument využít?

Podpora protokolu TLS v rozhraní .NET Framework

Vzhledem k tomu, že rozhraní .NET Framework je závislé na Schannel systému Windows, které verze lze vyjednat a která verze bude použita, závisí na operačním systému.

Tady je aktualizovaná příkladová tabulka zobrazující nejvyšší podporovanou verzi protokolu TLS pro různé kombinace verzí operačního systému a cílových verzí rozhraní .NET Framework:

Cílová verze rozhraní .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

Další informace naleznete v tématu Podpora verze protokolu TLS ve Schannel.

Doporučení

  • Pro protokol TLS 1.3 cíl rozhraní .NET Framework 4.8 nebo novější.
  • Explicitně nezadávejte verzi protokolu TLS. Nakonfigurujte kód tak, aby se operační systém rozhodl o verzi protokolu TLS.
  • Proveďte důkladný audit kódu, abyste ověřili, že explicitně nezadáváte verzi PROTOKOLU TLS nebo SSL.
  • Nepoužívejte SslProtocols.Default. (SslProtocols.Default určuje verzi SSL3 a TLS1.0, která je zastaralá.)

Když vaše aplikace umožní operačnímu systému zvolit verzi protokolu TLS:

  • Automaticky využívá nové protokoly přidané v budoucnu.
  • Operační systém blokuje protokoly, které nejsou zabezpečené.

Oddíl Auditujte kód a proveďte změny kódu, které zahrnují auditování a aktualizaci kódu.

Tento článek vysvětluje, jak povolit nejsilnější zabezpečení dostupné pro verzi rozhraní .NET Framework, na které vaše aplikace cílí a běží. Když aplikace explicitně nastaví protokol zabezpečení a verzi, odhlásí se z jakékoli jiné alternativy a nesouhlasí s výchozím chováním rozhraní .NET Framework a operačního systému. Pokud chcete, aby vaše aplikace mohla vyjednat připojení TLS 1.3, explicitní nastavení na nižší verzi protokolu TLS zabrání připojení TLS 1.3.

Pokud se nemůžete vyhnout explicitní specifikaci verze protokolu, důrazně doporučujeme zadat protokol TLS1.2 nebo TLS 1.3 (což je currently considered secure). Pokyny k identifikaci a odebrání závislostí protokolu TLS 1.0 najdete v dokumentu White Paper o řešení problémů s protokolem TLS 1.0.

WCF podporuje protokol TLS 1.2 jako výchozí v rozhraní .NET Framework 4.7. Počínaje rozhraním .NET Framework 4.7.1 se wcf ve výchozím nastavení nastaví na nakonfigurovanou verzi operačního systému. Pokud je aplikace explicitně nakonfigurovaná SslProtocols.None, WCF při použití přenosu NetTcp používá výchozí nastavení operačního systému.

Dotazy týkající se tohoto dokumentu najdete v osvědčených postupech tls (Transport Layer Security) pro problém GitHubu s rozhraním .NET Framework.

Auditujte kód a proveďte změny kódu.

V případě ASP.NET aplikací zkontrolujte <system.web><httpRuntime targetFramework> prvek web.config a ověřte, že používáte cílovou verzi rozhraní .NET Framework.

Informace o model Windows Forms a dalších aplikacích naleznete v tématu Postupy: Cílení na verzi rozhraní .NET Framework.

Pomocí následujících částí ověřte, že nepoužíváte konkrétní verzi protokolu TLS nebo SSL.

Pokud musíte explicitně nastavit protokol zabezpečení

Pokud musíte explicitně nastavit protokol zabezpečení místo toho, aby .NET nebo operační systém vybral protokol zabezpečení, vyberte tyto protokoly:

  • Pro rozhraní .NET Framework 3.5: TLS 1.2
  • Pro rozhraní .NET Framework 4.6.2 nebo novější: TLS 1.3

Pokud v výčtu nemůžete najít zadané protokoly, můžete je přidat jako příponový soubor. Podívejte se na následující obrázek:

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

Další informace najdete v tématu Podpora výchozích verzí protokolu TLS obsažených v rozhraní .NET Framework 3.5 ve Windows 8.1 a Windows Serveru 2012 R2.

Pro rozhraní API System.Net (HttpClient, SslStream)

Pokud vaše aplikace cílí na rozhraní .NET Framework 4.7 nebo novější verze

Následující části ukazují, jak nakonfigurovat aplikaci tak, aby používala currently considered secure versions protokol TLS. (TLS 1.2, TLS 1.3)

Pro HttpClient a HttpWebRequest

ServicePointManager, pomocí rozhraní .NET Framework 4.7 a novějších verzí bude používat výchozí protokol zabezpečení nakonfigurovaný v operačním systému. Pokud je to možné, chcete-li získat výchozí volbu operačního systému, nenastavujte hodnotu vlastnosti ServicePointManager.SecurityProtocol , která má výchozí hodnotu SecurityProtocolType.SystemDefault.

SecurityProtocolType.SystemDefault Vzhledem k tomu, že nastavení způsobí ServicePointManager použití výchozího protokolu zabezpečení nakonfigurovaného operačním systémem, může vaše aplikace běžet odlišně podle operačního systému, na který běží. Například Windows 10 používá protokol TLS 1.2, zatímco Windows 11 používá protokol TLS 1.3.

Pro SslStream

SslStream, pomocí rozhraní .NET Framework 4.7 a novějších verzí, ve výchozím nastavení operačního systému zvolí nejlepší protokol zabezpečení a verzi. Pokud chcete získat výchozí nejlepší volbu operačního SslStream systému, pokud je to možné, nepoužívejte přetížení metody, které přebírají explicitní SslProtocols parametr. V opačném případě předejte SslProtocols.None. Doporučujeme nepoužívat Default; nastavení SslProtocols.Default vynutí použití PROTOKOLU SSL 3.0 /TLS 1.0 a zabrání protokolu TLS 1.2.

Nenastavujte hodnotu vlastnosti SecurityProtocol (pro sítě HTTP).

Nepoužívejte přetížení SslStream metody, které přebírají explicitní SslProtocols parametr (pro sítě soketů TCP). Při opětovném cílení aplikace na rozhraní .NET Framework 4.7 nebo novější verze budete sledovat doporučení osvědčených postupů.

Pro aplikace WCF

Pokud vaše aplikace cílí na rozhraní .NET Framework 4.7 nebo novější verze

Následující části ukazují, jak nakonfigurovat aplikaci tak, aby používala currently considered secure versions protokol TLS. (TLS 1.2, TLS 1.3)

Použití přenosu TCP pomocí zabezpečení přenosu s přihlašovacími údaji certifikátu

WCF používá stejný síťový zásobník jako zbytek rozhraní .NET Framework.

Pokud cílíte na verzi 4.7.1, služba WCF je nakonfigurovaná tak, aby operační systém ve výchozím nastavení zvolil nejlepší protokol zabezpečení, pokud není explicitně nakonfigurovaný:

  • V konfiguračním souboru aplikace.
  • Nebo ve vaší aplikaci ve zdrojovém kódu.

Ve výchozím nastavení jsou rozhraní .NET Framework 4.7 a novější verze nakonfigurované tak, aby používaly protokol TLS 1.2 a umožňovaly připojení pomocí protokolu TLS 1.1 nebo TLS 1.0. Nakonfigurujte WCF tak, aby operační systém mohl zvolit nejlepší protokol zabezpečení tím, že nakonfiguruje vazbu tak, aby používal SslProtocols.None. To lze nastavit na SslProtocols. SslProtocols.None lze získat přístup z Transport. NetTcpSecurity.Transport lze získat přístup z Security.

Pokud používáte vlastní vazbu:

  • Nakonfigurujte WCF tak, aby operační systém mohl zvolit nejlepší protokol zabezpečení nastavením SslProtocols pro použití SslProtocols.None.
  • Nebo nakonfigurujte protokol použitý s cestou system.serviceModel/bindings/customBinding/binding/sslStreamSecurity:sslProtocolskonfigurace .

Pokud nepoužíváte vlastní vazbu a nastavujete vazbu WCF pomocí konfigurace, nastavte protokol použitý s cestou system.serviceModel/bindings/netTcpBinding/binding/security/transport:sslProtocolskonfigurace .

Použití zabezpečení zpráv s přihlašovacími údaji certifikátu

Rozhraní .NET Framework 4.7 a novější verze ve výchozím nastavení používají protokol zadaný ve SecurityProtocol vlastnosti. Pokud je appContextSwitchSwitch.System.ServiceModel.DisableUsingServicePointManagerSecurityProtocols nastaven na true, WCF zvolí nejlepší protokol až TLS 1.0.

Pokud vaše aplikace cílí na verzi rozhraní .NET Framework starší než 4.7

Následující části ukazují, jak nakonfigurovat aplikaci tak, aby používala currently considered secure versions protokol TLS. (TLS 1.2, TLS 1.3)

Použití rozhraní .NET Framework 4.6.2 pomocí zabezpečení přenosu TCP s přihlašovacími údaji certifikátu

Architektura WCF automaticky zvolí nejvyšší dostupný protokol až TLS 1.2, pokud explicitně nenakonfigurujete verzi protokolu. Další informace najdete v předchozí části Pro přenos WCF TCP pomocí zabezpečení přenosu s přihlašovacími údaji certifikátu.

Použití rozhraní .NET Framework 3.5 pomocí zabezpečení přenosu TCP s přihlašovacími údaji certifikátu

Tyto verze architektury WCF jsou explicitně určeny pro použití hodnot SSL 3.0 a TLS 1.0. Tyto hodnoty nelze změnit. Abyste mohli používat protokol TLS 1.2, musíte aktualizovat a změnit cílení na rozhraní NET Framework 4.6.2 nebo novější.

Konfigurace zabezpečení pomocí přepínačů AppContext (pro rozhraní .NET Framework 4.6.2 nebo novější verze)

Přepínače AppContext popsané v této části jsou relevantní, pokud vaše aplikace cílí nebo běží na rozhraní .NET Framework 4.6.2 nebo novějších verzích. Bez ohledu na to, jestli jsou ve výchozím nastavení nebo explicitně nastaveny, by přepínače měly být false , pokud je to možné. Pokud chcete nakonfigurovat zabezpečení pomocí jednoho nebo obou přepínačů, nezadávejte v kódu hodnotu protokolu zabezpečení; tím by se přepsaly přepínače(y).

Pro rozhraní API System.Net (HttpClient, SslStream)

Přepínače mají stejný účinek bez ohledu na to, jestli provádíte sítě HTTP (ServicePointManager) nebo sítě soketů TCP (SslStream).

Switch.System.Net.DontEnableSchUseStrongCrypto

Hodnota, Switch.System.Net.DontEnableSchUseStrongCrypto která false způsobí, že vaše aplikace bude používat silnou kryptografii. Hodnota pro DontEnableSchUseStrongCrypto použití bezpečnějších síťových false protokolů (TLS 1.2 a TLS 1.1) a blokuje protokoly, které nejsou zabezpečené. Další informace najdete v SCH_USE_STRONG_CRYPTO příznaku. Hodnota zákazu true silné kryptografie pro vaši aplikaci. Tento přepínač má vliv jenom na klientská (odchozí) připojení ve vaší aplikaci.

Pokud vaše aplikace cílí na rozhraní .NET Framework 4.6.2 nebo novější verze, přepněte na falsevýchozí hodnotu . To je bezpečné výchozí nastavení, které doporučujeme. Pokud vaše aplikace běží na rozhraní .NET Framework 4.6.2, ale cílí na starší verzi, přepněte výchozí truenastavení . V takovém případě byste ji měli explicitně nastavit na false.

DontEnableSchUseStrongCrypto měla by mít hodnotu true pouze v případě, že se potřebujete připojit ke starším službám, které nepodporují silnou kryptografii a nedají se upgradovat.

Switch.System.Net.DontEnableSystemDefaultTlsVersions

Hodnota, Switch.System.Net.DontEnableSystemDefaultTlsVersions která false způsobí, že aplikace umožní operačnímu systému zvolit protokol. Hodnota true způsobí, že vaše aplikace bude používat protokoly vybrané rozhraním .NET Framework.

Pokud vaše aplikace cílí na rozhraní .NET Framework 4.7 nebo novější verze, přepne se výchozí hodnota na false. To je bezpečné výchozí nastavení, které doporučujeme. Pokud vaše aplikace běží na rozhraní .NET Framework 4.7 nebo novějších verzích, ale cílí na starší verzi, přepínač se nastaví jako truevýchozí . V takovém případě byste ji měli explicitně nastavit na false.

Pro aplikace WCF

Switch.System.ServiceModel.DisableUsingServicePointManagerSecurityProtocols

Hodnota false pro Switch.System.ServiceModel.DisableUsingServicePointManagerSecurityProtocols příčiny, že vaše aplikace použije hodnotu definovanou pro ServicePointManager.SecurityProtocols zabezpečení zpráv pomocí přihlašovacích údajů certifikátu. Hodnota použití nejvyššího dostupného true protokolu až TLS1.0

U aplikací, které cílí na rozhraní .NET Framework 4.7 a novější verze, je tato hodnota výchozí hodnotou false. U aplikací, které cílí na rozhraní .NET Framework 4.6.2 a starší, je tato hodnota výchozí hodnotou true.

Switch.System.ServiceModel.DontEnableSystemDefaultTlsVersions

Hodnota false pro Switch.System.ServiceModel.DontEnableSystemDefaultTlsVersions nastavení výchozí konfigurace, která operačnímu systému umožní zvolit protokol. Hodnota true nastaví výchozí hodnotu na nejvyšší dostupný protokol až TLS1.2.

Pro aplikace, které cílí na rozhraní .NET Framework 4.7.1 a novější verze, je tato hodnota výchozí hodnotou false. U aplikací, které cílí na rozhraní .NET Framework 4.7 a starší, je tato hodnota výchozí hodnotou true.

Další informace o protokolech TLS naleznete v tématu Omezení rizik: Protokoly TLS. Další informace o AppContext přepínačích naleznete v tématu <AppContextSwitchOverrides> Element.

Konfigurace zabezpečení prostřednictvím registru Systému Windows

Upozorňující

Nastavení klíčů registru má vliv na všechny aplikace v systému. Tuto možnost použijte pouze v případě, že máte úplnou kontrolu nad počítačem a můžete řídit změny registru.

Pokud nastavení jednoho nebo obou AppContext přepínačů není možné, můžete řídit protokoly zabezpečení, které vaše aplikace používá s klíči registru Windows popsanými v této části. Pokud vaše aplikace běží na rozhraní .NET Framework 3.5 nebo pokud nemůžete konfigurační soubor upravit, možná nebudete moct použít jeden nebo oba AppContext přepínače. Pokud chcete nakonfigurovat zabezpečení s registrem, nezadávejte v kódu hodnotu protokolu zabezpečení; tím se přepíše nastavení registru.

Názvy klíčů registru se podobají názvům odpovídajících AppContext přepínačů, ale bez DontEnable předpřipraveného názvu. Přepínač je například AppContextDontEnableSchUseStrongCrypto klíč registru s názvem SchUseStrongCrypto.

Tyto klíče jsou k dispozici ve všech verzích rozhraní .NET Framework.

Všechny níže popsané klíče registru mají stejný účinek, jestli provádíte sítě HTTP (ServicePointManager) nebo sítě soketů TCP (SslStream).

SchUseStrongCrypto

Položka HKEY_LOCAL_MACHINE\SOFTWARE\[Wow6432Node\]Microsoft\.NETFramework\<VERSION>: SchUseStrongCrypto registru má hodnotu typu DWORD. Hodnota 1 způsobí, že vaše aplikace bude používat silnou kryptografii. Silná kryptografie používá bezpečnější síťové protokoly (TLS 1.2 a TLS 1.1) a blokuje protokoly, které nejsou zabezpečené. Hodnota 0 zakáže silnou kryptografii. Další informace naleznete v části Příznak SCH_USE_STRONG_CRYPTO. Toto nastavení registru má vliv jenom na klientská (odchozí) připojení ve vaší aplikaci.

Pokud vaše aplikace cílí na rozhraní .NET Framework 4.6 nebo novější verze, bude tento klíč výchozí hodnotou 1. To je bezpečné výchozí nastavení, které doporučujeme. Pokud vaše aplikace cílí na rozhraní .NET Framework 4.5.2 nebo starší verze, je výchozí hodnota klíče 0. V takovém případě byste měli explicitně nastavit jeho hodnotu na 1.

Tento klíč by měl mít hodnotu 0 jenom v případě, že se potřebujete připojit ke starším službám, které nepodporují silnou kryptografii a nejde je upgradovat.

SystemDefaultTlsVersions

Položka HKEY_LOCAL_MACHINE\SOFTWARE\[Wow6432Node\]Microsoft\.NETFramework\<VERSION>: SystemDefaultTlsVersions registru má hodnotu typu DWORD. Hodnota 1 způsobí, že aplikace umožní operačnímu systému zvolit protokol. Hodnota 0 způsobí, že aplikace bude používat protokoly vybrané rozhraním .NET Framework.

<VERSION> musí být v4.0.30319 (pro .NET Framework 4 a novější) nebo v2.0.50727 (pro .NET Framework 3.5).

Pokud vaše aplikace cílí na rozhraní .NET Framework 4.7 nebo novější verze, bude tento klíč výchozí hodnotou 1. To je bezpečné výchozí nastavení, které doporučujeme. Pokud vaše aplikace cílí na rozhraní .NET Framework 4.6.1 nebo starší verze, výchozí hodnota klíče je 0. V takovém případě byste měli explicitně nastavit jeho hodnotu na 1.

Další informace najdete v tématu Kumulativní aktualizace pro Windows 10 verze 1511 a Windows Server 2016 Technical Preview 4: 10. května 2016.

Další informace o rozhraní .NET Framework 3.5.1 naleznete v tématu Podpora výchozích verzí protokolu TLS zahrnutých v rozhraní .NET Framework 3.5.1 ve Windows 7 SP1 a Server 2008 R2 SP1.

Následuje . Soubor REG nastaví položky registru a jejich varianty na nejbezpečnější hodnoty:

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

Konfigurace protokolů Schannel v registru Windows

Registr můžete použít k jemně odstupňované kontrole protokolů, které klient nebo serverová aplikace vyjedná. Sítě vaší aplikace procházejí přes Schannel (což je jiný název zabezpečeného kanálu). SchannelKonfigurací můžete nakonfigurovat chování aplikace.

Začněte klíčem HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols registru. Pod tímto klíčem můžete vytvořit libovolné podklíče v sadě TLS 1.2, TLS 1.3. Pod každým z těchto podklíčů můžete vytvořit podklíče Client a/nebo Server. V Client části a Servermůžete vytvořit hodnoty DisabledByDefault DWORD (0 nebo 1) a Enabled (0 nebo 1).

Další informace najdete v tématu: Nastavení registru TLS – Schannel

Příznak SCH_USE_STRONG_CRYPTO

Pokud je povolená (ve výchozím nastavení přepínačem AppContextnebo registrem Windows), rozhraní .NET Framework použije SCH_USE_STRONG_CRYPTO příznak, když vaše aplikace inicializuje připojení TLS k serveru. Rozhraní .NET Framework předá příznak pokyn, aby Schannel zakázal známé slabé kryptografické algoritmy, šifrovací sady a verze protokolu TLS/SSL, které by jinak mohly být povoleny pro lepší interoperabilitu. Další informace naleznete v tématu:

Příznak SCH_USE_STRONG_CRYPTO se také předává Schannel pro klientská (odchozí) připojení, když explicitně použijete Tls11 nebo Tls12 vyčíslíte hodnoty SecurityProtocolType nebo SslProtocols. Příznak SCH_USE_STRONG_CRYPTO se používá pouze pro připojení, kde vaše aplikace funguje jako role klienta. Slabé protokoly a algoritmy můžete zakázat, když vaše aplikace fungují jako role serveru konfigurací nastavení registru pro celý Schannel počítač.