Transport Layer Security (TLS) — najlepsze rozwiązania dotyczące .NET FrameworkTransport Layer Security (TLS) best practices with the .NET Framework

Protokół Transport Layer Security (TLS) jest standardem branżowym, który umożliwia ochronę prywatności informacji przekazywanych przez Internet.The Transport Layer Security (TLS) protocol is an industry standard designed to help protect the privacy of information communicated over the Internet. TLS 1,2 to standard, który zapewnia lepsze zabezpieczenia w porównaniu z poprzednimi wersjami.TLS 1.2 is a standard that provides security improvements over previous versions. Protokół TLS 1,2 zostanie ostatecznie zastąpiony przez najnowszy opublikowany standard TLS 1,3 , który jest szybszy i ma ulepszone zabezpieczenia.TLS 1.2 will eventually be replaced by the newest released standard TLS 1.3 which is faster and has improved security. W tym artykule przedstawiono zalecenia dotyczące zabezpieczania .NET Framework aplikacji korzystających z protokołu TLS.This article presents recommendations to secure .NET Framework applications that use the TLS protocol.

Aby zapewnić, że aplikacje .NET Framework pozostają bezpieczne, wersja protokołu TLS nie powinna być stałe.To ensure .NET Framework applications remain secure, the TLS version should not be hardcoded. Aplikacje .NET Framework powinny używać wersji protokołu TLS obsługiwanej przez system operacyjny (OS)..NET Framework applications should use the TLS version the operating system (OS) supports.

Ten dokument jest przeznaczony dla deweloperów, którzy są:This document targets developers who are:

Zalecamy wykonanie następujących czynności:We recommend that you:

  • Docelowa wersja .NET Framework 4,7 lub nowsza w aplikacjach.Target .NET Framework 4.7 or later versions on your apps. Docelowa .NET Framework 4.7.1 lub nowsza wersja w aplikacjach WCF.Target .NET Framework 4.7.1 or later versions on your WCF apps.
  • Nie określaj wersji protokołu TLS.Do not specify the TLS version. Skonfiguruj kod, aby umożliwić systemowi operacyjnemu podjęcie decyzji dotyczącej wersji protokołu TLS.Configure your code to let the OS decide on the TLS version.
  • Wykonaj gruntowną inspekcję kodu, aby sprawdzić, czy nie określono wersji protokołu TLS lub SSL.Perform a thorough code audit to verify you're not specifying a TLS or SSL version.

Gdy aplikacja umożliwia systemowi operacyjnemu wybór wersji protokołu TLS:When your app lets the OS choose the TLS version:

  • Automatycznie wykorzystuje nowe protokoły dodane w przyszłości, takie jak TLS 1,3.It automatically takes advantage of new protocols added in the future, such as TLS 1.3.
  • System operacyjny blokuje protokoły, które nie są bezpieczne.The OS blocks protocols that are discovered not to be secure.

Sekcja inspekcji kodu i wprowadzania zmian w kodzie obejmuje inspekcję i aktualizowanie kodu.The section Audit your code and make code changes covers auditing and updating your code.

W tym artykule wyjaśniono, jak włączyć najwyższe zabezpieczenia dostępne dla wersji .NET Framework, w której aplikacja jest przeznaczona do działania.This article explains how to enable the strongest security available for the version of the .NET Framework that your app targets and runs on. Gdy aplikacja jawnie ustawia protokół zabezpieczeń i wersję, nie jest ona zależna od żadnej innej alternatywy i powoduje, że .NET Framework i domyślne zachowanie systemu operacyjnego.When an app explicitly sets a security protocol and version, it opts out of any other alternative, and opts out of .NET Framework and OS default behavior. Jeśli chcesz, aby aplikacja mogła negocjować połączenie TLS 1,2, jawnie ustawienie niższej wersji protokołu TLS uniemożliwia połączenie TLS 1,2.If you want your app to be able to negotiate a TLS 1.2 connection, explicitly setting to a lower TLS version prevents a TLS 1.2 connection.

Jeśli nie możesz uniknąć zakodowana wersji protokołu, zdecydowanie zalecamy określenie protokołu TLS 1,2.If you can't avoid hardcoding a protocol version, we strongly recommend that you specify TLS 1.2. Aby uzyskać wskazówki dotyczące identyfikowania i usuwania zależności TLS 1,0, Pobierz oficjalny dokument dotyczący problemu z protokołem tls 1,0 .For guidance on identifying and removing TLS 1.0 dependencies, download the Solving the TLS 1.0 Problem white paper.

Program WCF obsługuje protokoły TLS 1.0, 1,1 i 1,2 jako domyślne w .NET Framework 4,7.WCF Supports TLS1.0, 1.1 and 1.2 as the default in .NET Framework 4.7. Począwszy od .NET Framework 4.7.1, program WCF domyślnie używa skonfigurowanej wersji systemu operacyjnego.Starting with .NET Framework 4.7.1, WCF defaults to the operating system configured version. Jeśli aplikacja jest jawnie skonfigurowana za pomocą programu SslProtocols.None , WCF używa domyślnego ustawienia systemu operacyjnego w przypadku korzystania z transportu NetTcp.If an application is explicitly configured with SslProtocols.None, WCF uses the operating system default setting when using the NetTcp transport.

Pytania dotyczące tego dokumentu można zadawać w Transport Layer Security z najlepszymi rozwiązaniamizwiązanymi z PROTOKOŁem TLS, .NET Framework.You can ask questions about this document in the GitHub issue Transport Layer Security (TLS) best practices with the .NET Framework.

Inspekcja kodu i wprowadzanie zmian w kodzieAudit your code and make code changes

