Udostępnij za pośrednictwem


Najlepsze rozwiązania dotyczące protokołu Transport Layer Security (TLS) w programie .NET Framework

Uwaga

Ta strona zawiera informacje dotyczące protokołu TLS programu .NET Framework. Jeśli szukasz informacji dotyczących protokołu TLS dla platformy .NET, zobacz: Tls/SSL Best Practices (Najlepsze rozwiązania dotyczące protokołu TLS/SSL)

Program .NET Framework obsługuje używanie protokołu Transport Layer Security (TLS) do zabezpieczania komunikacji sieciowej.

Co to jest protokół Transport Layer Security (TLS)?

Ostrzeżenie

Protokoły TLS 1.0 i 1.1 zostały wycofane przez RFC8996. Ten dokument obejmuje tylko protokoły TLS 1.2 i TLS 1.3.

Protokół Transport Layer Security (TLS) to najnowsza wersja standardu przeznaczona do ochrony prywatności informacji przekazywanych przez Internet. Protokół TLS 1.3 jest standardem, który zapewnia ulepszenia zabezpieczeń w porównaniu z poprzednimi wersjami. W tym artykule przedstawiono zalecenia dotyczące zabezpieczania aplikacji .NET Framework korzystających z protokołu TLS.

Kto może skorzystać z tego dokumentu?

Obsługa protokołu TLS w programie .NET Framework

Ponieważ program .NET Framework jest zależny od Schannel systemu Windows, które wersje można negocjować, a która wersja będzie używana, zależy od systemu operacyjnego.

Oto zaktualizowana przykładowa tabela przedstawiająca najbardziej obsługiwaną wersję protokołu TLS dla różnych kombinacji wersji systemu operacyjnego i wersji docelowych programu .NET Framework:

Wersja docelowa programu .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

Aby uzyskać więcej informacji, zobacz Obsługa wersji protokołu TLS w usłudze Schannel.

Zalecenia

  • Dla TLS 1.3 należy korzystać z .NET Framework 4.8 lub nowszej. Sprawdź sekcję Audit your code (Przeprowadź inspekcję kodu ), jak zweryfikować plik target framework.
  • Nie należy jawnie określać wersji protokołu TLS, tj. nie używaj przeciążeń metody SslStream, które akceptują parametr SslProtocols.
    • Dzięki temu kod pozwoli systemowi operacyjnemu zdecydować o wersji protokołu TLS.
    • Jeśli musisz ustawić wartość ServicePointManager.SecurityProtocol, ustaw ją na SecurityProtocolType.SystemDefault. Będzie również używać domyślnego systemu operacyjnego.
    • Jeśli musisz użyć przeciążeń SslStream metody, które przyjmują jawny SslProtocols parametr, należy przekazać SslProtocols.SystemDefault jako argument. Będzie również używać domyślnego systemu operacyjnego.
  • Wykonaj dokładną inspekcję kodu, aby sprawdzić, czy nie określasz jawnie wersji protokołu TLS lub SSL.

Ostrzeżenie

Nie używaj elementu SslProtocols.Default, ponieważ ustawia wersję protokołu TLS na ssl3 i TLS 1.0, które są przestarzałe.

Gdy aplikacja umożliwia systemowi operacyjnemu wybranie wersji protokołu TLS:

  • Automatycznie korzysta z nowych protokołów TLS dodanych w przyszłości.
  • System operacyjny blokuje protokoły, które nie są wykrywane jako bezpieczne (na przykład SSL3 i TLS 1.0).

W tym artykule wyjaśniono, jak włączyć najsilniejsze zabezpieczenia dostępne dla wersji programu .NET Framework przeznaczonej dla aplikacji i jej działania. Gdy aplikacja jawnie ustawia protokół zabezpieczeń i wersję, rezygnuje z innej alternatywy i rezygnuje z domyślnego zachowania programu .NET Framework i systemu operacyjnego. Jeśli chcesz, aby aplikacja mogła negocjować połączenie TLS 1.3, jawne ustawienie na niższą wersję protokołu TLS uniemożliwia połączenie TLS 1.3.

