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?
- Přímo pomocí System.Net rozhraní API (například System.Net.Http.HttpClient a System.Net.Security.SslStream).
- Přímo pomocí klientů a služeb WCF pomocí System.ServiceModel oboru názvů.
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ší. Zkontrolujte část Auditování kódu , jak ověřit váš
target framework
kód . - Nezadávejte explicitně verzi protokolu TLS, tj. nepoužívejte přetížení
SslStream
metody, které přebírají explicitníSslProtocols
parametr.- Tímto způsobem váš kód umožní operačnímu systému rozhodnout o verzi protokolu TLS.
- Pokud je nutné nastavit ServicePointManager.SecurityProtocol, pak jej nastavte na SecurityProtocolType.SystemDefault. Tím se také použije výchozí operační systém.
- Pokud je nutné použít přetížení
SslStream
metody, které přebírají explicitníSslProtocols
parametr, předejteSslProtocols.SystemDefault
jako argument. Tím se také použije výchozí operační systém.
- Proveďte důkladný audit kódu, abyste ověřili, že explicitně nezadáváte verzi PROTOKOLU TLS nebo SSL.
Upozorňující
Nepoužívejte SslProtocols.Default
, protože nastaví verzi protokolu TLS na PROTOKOL SSL3 a TLS 1.0, které jsou zastaralé.
Když vaše aplikace umožní operačnímu systému zvolit verzi protokolu TLS:
- V budoucnu automaticky využívá nové protokoly TLS přidané.
- Operační systém blokuje protokoly, které nejsou zabezpečené (např. SSL3 a TLS 1.0).
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 TLS 1.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:sslProtocols
konfigurace .
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:sslProtocols
konfigurace .
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 appContextSwitch Switch.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 false
vý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í true
nastavení . 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 true
vý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 AppContext
DontEnableSchUseStrongCrypto
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). Schannel
Konfigurací 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 Server
můž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 AppContext
nebo 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č.