W przypadku aplikacji ASP.NET Sprawdź, <system.web><httpRuntime targetFramework> czy element web.config , aby sprawdzić, czy korzystasz z zamierzonej wersji .NET Framework.For ASP.NET applications, inspect the <system.web><httpRuntime targetFramework> element of web.config to verify you're using the intended version of the .NET Framework.

Aby uzyskać Windows Forms i inne aplikacje, zobacz How to: Target a Version of the .NET Framework.For Windows Forms and other applications, see How to: Target a Version of the .NET Framework.

Skorzystaj z poniższych sekcji, aby sprawdzić, czy nie używasz określonej wersji protokołu TLS lub SSL.Use the following sections to verify you're not using a specific TLS or SSL version.

Jeśli aplikacja jest przeznaczona dla .NET Framework 4,7 lub nowszych wersjiIf your app targets .NET Framework 4.7 or later versions

W poniższych sekcjach pokazano, jak sprawdzić, czy nie jest używana określona wersja protokołu TLS lub SSL.The following sections show how to verify you're not using a specific TLS or SSL version.

Dla sieci HTTPFor HTTP networking

ServicePointManagerprzy użyciu .NET Framework 4,7 i nowszych wersji program użyje domyślnego protokołu zabezpieczeń skonfigurowanego w systemie operacyjnym.ServicePointManager, using .NET Framework 4.7 and later versions, will use the default security protocol configured in the OS. Aby wybrać domyślny wybór systemu operacyjnego, jeśli to możliwe, nie ustawiaj wartości ServicePointManager.SecurityProtocol właściwości, która domyślnie SecurityProtocolType.SystemDefault .To get the default OS choice, if possible, don't set a value for the ServicePointManager.SecurityProtocol property, which defaults to SecurityProtocolType.SystemDefault.

Ponieważ to SecurityProtocolType.SystemDefault ustawienie powoduje ServicePointManager użycie domyślnego protokołu zabezpieczeń skonfigurowanego przez system operacyjny, aplikacja może działać w różny sposób w zależności od systemu operacyjnego, w którym jest uruchamiany.Because the SecurityProtocolType.SystemDefault setting causes the ServicePointManager to use the default security protocol configured by the operating system, your application may run differently based on the OS it's run on. Na przykład system Windows 7 z dodatkiem SP1 korzysta z protokołu TLS 1,0, podczas gdy system Windows 8 i system Windows 10 używają protokołu TLS 1,2.For example, Windows 7 SP1 uses TLS 1.0 while Windows 8 and Windows 10 use TLS 1.2.

Pozostała część tego artykułu nie ma znaczenia w przypadku .NET Framework 4,7 lub nowszych wersji dla sieci HTTP.The remainder of this article is not relevant when targeting .NET Framework 4.7 or later versions for HTTP networking.

Dla sieci TCP SocketsFor TCP sockets networking

SslStreamprzy użyciu .NET Framework 4,7 i nowszych wersji, domyślny system operacyjny wybiera najlepszy protokół zabezpieczeń i wersję.SslStream, using .NET Framework 4.7 and later versions, defaults to the OS choosing the best security protocol and version. Aby uzyskać domyślny najlepszy wybór systemu operacyjnego, jeśli jest to możliwe, nie używaj przeciążeń metody, SslStream które pobierają jawny SslProtocols parametr.To get the default OS best choice, if possible, don't use the method overloads of SslStream that take an explicit SslProtocols parameter. W przeciwnym razie Przekaż SslProtocols.None .Otherwise, pass SslProtocols.None. Zalecamy, aby nie używać Default ; ustawienie SslProtocols.Default wymusza użycie protokołu SSL 3,0/TLS 1,0 i zapobiega 1,2 protokołu TLS.We recommend that you don't use Default; setting SslProtocols.Default forces the use of SSL 3.0 /TLS 1.0 and prevents TLS 1.2.

Nie ustawiaj wartości SecurityProtocol właściwości (dla sieci http).Don't set a value for the SecurityProtocol property (for HTTP networking).

Nie używaj przeciążeń metody SslStream , które pobierają jawny SslProtocols parametr (dla sieci TCP Sockets).Don't use the method overloads of SslStream that take an explicit SslProtocols parameter (for TCP sockets networking). Po przekierowaniu aplikacji do wersji .NET Framework 4,7 lub nowszej należy wykonać zalecenie dotyczące najlepszych rozwiązań.When you retarget your app to .NET Framework 4.7 or later versions, you'll be following the best practices recommendation.

Pozostała część tego tematu nie ma znaczenia w przypadku .NET Framework 4,7 lub nowszych wersji dla sieci TCP Sockets.The remainder of this topic is not relevant when targeting .NET Framework 4.7 or later versions for TCP sockets networking.

W przypadku transportu TCP WCF przy użyciu zabezpieczeń transportu z poświadczeniami certyfikatówFor WCF TCP transport using transport security with certificate credentials

Funkcja WCF używa tego samego stosu sieciowego co reszta .NET Framework.WCF uses the same networking stack as the rest of the .NET Framework.

Jeśli celem jest 4.7.1, platforma WCF jest skonfigurowana tak, aby system operacyjny domyślnie wybierał najlepszy protokół zabezpieczeń, chyba że jest on jawnie skonfigurowany:If you are targeting 4.7.1, WCF is configured to allow the OS to choose the best security protocol by default unless explicitly configured:

  • W pliku konfiguracyjnym aplikacji.In your application configuration file.
  • Lub, w aplikacji w kodzie źródłowym.Or, in your application in the source code.