Jeśli nie możesz jawnie określić wersji protokołu, zdecydowanie zalecamy określenie protokołu TLS 1.2 lub TLS 1.3 (czyli currently considered secure). Aby uzyskać wskazówki dotyczące identyfikowania i usuwania zależności protokołu TLS 1.0, pobierz oficjalny dokument Rozwiązywanie problemów z protokołem TLS 1.0.

Program WCF obsługuje protokół TLS 1.2 jako domyślny w programie .NET Framework 4.7. Począwszy od programu .NET Framework 4.7.1, domyślnie program WCF jest w wersji skonfigurowanej przez system operacyjny. Jeśli aplikacja jest jawnie skonfigurowana za pomocą SslProtocols.None, program WCF używa domyślnego ustawienia systemu operacyjnego podczas korzystania z transportu NetTcp.

Pytania dotyczące tego dokumentu można zadać w GitHub Issue Transport Layer Security (TLS) Best Practices with the .NET Framework.

Inspekcja kodu i wprowadzanie zmian w kodzie

W przypadku aplikacji ASP.NET sprawdź <system.web><httpRuntime targetFramework> element web.config , aby sprawdzić, czy używasz docelowej wersji programu .NET Framework.

Aby zapoznać się z formularzami systemu Windows i innymi aplikacjami, zobacz How to: Target a Version of the .NET Framework (Instrukcje: określanie wersji docelowej wersji programu .NET Framework).

Skorzystaj z poniższych sekcji, aby sprawdzić, czy nie używasz określonej wersji protokołu TLS ani SSL.

Jawne ustawianie protokołu zabezpieczeń

Jeśli musisz jawnie ustawić protokół zabezpieczeń zamiast zezwalać na wybranie protokołu zabezpieczeń platformy .NET lub systemu operacyjnego, wybierz następujące protokoły:

  • W przypadku programu .NET Framework 3.5: TLS 1.2
  • W przypadku programu .NET Framework 4.6.2 lub nowszego: TLS 1.3

Jeśli nie możesz znaleźć wskazanych protokołów w wyliczeniu, możesz dodać je w pliku rozszerzenia. Sprawdź poniżej:

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

Aby uzyskać więcej informacji, zobacz Support for TLS System Default Versions included in .NET Framework 3.5 on Windows 8.1 and Windows Server 2012 R2 (Obsługa domyślnych wersji systemu TLS w programie .NET Framework 3.5 w systemach Windows 8.1 i Windows Server 2012 R2).

W przypadku interfejsów API System.Net (HttpClient, SslStream)

W poniższych sekcjach pokazano, jak skonfigurować aplikację tak, aby korzystała z "obecnie uważanych za bezpieczne wersje" protokołu TLS (tj. TLS 1.2 i TLS 1.3), jeśli jest przeznaczona dla platformy .NET Framework 4.7 lub nowszej.

Dla HttpClient i HttpWebRequest

ServicePointManager używa domyślnego protokołu zabezpieczeń skonfigurowanego w systemie operacyjnym. Aby uzyskać domyślny wybór systemu operacyjnego, jeśli to możliwe, nie ustawiaj wartości dla ServicePointManager.SecurityProtocol właściwości , która domyślnie ma wartość SecurityProtocolType.SystemDefault.

Ponieważ ustawienie SecurityProtocolType.SystemDefault powoduje, że ServicePointManager używa domyślnego protokołu zabezpieczeń skonfigurowanego przez system operacyjny, aplikacja może działać inaczej, w zależności od systemu operacyjnego, na którym jest uruchomiona. Na przykład system Windows 10 używa protokołu TLS 1.2, podczas gdy system Windows 11 używa protokołu TLS 1.3.

Dla protokołu SslStream

SslStream domyślnie jest używany protokół zabezpieczeń i wersja wybrana przez system operacyjny. Aby w miarę możliwości uzyskać najlepszy wybór domyślnego systemu operacyjnego, nie używaj przeciążeń metody SslStream, które przyjmują parametr SslProtocols w sposób jawny. W przeciwnym razie przekaż SslProtocols.None. Zalecamy, aby nie używać Default; ustawienie SslProtocols.Default wymusza użycie protokołu SSL 3.0 /TLS 1.0 i uniemożliwia użycie protokołu TLS 1.2.