Domyślnie .NET Framework 4,7 i nowsze wersje są skonfigurowane do korzystania z protokołu TLS 1,2 i umożliwiają nawiązywanie połączeń przy użyciu protokołu TLS 1,1 lub TLS 1,0.By default, .NET Framework 4.7 and later versions is configured to use TLS 1.2 and allows connections using TLS 1.1 or TLS 1.0. Skonfiguruj funkcję WCF, aby umożliwić systemowi operacyjnemu wybranie najlepszego protokołu zabezpieczeń przez skonfigurowanie powiązania do użycia SslProtocols.None .Configure WCF to allow the OS to choose the best security protocol by configuring your binding to use SslProtocols.None. To ustawienie można ustawić na SslProtocols .This can be set on SslProtocols. SslProtocols.None dostęp do programu Transport .SslProtocols.None can be accessed from Transport. NetTcpSecurity.Transport dostęp do programu Security .NetTcpSecurity.Transport can be accessed from Security.

Jeśli używasz niestandardowego powiązania:If you're using a custom binding:

  • Skonfiguruj program WCF, aby umożliwić systemowi operacyjnemu wybranie najlepszego protokołu zabezpieczeń przez ustawienie SslProtocols do użycia SslProtocols.None .Configure WCF to allow the OS to choose the best security protocol by setting SslProtocols to use SslProtocols.None.
  • Lub Skonfiguruj protokół używany z ścieżką konfiguracyjną system.serviceModel/bindings/customBinding/binding/sslStreamSecurity:sslProtocols .Or configure the protocol used with the configuration path system.serviceModel/bindings/customBinding/binding/sslStreamSecurity:sslProtocols.

Jeśli nie korzystasz z niestandardowego powiązania i tworzysz powiązanie WCF przy użyciu konfiguracji, ustaw protokół używany ze ścieżką konfiguracyjną system.serviceModel/bindings/netTcpBinding/binding/security/transport:sslProtocols .If you're not using a custom binding and you're setting your WCF binding using configuration, set the protocol used with the configuration path system.serviceModel/bindings/netTcpBinding/binding/security/transport:sslProtocols.

W przypadku zabezpieczeń komunikatów WCF przy użyciu poświadczeń certyfikatuFor WCF Message Security with certificate credentials

.NET Framework 4,7 i nowsze wersje domyślnie korzystają z protokołu określonego we SecurityProtocol właściwości..NET Framework 4.7 and later versions by default uses the protocol specified in the SecurityProtocol property. Gdy AppContextSwitch Switch.System.ServiceModel.DisableUsingServicePointManagerSecurityProtocols jest ustawiona na true , WCF wybiera najlepszy protokół, do TLS 1,0.When the AppContextSwitch Switch.System.ServiceModel.DisableUsingServicePointManagerSecurityProtocols is set to true, WCF chooses the best protocol, up to TLS 1.0.

Jeśli aplikacja jest przeznaczona dla .NET Framework wersji wcześniejszej niż 4,7If your app targets a .NET Framework version earlier than 4.7

Przeprowadź inspekcję kodu, aby upewnić się, że nie skonfigurowano określonej wersji protokołu TLS lub SSL, korzystając z następujących sekcji:Audit your code to verify you're not setting a specific TLS or SSL version using the following sections:

Dla .NET Framework 4,6 — 4.6.2, a nie WCFFor .NET Framework 4.6 - 4.6.2 and not WCF

Ustaw DontEnableSystemDefaultTlsVersions AppContext przełącznik na false .Set the DontEnableSystemDefaultTlsVersions AppContext switch to false. Zobacz Konfigurowanie zabezpieczeń za pomocą przełączników AppContext.See Configuring security via AppContext switches.

W przypadku WCF przy użyciu .NET Framework 4,6 4.6.2 przy użyciu zabezpieczeń transportu TCP z poświadczeniami certyfikatówFor WCF using .NET Framework 4.6 - 4.6.2 using TCP transport security with Certificate Credentials

Należy zainstalować najnowsze poprawki systemu operacyjnego.You must install the latest OS patches. Zobacz aktualizacje zabezpieczeń.See Security updates.

Platforma WCF automatycznie wybiera najwyższy dostęp do protokołu TLS 1,2, chyba że jawnie skonfigurujesz wersję protokołu.The WCF framework automatically chooses the highest protocol available up to TLS 1.2 unless you explicitly configure a protocol version. Aby uzyskać więcej informacji, zobacz poprzednią sekcję dotyczącą transportu TCP WCF przy użyciu zabezpieczeń transportu z poświadczeniami certyfikatów.For more information, see the preceding section For WCF TCP transport using transport security with certificate credentials.

Dla .NET Framework 3,5-4.5.2 i nie WCFFor .NET Framework 3.5 - 4.5.2 and not WCF

Zalecamy uaktualnienie aplikacji .NET Framework do wersji 4,7 lub nowszej.We recommend you upgrade your app to .NET Framework 4.7 or later versions. Jeśli nie możesz przeprowadzić uaktualnienia, wykonaj następujące czynności.If you cannot upgrade, take the following steps.

Ustaw klucze rejestru schusestrongcrypto we i SystemDefaultTlsVersions na 1.Set the SchUseStrongCrypto and SystemDefaultTlsVersions registry keys to 1. Zobacz Konfigurowanie zabezpieczeń za pośrednictwem rejestru systemu Windows.See Configuring security via the Windows Registry. .NET Framework wersja 3,5 obsługuje SchUseStrongCrypto flagę tylko wtedy, gdy jest przenoszona jawna wartość TLS.The .NET Framework version 3.5 supports the SchUseStrongCrypto flag only when an explicit TLS value is passed.

W przypadku korzystania z programu na .NET Framework 3,5 należy zainstalować gorącą poprawkę, aby protokół TLS 1,2 można było określić w programie:If you are running on .NET Framework 3.5, you need to install a hot patch so that TLS 1.2 can be specified by your program:

KB3154518KB3154518 Zestawienie niezawodności HR-1605 — obsługa domyślnych wersji systemu TLS uwzględnionych w .NET Framework 3.5.1 w systemach Windows 7 z dodatkiem SP1 i Server 2008 R2 z dodatkiem SP1Reliability Rollup HR-1605 - Support for TLS System Default Versions included in the .NET Framework 3.5.1 on Windows 7 SP1 and Server 2008 R2 SP1
KB3154519KB3154519 Zestawienie niezawodności HR-1605 — obsługa domyślnych wersji systemu TLS uwzględnionych w .NET Framework 3,5 w systemie Windows Server 2012Reliability Rollup HR-1605 - Support for TLS System Default Versions included in the .NET Framework 3.5 on Windows Server 2012
KB3154520KB3154520 Zestawienie niezawodności HR-1605 — obsługa domyślnych wersji systemu TLS uwzględnionych w .NET Framework 3,5 w systemach Windows 8.1 i Windows Server 2012 R2Reliability Rollup HR-1605 -Support for TLS System Default Versions included in the .NET Framework 3.5 on Windows 8.1 and Windows Server 2012 R2
KB3156421KB3156421 1605 pakiet zbiorczy poprawek 3154521 dla .NET Framework 4.5.2 i 4.5.1 w systemie Windows1605 Hotfix rollup 3154521 for the .NET Framework 4.5.2 and 4.5.1 on Windows

W przypadku WCF przy użyciu .NET Framework 3,5-4.5.2 przy użyciu zabezpieczeń transportu TCP z poświadczeniami certyfikatówFor WCF using .NET Framework 3.5 - 4.5.2 using TCP transport security with Certificate Credentials

Te wersje struktury WCF są stałe do używania wartości SSL 3,0 i TLS 1,0.These versions of the WCF framework are hardcoded to use values SSL 3.0 and TLS 1.0. Tych wartości nie można zmienić.These values cannot be changed. Aby korzystać z protokołu TLS 1,1 i 1,2, należy zaktualizować i przekierować do wersji .NET Framework 4,6 lub nowszej.You must update and retarget to NET Framework 4.6 or later versions to use TLS 1.1 and 1.2.

Jeśli aplikacja jest przeznaczona .NET Framework 3,5If your app targets .NET Framework 3.5

Jeśli musisz jawnie ustawić protokół zabezpieczeń zamiast zezwalać na .NET lub system operacyjny wybierze protokół zabezpieczeń, Dodaj SecurityProtocolTypeExtensions i SslProtocolsExtension wyliczenia do kodu.If you must explicitly set a security protocol instead of letting .NET or the OS pick the security protocol, add SecurityProtocolTypeExtensions and SslProtocolsExtension enumerations to your code. SecurityProtocolTypeExtensions i SslProtocolsExtension Dołącz wartości dla Tls12 , Tls11 i SystemDefault wartości.SecurityProtocolTypeExtensions and SslProtocolsExtension include values for Tls12, Tls11, and the SystemDefault value. Aby uzyskać więcej informacji, zobacz Obsługa domyślnych wersji systemu TLS uwzględnionych w .NET Framework 3,5 w systemach Windows 8.1 i Windows Server 2012 R2.For more information, see Support for TLS System Default Versions included in .NET Framework 3.5 on Windows 8.1 and Windows Server 2012 R2.

Konfigurowanie zabezpieczeń za pomocą przełączników AppContext (dla .NET Framework 4,6 lub nowszych)Configuring security via AppContext switches (for .NET Framework 4.6 or later versions)

Przełączniki AppContext opisane w tej sekcji są istotne w przypadku, gdy aplikacja jest docelowa lub działa w .NET Framework 4,6 lub nowszych.The AppContext switches described in this section are relevant if your app targets, or runs on, .NET Framework 4.6 or later versions. Niezależnie od tego, czy są one domyślnie, czy przez ustawienie jawnie, przełączniki powinny być, false Jeśli jest to możliwe.Whether by default, or by setting them explicitly, the switches should be false if possible. Jeśli chcesz skonfigurować zabezpieczenia za pomocą jednego lub obu przełączników, nie określaj wartości protokołu zabezpieczeń w kodzie; wykonanie tej operacji spowodowałoby przesłonięcie przełączników.If you want to configure security via one or both switches, then don't specify a security protocol value in your code; doing so would override the switch(es).

Przełączniki mają ten sam efekt, niezależnie od tego, czy są używane sieci HTTP ( ServicePointManager ) czy TCP Sockets Networking ( SslStream ).The switches have the same effect whether you're doing HTTP networking (ServicePointManager) or TCP sockets networking (SslStream).

Switch.System .NET. DontEnableSchUseStrongCryptoSwitch.System.Net.DontEnableSchUseStrongCrypto

Wartość false dla powoduje, Switch.System.Net.DontEnableSchUseStrongCrypto że aplikacja korzysta z mocnej kryptografii.A value of false for Switch.System.Net.DontEnableSchUseStrongCrypto causes your app to use strong cryptography. Wartość false dla programu DontEnableSchUseStrongCrypto używa bezpieczniejszych protokołów sieciowych (TLS 1,2, TLS 1,1 i TLS 1,0) i blokuje protokoły, które nie są bezpieczne.A value of false for DontEnableSchUseStrongCrypto uses more secure network protocols (TLS 1.2, TLS 1.1, and TLS 1.0) and blocks protocols that are not secure. Aby uzyskać więcej informacji, zobacz flagę SCH_USE_STRONG_CRYPTO.For more info, see The SCH_USE_STRONG_CRYPTO flag. Wartość true wyłącza silne kryptografie dla aplikacji.A value of true disables strong cryptography for your app.