Nie ustawiaj wartości dla SecurityProtocol właściwości (dla sieci HTTP).

Nie używaj przeciążeń metody SslStream przyjmujących jawny parametr SslProtocols (dla sieci gniazd TCP). Podczas dostosowania docelowej platformy aplikacji do .NET Framework w wersji 4.7 lub nowszej będziesz przestrzegać rekomendacji dotyczących najlepszych praktyk.

W przypadku aplikacji WCF

W poniższych sekcjach pokazano, jak skonfigurować aplikację do używania "obecnie uważanych za bezpieczne wersje" protokołu TLS (tj. TLS 1.2 i TLS 1.3).

Korzystanie z transportu TCP z zabezpieczeniami transportu i poświadczeniami certyfikatu

WCF używa tego samego stosu sieciowego co reszta programu .NET Framework.

Jeśli celujesz w wersję 4.7.1, program WCF jest skonfigurowany tak, aby domyślnie zezwalał systemowi operacyjnemu na wybór najlepszego protokołu zabezpieczeń, chyba że skonfigurowano inaczej jawnie.

  • W pliku konfiguracji aplikacji.
  • Lub w kodzie źródłowym aplikacji.

Domyślnie program .NET Framework 4.7 i nowsze wersje są skonfigurowane do używania protokołu TLS 1.2 i zezwalania na połączenia przy użyciu protokołu TLS 1.1 lub TLS 1.0. Skonfiguruj program WCF, aby umożliwić systemowi operacyjnemu wybór najlepszego protokołu zabezpieczeń, konfigurując powiązanie do używania programu SslProtocols.None. Możesz ustawić to na SslProtocols. Do SslProtocols.None można uzyskać dostęp z Transport. Do NetTcpSecurity.Transport można uzyskać dostęp z Security.

Jeśli korzystasz z niestandardowego wiązania:

  • Skonfiguruj program WCF, aby zezwolić systemowi operacyjnemu na wybór najlepszego protokołu zabezpieczeń, ustawiając opcję SslProtocols do wyboru SslProtocols.None.
  • Możesz też skonfigurować protokół używany ze ścieżką system.serviceModel/bindings/customBinding/binding/sslStreamSecurity:sslProtocolskonfiguracji .

Jeśli nie używasz powiązania niestandardowego i konfigurujesz powiązanie WCF za pomocą konfiguracji, ustaw protokół używany wraz ze ścieżką system.serviceModel/bindings/netTcpBinding/binding/security/transport:sslProtocols konfiguracji.

Używanie zabezpieczeń komunikatów z poświadczeniami certyfikatu

Program .NET Framework 4.7 i nowsze wersje domyślnie używają protokołu określonego SecurityProtocol we właściwości . Gdy parametr AppContextSwitchSwitch.System.ServiceModel.DisableUsingServicePointManagerSecurityProtocols jest ustawiony na truewartość , program WCF wybiera najlepszy protokół, maksymalnie TLS 1.0.

Konfigurowanie zabezpieczeń za pomocą przełączników AppContext

Przełączniki AppContext opisane w tej sekcji są istotne, jeśli aplikacja jest skierowana na .NET Framework 4.6.2 lub nowszą wersję i działa na tej platformie. Czy to domyślnie, czy też przez ich jawne ustawienie, przełączniki powinny być ustawione jako false, o ile to możliwe. Jeżeli zamierzasz skonfigurować zabezpieczenia za pomocą jednego lub obu przełączników, nie określaj wartości protokołu zabezpieczeń w swoim kodzie; takie działanie spowoduje zastąpienie ustawień przełączników.

Przełączniki mają taki sam efekt, niezależnie od tego, czy korzystasz z sieci HTTP (ServicePointManager) czy sieci gniazd TCP (SslStream).

Switch.System.Net.DontEnableSchUseStrongCrypto