Jeśli aplikacja jest przeznaczona dla .NET Framework 4,6 lub nowszej wersji, ten przełącznik jest domyślny false .If your app targets .NET Framework 4.6 or later versions, this switch defaults to false. Jest to bezpieczne ustawienie domyślne, które zalecamy.That's a secure default, which we recommend. Jeśli aplikacja działa na .NET Framework 4,6, ale jest przeznaczona dla starszej wersji, przełącznik domyślnie przyjmuje wartość true .If your app runs on .NET Framework 4.6, but targets an earlier version, the switch defaults to true. W takim przypadku należy jawnie ustawić ją na false .In that case, you should explicitly set it to false.

DontEnableSchUseStrongCrypto powinna mieć wartość tylko wtedy, true gdy konieczne jest nawiązanie połączenia ze starszymi usługami, które nie obsługują mocnej kryptografii i nie można jej uaktualnić.DontEnableSchUseStrongCrypto should only have a value of true if you need to connect to legacy services that don't support strong cryptography and can't be upgraded.

Switch.System .NET. DontEnableSystemDefaultTlsVersionsSwitch.System.Net.DontEnableSystemDefaultTlsVersions

Wartość false dla Switch.System.Net.DontEnableSystemDefaultTlsVersions powoduje, że aplikacja zezwala na wybór protokołu przez system operacyjny.A value of false for Switch.System.Net.DontEnableSystemDefaultTlsVersions causes your app to allow the operating system to choose the protocol. Wartość powoduje, true że aplikacja będzie używać protokołów pobranych przez .NET Framework.A value of true causes your app to use protocols picked by the .NET Framework.

Jeśli aplikacja jest przeznaczona dla .NET Framework 4,7 lub nowszej wersji, ten przełącznik jest domyślny false .If your app targets .NET Framework 4.7 or later versions, this switch defaults to false. Jest to bezpieczne domyślne zalecane przez nas.That's a secure default that we recommend. Jeśli aplikacja działa w .NET Framework 4,7 lub w nowszej wersji, ale jest przeznaczona dla starszej wersji, przełącznik domyślnie przyjmuje wartość true .If your app runs on .NET Framework 4.7 or later versions, but targets an earlier version, the switch defaults to true. W takim przypadku należy jawnie ustawić ją na false .In that case, you should explicitly set it to false.

Switch.System ServiceModel. DisableUsingServicePointManagerSecurityProtocolsSwitch.System.ServiceModel.DisableUsingServicePointManagerSecurityProtocols

Wartość false dla Switch.System.ServiceModel.DisableUsingServicePointManagerSecurityProtocols powoduje, że aplikacja korzysta z wartości zdefiniowanej w polu ServicePointManager.SecurityProtocols zabezpieczenia komunikatów przy użyciu poświadczeń certyfikatu.A value of false for Switch.System.ServiceModel.DisableUsingServicePointManagerSecurityProtocols causes your application to use the value defined in ServicePointManager.SecurityProtocols for message security using certificate credentials. Wartość true używa najwyższego dostępnego protokołu, do TLS 1.0A value of true uses the highest protocol available, up to TLS1.0

Dla aplikacji przeznaczonych dla .NET Framework 4,7 i nowszych wersji ta wartość jest domyślnie ustawiona na false .For applications targeting .NET Framework 4.7 and later versions, this value defaults to false. Dla aplikacji przeznaczonych dla .NET Framework 4.6.2 i starszych wartość domyślna to true .For applications targeting .NET Framework 4.6.2 and earlier, this value defaults to true.

Switch.System ServiceModel. DontEnableSystemDefaultTlsVersionsSwitch.System.ServiceModel.DontEnableSystemDefaultTlsVersions

Wartość false dla parametru Switch.System.ServiceModel.DontEnableSystemDefaultTlsVersions Ustawia domyślną konfigurację, aby zezwolić systemowi operacyjnemu na wybór protokołu.A value of false for Switch.System.ServiceModel.DontEnableSystemDefaultTlsVersions sets the default configuration to allow the operating system to choose the protocol. Wartość true Ustawia domyślnie dla najwyższego dostępnego protokołu, do protokołu TLS 1.2.A value of true sets the default to the highest protocol available, up to TLS1.2.

Dla aplikacji przeznaczonych do .NET Framework 4.7.1 i nowszych wersji ta wartość jest domyślna false .For applications targeting .NET Framework 4.7.1 and later versions, this value defaults to false. Dla aplikacji przeznaczonych dla .NET Framework 4,7 i starszych wartość domyślna to true .For applications targeting .NET Framework 4.7 and earlier, this value defaults to true.

Aby uzyskać więcej informacji na temat protokołów TLS, zobacz ograniczenia: protokoły TLS.For more information about TLS protocols, see Mitigation: TLS Protocols. Aby uzyskać więcej informacji na temat AppContext przełączników, zobacz <AppContextSwitchOverrides> Element .For more information about AppContext switches, see <AppContextSwitchOverrides> Element.

Konfigurowanie zabezpieczeń za pośrednictwem rejestru systemu WindowsConfiguring security via the Windows Registry

Ostrzeżenie

Ustawienie kluczy rejestru ma wpływ na wszystkie aplikacje w systemie.Setting registry keys affects all applications on the system. Użyj tej opcji tylko wtedy, gdy masz pełną kontrolę nad komputerem i można kontrolować zmiany w rejestrze.Use this option only if you are in full control of the machine and can control changes to the registry.

Jeśli ustawienie jeden lub oba AppContext przełączniki nie jest opcją, można kontrolować protokoły zabezpieczeń używane przez aplikację z kluczami rejestru systemu Windows opisanymi w tej sekcji.If setting one or both AppContext switches isn't an option, you can control the security protocols that your app uses with the Windows Registry keys described in this section. AppContextJeśli aplikacja działa w .NET Framework 4.5.2 lub wcześniejszych wersjach lub nie można edytować pliku konfiguracji, może być niemożliwe użycie jednego lub obu przełączników.You might not be able to use one or both the AppContext switches if your app runs on .NET Framework 4.5.2 or earlier versions, or if you can't edit the configuration file. Jeśli chcesz skonfigurować zabezpieczenia z rejestrem, nie określaj wartości protokołu zabezpieczeń w kodzie. spowoduje to zastąpienie ustawienia rejestru.If you want to configure security with the registry, don't specify a security protocol value in your code; doing so overrides the registry setting.

Nazwy kluczy rejestru są podobne do nazw odpowiednich AppContext przełączników, ale nie są DontEnable poprzedzone nazwą.The names of the registry keys are similar to the names of the corresponding AppContext switches but without a DontEnable prepended to the name. Na przykład AppContext przełącznik DontEnableSchUseStrongCrypto jest kluczem rejestru o nazwie schusestrongcrypto we.For example, the AppContext switch DontEnableSchUseStrongCrypto is the registry key called SchUseStrongCrypto.

Te klucze są dostępne we wszystkich wersjach .NET Framework, dla których istnieje Najnowsza Poprawka zabezpieczeń.These keys are available in all .NET Framework versions for which there's a recent security patch. Zobacz aktualizacje zabezpieczeń.See Security updates.

Wszystkie klucze rejestru opisane poniżej mają taki sam skutek, niezależnie od tego, czy używasz sieci HTTP ( ServicePointManager ) czy sieci TCP Sockets ( SslStream ).All of the registry keys described below have the same effect whether you're doing HTTP networking (ServicePointManager) or TCP sockets networking (SslStream).

Schusestrongcrypto weSchUseStrongCrypto

HKEY_LOCAL_MACHINE\SOFTWARE\[Wow6432Node\]Microsoft\.NETFramework\<VERSION>: SchUseStrongCryptoKlucz rejestru ma wartość typu DWORD.The HKEY_LOCAL_MACHINE\SOFTWARE\[Wow6432Node\]Microsoft\.NETFramework\<VERSION>: SchUseStrongCrypto registry key has a value of type DWORD. Wartość 1 powoduje, że aplikacja korzysta z mocnej kryptografii.A value of 1 causes your app to use strong cryptography. Silne Kryptografia korzysta z bezpieczniejszych protokołów sieciowych (TLS 1,2, TLS 1,1 i TLS 1,0) i blokuje protokoły, które nie są bezpieczne.The strong cryptography uses more secure network protocols (TLS 1.2, TLS 1.1, and TLS 1.0) and blocks protocols that are not secure. Wartość 0 powoduje wyłączenie silnej kryptografii.A value of 0 disables strong cryptography. Aby uzyskać więcej informacji, zobacz flagę SCH_USE_STRONG_CRYPTO.For more information, see The SCH_USE_STRONG_CRYPTO flag.

Jeśli aplikacja jest przeznaczona dla .NET Framework 4,6 lub nowszej wersji, ten klucz domyślnie przyjmuje wartość 1.If your app targets .NET Framework 4.6 or later versions, this key defaults to a value of 1. Jest to bezpieczne domyślne zalecane przez nas.That's a secure default that we recommend. Jeśli aplikacja jest przeznaczona .NET Framework 4.5.2 lub wcześniejsza wersja klucza, wartością domyślną jest 0.If your app targets .NET Framework 4.5.2 or earlier versions, the key defaults to 0. W takim przypadku należy jawnie ustawić jego wartość na 1.In that case, you should explicitly set its value to 1.

Ten klucz powinien mieć wartość 0, jeśli chcesz nawiązać połączenie ze starszymi usługami, które nie obsługują mocnej kryptografii i nie można go uaktualnić.This key should only have a value of 0 if you need to connect to legacy services that don't support strong cryptography and can't be upgraded.

SystemDefaultTlsVersionsSystemDefaultTlsVersions

HKEY_LOCAL_MACHINE\SOFTWARE\[Wow6432Node\]Microsoft\.NETFramework\<VERSION>: SystemDefaultTlsVersionsKlucz rejestru ma wartość typu DWORD.The HKEY_LOCAL_MACHINE\SOFTWARE\[Wow6432Node\]Microsoft\.NETFramework\<VERSION>: SystemDefaultTlsVersions registry key has a value of type DWORD. Wartość 1 powoduje, że aplikacja zezwala na wybór protokołu przez system operacyjny.A value of 1 causes your app to allow the operating system to choose the protocol. Wartość 0 powoduje, że aplikacja korzysta z protokołów pobranych przez .NET Framework.A value of 0 causes your app to use protocols picked by the .NET Framework.

<VERSION> musi być 4.0.30319 v (dla .NET Framework 4 i wyższych) lub 2.0.50727 (dla .NET Framework 3,5).<VERSION> must be v4.0.30319 (for .NET Framework 4 and above) or v2.0.50727 (for .NET Framework 3.5).