Wartość false dla Switch.System.Net.DontEnableSchUseStrongCrypto powoduje, że aplikacja używa silnej kryptografii. Wartość false dla DontEnableSchUseStrongCrypto stosuje bezpieczniejsze protokoły sieciowe (TLS 1.2 i TLS 1.1) i blokuje protokoły, które nie są bezpieczne. Aby uzyskać więcej informacji, zobacz flagę SCH_USE_STRONG_CRYPTO. Wartość true powoduje wyłączenie silnej kryptografii dla Twojej aplikacji. Ten przełącznik ma wpływ tylko na połączenia klienta (wychodzące) w aplikacji.

Jeśli aplikacja jest przeznaczona dla programu .NET Framework w wersji 4.6.2 lub nowszej, ten przełącznik domyślnie ustawia się na false. Jest to bezpieczne ustawienie domyślne, które zalecamy. Jeśli aplikacja działa na platformie .NET Framework 4.6.2, ale jest przeznaczona dla starszej wersji, przełącz wartość domyślną na true. W takim przypadku należy jawnie ustawić go na false.

DontEnableSchUseStrongCrypto Powinna mieć wartość tylko true wtedy, gdy musisz nawiązać połączenie ze starszymi usługami, które nie obsługują silnej kryptografii i nie można ich uaktualnić.

Switch.System.Net.DontEnableSystemDefaultTlsVersions

Wartość parametru false dla Switch.System.Net.DontEnableSystemDefaultTlsVersions powoduje, że aplikacja zezwala systemowi operacyjnemu na wybór protokołu. Wartość true powoduje, że aplikacja używa protokołów wybranych przez program .NET Framework.

Jeśli aplikacja jest przeznaczona dla platformy .NET Framework w wersji 4.7 lub nowszej, spowoduje to przełączenie wartości domyślnych na false. Jest to bezpieczne ustawienie domyślne, które zalecamy. Jeśli aplikacja działa w wersji .NET Framework 4.7 lub nowszej, ale jest przeznaczona dla starszej wersji, przełącz wartość domyślną na true. W takim przypadku należy jawnie ustawić go na false.

Konfigurowanie protokołów Schannel w rejestrze systemu Windows

Rejestru można użyć do precyzyjnej kontroli nad protokołami negocjowanych przez klienta lub aplikację serwera. Sieć aplikacji przechodzi przez usługę Schannel (czyli inną nazwę bezpiecznego kanału). Konfigurując Schannel, można skonfigurować zachowanie aplikacji.

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols Zacznij od klucza rejestru. W tym kluczu można utworzyć wszystkie podklucze w zestawie TLS 1.2, TLS 1.3. W każdym z tych podklucza można tworzyć podklucze Client i/lub Server. W obszarze Client i Server można utworzyć wartości DWORD, DisabledByDefault (0 lub 1) i Enabled (0 lub 1).

Aby uzyskać więcej informacji, zobacz: Ustawienia rejestru TLS — Schannel

Flaga SCH_USE_STRONG_CRYPTO

Po włączeniu (domyślnie, lub przez przełącznik), program .NET Framework używa flagi , gdy twoja aplikacja nawiązuje połączenie TLS z serwerem. Program .NET Framework przekazuje flagę do Schannel, aby wyłączyła znane słabe algorytmy kryptograficzne, zestawy szyfrowania i wersje protokołu TLS/SSL, które mogą być inaczej włączone w celu lepszej kompatybilności. Aby uzyskać więcej informacji, zobacz:

Flaga SCH_USE_STRONG_CRYPTO jest również przekazywana do Schannel dla połączeń klienta (wychodzących), gdy jawnie używasz wyliczonych wartości Tls11 lub Tls12 z SecurityProtocolType lub SslProtocols. Flaga SCH_USE_STRONG_CRYPTO jest używana tylko w przypadku połączeń, w których aplikacja pełni rolę klienta. Słabe protokoły i algorytmy można wyłączyć, gdy aplikacje pełnią rolę serwera, konfigurując ustawienia rejestru całego Schannel komputera.