Jeśli aplikacja jest przeznaczona dla .NET Framework 4,7 lub nowszej wersji, ten klucz domyślnie przyjmuje wartość 1.If your app targets .NET Framework 4.7 or later versions, this key defaults to a value of 1. Jest to bezpieczne domyślne zalecane przez nas.That's a secure default that we recommend. Jeśli aplikacja jest przeznaczona dla .NET Framework 4.6.1 lub wcześniejszych wersji, klucz domyślnie przyjmuje wartość 0.If your app targets .NET Framework 4.6.1 or earlier versions, the key defaults to 0. W takim przypadku należy jawnie ustawić jego wartość na 1.In that case, you should explicitly set its value to 1.

Aby uzyskać więcej informacji, zobacz Aktualizacja zbiorcza dla systemu Windows 10 w wersji 1511 i Windows Server 2016 Technical Preview 4:10 maja 2016.For more info, see Cumulative Update for Windows 10 Version 1511 and Windows Server 2016 Technical Preview 4: May 10, 2016.

Aby uzyskać więcej informacji na temat .NET Framework 3.5.1, zobacz obsługiwane wersje domyślne systemu TLS zawarte w .NET Framework 3.5.1 w systemach Windows 7 z dodatkiem SP1 i Server 2008 R2 z dodatkiem SP1.For more information with .NET Framework 3.5.1, see Support for TLS System Default Versions included in .NET Framework 3.5.1 on Windows 7 SP1 and Server 2008 R2 SP1.

Poniżej . Plik REG ustawia klucze rejestru i ich warianty do najbardziej bezpiecznych wartości:The following .REG file sets the registry keys and their variants to their most safe values:

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

Konfigurowanie protokołów Schannel w rejestrze systemu WindowsConfiguring Schannel protocols in the Windows Registry

Rejestru można użyć do precyzyjnej kontroli nad protokołami negocjowanymi przez klienta i/lub aplikację serwerową.You can use the registry for fine-grained control over the protocols that your client and/or server app negotiates. Sieć aplikacji przechodzi przez kanał Schannel (czyli inną nazwę dla bezpiecznego kanału.Your app's networking goes through Schannel (which is another name for Secure Channel. Konfigurując Schannel , można skonfigurować zachowanie aplikacji.By configuring Schannel, you can configure your app's behavior.

Rozpocznij od HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols klucza rejestru.Start with the HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols registry key. W tym kluczu można utworzyć dowolne podklucze w zestawie SSL 2.0 , SSL 3.0 , TLS 1.0 , TLS 1.1 i TLS 1.2 .Under that key you can create any subkeys in the set SSL 2.0, SSL 3.0, TLS 1.0, TLS 1.1, and TLS 1.2. W każdym z tych podkluczy można tworzyć podklucze Client i/lub Server .Under each of those subkeys, you can create subkeys Client and/or Server. W obszarze Client i można Server utworzyć wartości DWORD DisabledByDefault (0 lub 1) i Enabled (0 lub 1).Under Client and Server, you can create DWORD values DisabledByDefault (0 or 1) and Enabled (0 or 1).

Flaga SCH_USE_STRONG_CRYPTOThe SCH_USE_STRONG_CRYPTO flag

Jeśli jest włączona (domyślnie przez AppContext przełącznik lub rejestr systemu Windows), .NET Framework używa SCH_USE_STRONG_CRYPTO flagi, gdy aplikacja żąda protokołu zabezpieczeń TLS.When it's enabled (by default, by an AppContext switch, or by the Windows Registry), the .NET Framework uses the SCH_USE_STRONG_CRYPTO flag when your app requests a TLS security protocol. SCH_USE_STRONG_CRYPTOFlagę można włączyć domyślnie, z AppContext przełącznikiem lub z rejestrem.The SCH_USE_STRONG_CRYPTO flag can be enabled by default, with the AppContext switch, or with the Registry. System operacyjny przekazuje flagę do programu w Schannel celu wyłączania znanych algorytmów kryptograficznych, mechanizmów szyfrowania i wersji protokołu TLS/SSL, które w przeciwnym razie mogą być włączone w celu zapewnienia lepszej współdziałania.The OS passes the flag to Schannelto instruct it to disable known weak cryptographic algorithms, cipher suites, and TLS/SSL protocol versions that may be otherwise enabled for better interoperability. Aby uzyskać więcej informacji, zobacz:For more information, see:

SCH_USE_STRONG_CRYPTOFlaga jest również przenoszona do Schannel , gdy jawnie użyto Tls (TLS 1,0), Tls11 lub Tls12 wartości wyliczenia SecurityProtocolType lub SslProtocols .The SCH_USE_STRONG_CRYPTO flag is also passed to Schannel when you explicitly use the Tls (TLS 1.0), Tls11, or Tls12 enumerated values of SecurityProtocolType or SslProtocols.

Aktualizacje zabezpieczeńSecurity updates

Najlepsze rozwiązania w tym artykule zależą od zainstalowanych najnowszych aktualizacji zabezpieczeń.The best practices in this article depend on recent security updates being installed. Te aktualizacje obejmują możliwość korzystania z zaawansowanych funkcji .NET Framework 4,7 i nowszych.These updates include the ability to use advanced .NET Framework 4.7 and later features. Najnowsze aktualizacje zabezpieczeń są ważne, jeśli aplikacja działa w .NET Framework 4,7 i nowszych wersjach (nawet jeśli jest przeznaczona do wcześniejszej wersji).Recent security updates are important if your app runs on .NET Framework 4.7 and later versions (even if it targets an earlier version).

Aby zaktualizować .NET Framework, aby umożliwić systemowi operacyjnemu wybranie najlepszej wersji protokołu TLS do użycia, należy zainstalować co najmniej:To update the .NET Framework to allow the operating system to choose the best version of TLS to use, you must install at least:

Zobacz też:See also:

Obsługa protokołu TLS 1.2Support for TLS 1.2

Aby aplikacja negocjowała protokół TLS 1,2, system operacyjny i wersja .NET Framework muszą obsługiwać protokół TLS 1,2.For your app to negotiate TLS 1.2, the OS and the .NET Framework version both need to support TLS 1.2.

Wymagania dotyczące systemu operacyjnego dla obsługi protokołu TLS 1.2Operating system requirements to support TLS 1.2

Aby włączyć lub ponownie włączyć protokół TLS 1,2 i/lub TLS 1,1 w systemie, który je obsługuje, zobacz Ustawienia rejestru Transport Layer Security (TLS).To enable or re-enable TLS 1.2 and/or TLS 1.1 on a system that supports them, see Transport Layer Security (TLS) registry settings.

System operacyjnyOS Obsługa protokołu TLS 1,2TLS 1.2 support
Windows 10Windows 10
Windows Server 2016Windows Server 2016
Obsługiwane i domyślnie włączone.Supported, and enabled by default.
Windows 8.1Windows 8.1
Windows Server 2012 z dodatkiem R2Windows Server 2012 R2
Obsługiwane i domyślnie włączone.Supported, and enabled by default.
Windows 8.0Windows 8.0
Windows Server 2012Windows Server 2012
Obsługiwane i domyślnie włączone.Supported, and enabled by default.
Windows 7 z dodatkiem SP1Windows 7 SP1
Windows Server 2008 R2 SP1Windows Server 2008 R2 SP1
Obsługiwane, ale nie włączone domyślnie.Supported, but not enabled by default. Aby uzyskać szczegółowe informacje na temat włączania protokołu TLS 1,2, zobacz stronę internetową Ustawienia rejestru Transport Layer Security (TLS) .See the Transport Layer Security (TLS) registry settings web page for details on how to enable TLS 1.2.
Windows Server 2008Windows Server 2008 Obsługa protokołu TLS 1,2 i TLS 1,1 wymaga aktualizacji.Support for TLS 1.2 and TLS 1.1 requires an update. Zobacz Aktualizacja, aby dodać obsługę protokołów tls 1,1 i tls 1,2 w systemie Windows Server 2008 SP2.See Update to add support for TLS 1.1 and TLS 1.2 in Windows Server 2008 SP2.
Windows VistaWindows Vista Nieobsługiwane.Not supported.

Aby uzyskać informacje o tym, które protokoły TLS/SSL są domyślnie włączone w każdej wersji systemu Windows, zobacz protokoły w protokole TLS/SSL (Dostawca SSP Schannel).For information about which TLS/SSL protocols are enabled by default on each version of Windows, see Protocols in TLS/SSL (Schannel SSP).

Wymagania dotyczące obsługi protokołu TLS 1.2 przy użyciu platformy .NET Framework 3.5Requirements to support TLS 1.2 with .NET Framework 3.5

W tej tabeli przedstawiono aktualizację systemu operacyjnego, która będzie potrzebna do obsługi protokołu TLS 1,2 z .NET Framework 3,5.This table shows the OS update you'll need to support TLS 1.2 with .NET Framework 3.5. Zalecamy stosowanie wszystkich aktualizacji systemu operacyjnego.We recommend you apply all OS updates.

System operacyjnyOS Minimalna aktualizacja wymagana do obsługi protokołu TLS 1,2 z .NET Framework 3,5Minimum update needed to support TLS 1.2 with .NET Framework 3.5
Windows 10Windows 10
Windows Server 2016Windows Server 2016
Aktualizacja zbiorcza dla systemu Windows 10 w wersji 1511 i Windows Server 2016 Technical Preview 4: maj 10, 2016Cumulative Update for Windows 10 Version 1511 and Windows Server 2016 Technical Preview 4: May 10, 2016
Windows 8.1Windows 8.1
Windows Server 2012 z dodatkiem R2Windows Server 2012 R2
Obsługa domyślnych wersji systemu TLS uwzględnionych w .NET Framework 3,5 w systemach Windows 8.1 i Windows Server 2012 R2Support for TLS System Default Versions included in the .NET Framework 3.5 on Windows 8.1 and Windows Server 2012 R2
Windows 8.0Windows 8.0
Windows Server 2012Windows Server 2012
Obsługa domyślnych wersji systemu TLS uwzględnionych w .NET Framework 3,5 w systemie Windows Server 2012Support for TLS System Default Versions included in the .NET Framework 3.5 on Windows Server 2012
Windows 7 z dodatkiem SP1Windows 7 SP1
Windows Server 2008 R2 SP1Windows Server 2008 R2 SP1
Obsługa domyślnych wersji systemu TLS uwzględnionych w .NET Framework 3.5.1 w systemach Windows 7 z dodatkiem SP1 i Server 2008 R2 z dodatkiem SP1Support for TLS System Default Versions included in the .NET Framework 3.5.1 on Windows 7 SP1 and Server 2008 R2 SP1
Windows Server 2008Windows Server 2008 Obsługa domyślnych wersji systemu TLS uwzględnionych w .NET Framework 2,0 SP2 w systemie Windows Vista z dodatkiem SP2 i Server 2008 z dodatkiem SP2Support for TLS System Default Versions included in the .NET Framework 2.0 SP2 on Windows Vista SP2 and Server 2008 SP2
Windows VistaWindows Vista NieobsługiwaneNot supported