Rozwiązywanie problemu z protokołem TLS 1.0, wydanie drugie

W tym dokumencie przedstawiono najnowsze wskazówki dotyczące szybkiego identyfikowania i usuwania zależności od protokołu Transport Layer Security (TLS) w wersji 1.0 w oprogramowaniu tworzonym dla systemów operacyjnych firmy Microsoft wraz ze szczegółowymi informacjami na temat zmian w produktach i nowych funkcji dostarczanych przez firmę Microsoft, za pomocą których możesz chronić swoich klientów i swoje usługi online. Ma on stanowić punkt wyjścia do opracowania planu migracji do środowiska sieciowego z protokołem TLS w wersji 1.2 lub nowszej. Chociaż omówione tutaj rozwiązania mogą być przydatne także podczas wycofywania protokołu TLS 1.0 z bibliotek kryptograficznych i systemów operacyjnych firm innych niż Microsoft, nie są one głównym przedmiotem tego dokumentu.

TLS 1.0 to protokół zabezpieczeń zdefiniowany po raz pierwszy w roku 1999, służący do tworzenia kanałów szyfrowania w sieciach komputerowych. W rozwiązaniach firmy Microsoft ten protokół jest obsługiwany od wersji systemu Windows XP/Server 2003. Protokół TLS 1.0 nie jest już domyślnym protokołem zabezpieczeń stosowanym w nowoczesnych systemach operacyjnych, ale jest nadal obsługiwany na potrzeby zgodności z poprzednimi wersjami. Rozwój wymagań prawnych oraz nowe luki w zabezpieczeniach protokołu TLS 1.0 dają firmom impuls to całkowitego wycofania protokołu TLS 1.0.

Firma Microsoft zaleca klientom przygotowanie się zawczasu poprzez usunięcie zależności od protokołu TLS 1.0 w swoich środowiskach i wyłączenie protokołu TLS 1.0 na poziomie sytemu operacyjnego, jeśli tylko jest to możliwe. Biorąc pod uwagę długi okres, przez jaki protokół TLS 1.0 był obsługiwany przez branżę oprogramowania, zdecydowanie zalecane jest ujęcie w każdym planie wycofania protokołu TLS 1.0 następujących elementów:

  • Analiza kodu umożliwiająca znalezienie i poprawienie zapisanych na stałe wystąpień protokołu TLS 1.0 lub starszych protokołów zabezpieczeń.

  • Skanowanie punktów końcowych sieci i analiza ruchu w celu wykrycia systemów operacyjnych korzystających z protokołu TLS 1.0 lub starszych protokołów.

  • Przeprowadzenie pełnych testów regresyjnych w całym stosie aplikacji przy wyłączonym protokole TLS 1.0.

  • Migracja starszych systemów operacyjnych i bibliotek oraz struktur programistycznych do wersji domyślnie obsługujących negocjowanie protokołu TLS 1.2.

  • Testowanie zgodności we wszystkich systemach operacyjnych używanych w firmie w celu wykrycia wszelkich problemów z obsługą protokołu TLS 1.2.

  • Koordynacja działań z partnerami biznesowymi i klientami oraz powiadomienie ich o planowanym wycofaniu protokołu TLS 1.0.

  • Ustalenie, którzy klienci mogą utracić możliwość łączenia się z Twoimi serwerami po wyłączeniu protokołu TLS 1.0.

Celem tego dokumentu jest przedstawienie zaleceń pomocnych w usunięciu przeszkód technicznych do wyłączenia protokołu TLS 1.0 przy jednoczesnym zwiększeniu świadomości wpływu tej zmiany na klientów. Przeprowadzenie takiego badania może pomóc w ograniczeniu konsekwencji dla firmy wynikających z kolejnych wykrywanych luk w zabezpieczeniach protokołu TLS 1.0. W tym dokumencie odwołania do wycofania protokołu TLS w wersji 1.0 obejmują również wersję protokołu TLS 1.1.

Strategiczną potrzebą deweloperów oprogramowania w firmach jest przyjęcie bardziej elastycznych i zabezpieczonych na przyszłość rozwiązań (tzw. „zręczność kryptograficzna” — „Crypto Agility”), aby przygotować się na przyszłe naruszenia protokołów zabezpieczeń. W tym dokumencie zaproponowano elastyczne rozwiązania eliminujące zapisywanie wersji protokołu TLS na stałe w kodzie, jednak bardziej ogólne rozwiązania realizujące podejście Crypto Agility wykraczają poza jego zakres.

Bieżący stan implementacji protokołu TLS 1.0 przez firmę Microsoft

W implementacji protokołu TLS 1.0 przez firmę Microsoft nie występują znane luki w zabezpieczeniach. Ze względu na możliwość występowania ataków z wykorzystaniem aktualizacji wstecznej protokołu w przyszłości oraz na inne luki w zabezpieczeniach protokołu TLS 1.0, które nie są specyficzne dla jego implementacji przez firmę Microsoft, zalecane jest usunięcie w miarę możliwości wszystkich zależności od protokołów zabezpieczeń starszych niż TLS 1.2 (TLS 1.1/1.0/SSLv3/SSLv2).

Planując migrację do protokołu TLS w wersji 1.2 lub nowszej, deweloperzy i administratorzy systemów powinni mieć świadomość, że wersja protokołu może być zapisana na stałe w aplikacjach tworzonych przez ich pracowników i partnerów. Zapisanie na stałe oznacza tutaj zapisanie w kodzie wersji protokołu TLS, która jest przestarzała i mniej bezpieczna od nowych wersji. W takim przypadku wersje protokołu TLS nowsze niż ta zapisana na stałe nie mogą być używane bez zmodyfikowania danego programu. Problemów tego typu nie można rozwiązać bez wprowadzenia zmian w kodzie źródłowym i wdrożenia aktualizacji oprogramowania. Zapisywanie wersji protokołu na stałe było w przeszłości powszechnie stosowane na potrzeby testowania i zapewnienia obsługi, ponieważ wiele różnych przeglądarek i systemów operacyjnych miało różne poziomy obsługi protokołu TLS.

Obsługiwane wersje protokołu TLS w systemie Windows

Wiele systemów operacyjnych domyślnie używa przestarzałych wersji protokołu TLS lub ma ograniczenia poziomu obsługi, które należy wziąć pod uwagę.

Rysunek 1. Obsługa protokołu zabezpieczeń według wersji systemu operacyjnego

System operacyjny Windows SSLv2 SSLv3 TLS 1.0 TLS 1.1 TLS 1.2 TLS 1.3
Windows Vista Włączony Włączony Włączony Nieobsługiwany Nieobsługiwany Nieobsługiwany
Windows Server 2008 Włączony Włączony Włączony Wyłączony* Wyłączony* Nieobsługiwany
Windows 7 (WS2008 R2) Włączony Włączony Włączony Wyłączony* Wyłączony* Nieobsługiwany
Windows 8 (WS2012) Disabled Włączony Włączony Włączony Włączony Nieobsługiwany
Windows 8.1 (WS2012 R2) Disabled Włączony Włączony Włączony Włączony Nieobsługiwany
Windows 10 Disabled Włączony Włączony Włączony Włączony Nieobsługiwany
Windows 11 Disabled Włączony Włączony Włączony Włączony Włączony
Windows Server 2016 Nieobsługiwany Disabled Włączony Włączony Włączony Nieobsługiwany
Windows Server 2016 Nieobsługiwany Disabled Włączony Włączony Włączony Nieobsługiwany
Windows Server 2019 Nieobsługiwany Disabled Włączony Włączony Włączony Nieobsługiwany
Windows Server 2019 GS edition Nieobsługiwany Disabled Disabled Disabled Włączony Nieobsługiwany
Windows Server 2022 Nieobsługiwany Disabled Disabled Disabled Włączony Włączony

System Windows Server 2019 GS jest zgodny ze standardem Microsoft SDL, TLS 1.2 tylko z ograniczonym zestawem zestawów szyfrowania.

Wersja systemu Windows Server 2022 jest zgodna ze standardem Microsoft SDL, protokołami TLS 1.2 i TLS 1.3 tylko z ograniczonym zestawem zestawów szyfrowania.

Protokół TLS 1.1/1.2 można włączyć w systemie Windows Server 2008 za pośrednictwem tego opcjonalnego pakietu windows Update.

Aby uzyskać więcej informacji na temat wycofania protokołu TLS 1.0/1.1 w programach Internet Explorer i Edge, zobacz Modernizing TLS connections in Microsoft Edge and Internet Explorer 11 (Modernizacja połączeń TLS w przeglądarkach Microsoft Edge i Internet Explorer 11), Planowane zmiany w przeglądarce Microsoft Edge wpływające na zgodność witryn oraz Disabling TLS/1.0 and TLS/1.1 in the new Edge Browser (Wyłączanie protokołu TLS 1.0 i 1.1 w nowej przeglądarce Edge).

Można szybko określić, jaka wersja protokołu TLS będzie żądana przez różnych klientów podczas łączenia się z Twoimi usługami online, za pomocą symulacji uzgadniania dostępnej w witrynie firmy Qualys SSL Labs. Ta symulacja obejmuje wszelkie kombinacje klienckiego systemu operacyjnego i przeglądarki różnych producentów. Zobacz Dodatek A na końcu tego dokumentu, aby zapoznać się ze szczegółowym przykładem tego, jaka wersja protokołu TLS jest negocjowana przez różne symulowane kombinacje klienckiego systemu operacyjnego i przeglądarki podczas łączenia się z witryną www.microsoft.com.

Zdecydowanie zalecane jest przeprowadzenie spisu systemów operacyjnych używanych przez firmę, klientów i partnerów (w tych dwóch ostatnich przypadkach konieczny będzie kontakt z poszczególnymi podmiotami lub co najmniej zbieranie ciągów agenta użytkownika HTTP), jeśli nie został on jeszcze przeprowadzony. Ten spis można następnie uzupełnić przez analizę ruchu na brzegu sieci przedsiębiorstwa. W takiej sytuacji analiza ruchu ujawni wersje protokołu TLS pomyślnie wynegocjowane przez klientów i partnerów łączących się z Twoimi usługami, ale sam ruch pozostanie zaszyfrowany.

Udoskonalenia inżynieryjne firmy Microsoft eliminujące zależności od protokołu TLS 1.0

Od czasu publikacji wersji 1 tego dokumentu firma Microsoft udostępniła szereg aktualizacji oprogramowania i nowych funkcji pomocnych w wycofaniu protokołu TLS 1.0. Są to:

  • Niestandardowe rejestrowanie programu IIS umożliwiające skorelowanie adresu IP/ciągu agenta użytkownika klienta, identyfikatora URI usługi, wersji protokołu TLS i zestawu szyfrowania.

    • Ta funkcja rejestrowania umożliwia administratorom ilościowe określenie narażenia klientów na słabe wersje protokołu TLS.
  • Portal SecureScore — aby pomóc administratorom dzierżaw usługi Office 365 w rozpoznaniu użycia słabych wersji protokołu TLS w swoim środowisku, w związku z zakończeniem obsługi protokołu TLS 1.0 w usłudze Office 365 w październiku 2018 r. opracowano portal SecureScore, udostępniający te informacje.

    • Ten portal udostępnia administratorom dzierżaw usługi Office 365 cenne informacje pozwalające im skontaktować się z klientami, którzy mogą nie mieć świadomości występujących zależności od protokołu TLS 1.0.

    • Aby uzyskać więcej informacji, odwiedź witrynę https://securescore.microsoft.com/.

  • Aktualizacje środowiska .NET Framework eliminujące zapisywanie wersji protokołu na stałe na poziomie aplikacji oraz zapobiegające dziedziczeniu zależności od protokołu TLS 1.0 ze struktury programistycznej.

  • Wydano wskazówki dla deweloperów i aktualizacje oprogramowania, aby ułatwić klientom identyfikowanie i eliminowanie zależności platformy .Net w przypadku słabego protokołu TLS: Najlepsze rozwiązania dotyczące protokołu Transport Layer Security (TLS) w programie .NET Framework

    • FYI: Wszystkie aplikacje przeznaczone dla platformy .NET 4.5 lub starszej prawdopodobnie będą musiały zostać zmodyfikowane w celu obsługi protokołu TLS 1.2.
  • Protokół TLS 1.2 został wdrożony wstecznie w systemach Windows Server 2008 SP2 i XP POSReady 2009, aby pomóc klientom zobowiązanym do korzystania z tych starszych wersji.

  • Kolejne zmiany zostaną ogłoszone na początku roku 2019 i będą opisywane w zaktualizowanych wersjach tego dokumentu.

Znajdowanie i poprawianie zależności od protokołu TLS 1.0 w kodzie

W przypadku produktów korzystających z bibliotek kryptograficznych i protokołów zabezpieczeń udostępnianych przez systemy operacyjne Windows opisane poniżej czynności powinny pomóc w zidentyfikowaniu użycia w aplikacjach zapisanej na stałe wersji protokołu TLS 1.0:

  1. Zidentyfikuj wszystkie wystąpienia funkcji AcquireCredentialsHandle(). Dzięki temu osoby sprawdzające mogą w przybliżeniu znaleźć bloki kodu, w których może być zapisana na stałe wersja protokołu TLS.

  2. Przejrzyj wszystkie wystąpienia struktur SecPkgContext_SupportedProtocols i SecPkgContext_Połączenie ionInfo pod kątem zakodowanego na stałe protokołu TLS.

  3. W kodzie natywnym zmień wszystkie przypisania funkcji grbitEnabledProtocols o wartości innej niż zero na zero. Dzięki temu system operacyjny może korzystać z domyślnej wersji protokołu TLS.

  4. Wyłącz tryb FIPS, jeśli został włączony, ze względu na możliwość wystąpienia konfliktu z ustawieniami wymaganymi do jawnego wyłączenia protokołu TLS w wersji 1.0/1.1 opisanymi w tym dokumencie. Aby uzyskać więcej informacji, zobacz Dodatek B.

  5. Zaktualizuj i ponownie skompiluj wszelkie aplikacje korzystające z usług WinHTTP hostowanych w systemie Server 2012 lub starszym.

    1. Aplikacje zarządzane — skompiluj ponownie i zmień wersję środowiska .NET Framework na najnowszą

    2. W aplikacjach należy dodać kod umożliwiający obsługę protokołu TLS 1.2 za pomocą funkcji WinHttpSetOption

  6. Aby uzyskać dodatkową pewność, przeskanuj kod źródłowy oraz pliki konfiguracji usług online pod kątem wymienionych poniżej wzorców, odpowiadających wartościom typu wyliczeniowego najczęściej używanym do zapisywania wersji protokołu TLS na stałe:

    1. SecurityProtocolType

    2. SSLv2, SSLv23, SSLv3, TLS1, TLS 10, TLS11

    3. WINHTTP_FLAG_SECURE_PROTOCOL_

    4. SP_PROT_

    5. NSStreamSocketSecurityLevel

    6. PROTOCOL_SSL lub PROTOCOL_TLS

Zalecanym rozwiązaniem we wszystkich powyższych przypadkach jest usunięcie zapisanego na stałe wyboru wersji protokołu i powrót do wersji domyślnej dla systemu operacyjnego. Jeśli używasz narzędzia DevSkim, kliknij tutaj, aby zobaczyć reguły obejmujące opisane powyżej kontrole, które możesz zastosować we własnym kodzie.

W programie Windows PowerShell jest używane środowisko .NET Framework 4.5, w którym protokół TLS w wersji 1.2 nie jest dostępny. Aby obejść to ograniczenie, dostępne są dwa rozwiązania:

  1. Zmodyfikuj podany skrypt, aby uwzględnić następujące elementy:

    [System.Net.ServicePointManager]::SecurityProtocol = [System.Net.SecurityProtocolType]::Tls12;
    
  2. Dodaj klucz rejestru dla całego systemu (na przykład za pomocą zasad grupy) na wszystkich maszynach, które muszą nawiązywać połączenia z użyciem protokołu TLS 1.2 z poziomu aplikacji .NET. Dzięki temu środowisko .NET będzie korzystało z wersji protokołu TLS domyślnej dla systemu operacyjnego, a więc protokół TLS 1.2 stanie się dostępny ORAZ w skryptach będzie można korzystać z przyszłych wersji protokołu TLS, jeśli tylko będą obsługiwane przez system operacyjny. Dotyczy to na przykład wersji TLS 1.3.

    reg add HKLM\SOFTWARE\Microsoft.NETFramework\v4.0.30319 /v SystemDefaultTlsVersions /t REG_DWORD /d 1 /f /reg:64

    reg add HKLM\SOFTWARE\Microsoft.NETFramework\v4.0.30319 /v SystemDefaultTlsVersions /t REG_DWORD /d 1 /f /reg:32

Rozwiązania (1) i (2) wzajemnie się wykluczają, co oznacza, że nie należy ich stosować razem.

Ponowne kompilowanie aplikacji zarządzanych/zmiana wersji środowiska .NET Framework na najnowszą

Aplikacje korzystające z wersji środowiska .NET Framework starszych niż 4.7 mogą mieć ograniczenia, które w praktyce uniemożliwiają obsługę wersji protokołu TLS wyższych niż 1.0 niezależnie od wartości domyślnych w systemie operacyjnym. Aby uzyskać więcej informacji, zapoznaj się z poniższym diagramem i najlepszymi rozwiązaniami dotyczącymi protokołu Transport Layer Security (TLS) w programie .NET Framework .

Ponowne kompilowanie aplikacji zarządzanych

Parametr SystemDefaultTLSVersion ma pierwszeństwo przed wersją protokołu TLS określoną na poziomie aplikacji. Zalecanym najlepszym rozwiązaniem jest korzystanie zawsze z domyślnej wersji protokołu TLS dla systemu operacyjnego. Jest to też jedyne rozwiązanie zapewniające zręczność kryptograficzną i umożliwiające korzystanie z przyszłej obsługi protokołu TLS 1.3 w aplikacjach.

W przypadku korzystania ze starszych wersji programu .NET Framework, np. 4.5.2 lub 3.5, domyślnie aplikacja będzie używać starszych i niezalecanych protokołów, takich jak SSL 3.0 lub TLS 1.0. Zdecydowanie zaleca się uaktualnienie do nowszych wersji programu .NET Framework, np. .NET Framework 4.6, lub ustawienie odpowiednich kluczy rejestru dla opcji „UseStrongCrypto”.

Testowanie obsługi protokołu TLS w wersji 1.2 lub nowszej

Po wprowadzeniu poprawek opisanych w powyższej sekcji należy przeprowadzić testy regresyjne produktów pod kątem błędów negocjacji protokołu oraz zgodności z innymi systemami operacyjnymi używanymi w przedsiębiorstwie.

  • Najczęstszym problemem podczas testów regresyjnych będzie niepowodzenie negocjacji protokołu TLS związane z próbą nawiązania połączenia przez klienta korzystającego z systemu operacyjnego lub przeglądarki bez obsługi protokołu TLS 1.2.

    • Na przykład w przypadku klienta z systemem Vista wystąpi niepowodzenie negocjacji protokołu TLS z serwerem skonfigurowanym do użycia wersji 1.2 lub nowszej, ponieważ najwyższa wersja protokołu TLS obsługiwana w systemie Vista to 1.0. W środowisku opartym na protokole TLS w wersji 1.2 lub nowszej konieczne jest uaktualnienie lub wycofanie takiego klienta.
  • Produkty korzystające z wzajemnego uwierzytelniania protokołu TLS za pomocą certyfikatu mogą wymagać dodatkowych testów regresyjnych, ponieważ kod wyboru certyfikatu dla protokołu TLS 1.0 był mniej zaawansowany niż w przypadku protokołu TLS 1.2.

    • W przypadku produktów negocjujących wzajemne uwierzytelnianie protokołu TLS za pomocą certyfikatu z niestandardowej lokalizacji (poza standardowymi nazwanymi magazynami certyfikatów w systemie Windows) może być konieczne zaktualizowanie kodu w celu zapewnienia prawidłowego pobrania certyfikatu.
  • Współzależności między usługami należy sprawdzić pod kątem potencjalnych problemów.

    • Wszystkie usługi, które współdziałają z usługami innych firm, wymagają dodatkowych testów współdziałania z tymi usługami innych firm.

    • Wszelkie używane aplikacje dla systemów innych niż Windows oraz systemy operacyjne serwera inne niż Windows wymagają sprawdzenia lub potwierdzenia możliwości obsługi protokołu TLS w wersji 1.2. Najłatwiejszym sposobem jest przeprowadzenie skanowania.

Prosty plan testowania tych zmian w usłudze online obejmuje następujące elementy:

  1. Przeprowadź skanowanie systemów w środowisku produkcyjnym w celu zidentyfikowania systemów operacyjnych nieobsługujących protokołu TLS 1.2.

  2. Przeskanuj kod źródłowy i pliki konfiguracji usługi online pod kątem zapisanej na stałe wersji protokołu TLS zgodnie z opisem w sekcji Znajdowanie i poprawianie zależności od protokołu TLS 1.0 w kodzie

  3. Zaktualizuj/ponownie skompiluj aplikacje stosownie do potrzeb:

    1. Aplikacje zarządzane

      1. Skompiluj ponownie przy użyciu najnowszej wersji środowiska .NET Framework.

      2. Upewnij się, że wszelkie użyte wyliczenia SSLProtocols są ustawione na wartość SSLProtocols.None, co zapewnia użycie ustawień domyślnych systemu operacyjnego.

    2. Aplikacje WinHTTP — skompiluj ponownie z użyciem funkcji WinHttpSetOption w celu obsługi protokołu TLS 1.2.

  4. Rozpocznij testowanie w środowisku przedprodukcyjnym lub przejściowym, wyłączając wszystkie protokoły zabezpieczeń starsze niż TLS 1.2 w rejestrze.

  5. Popraw wszystkie pozostałe wystąpienia wersji protokołu TLS zapisanej na stałe wykryte podczas testowania. Ponownie wdróż oprogramowanie i wykonaj kolejny przebieg testów regresyjnych.

Powiadamianie partnerów o planach wycofania protokołu TLS 1.0

Po rozwiązaniu problemów z zapisaną na stałe wersją protokołu TLS i przeprowadzeniu wymaganych aktualizacji systemów operacyjnych i struktur programistycznych należy skoordynować działania związane z wycofaniem protokołu TLS 1.0 z klientami i partnerami:

  • Pomyślne przeprowadzenie wycofania protokołu TLS 1.0 wymaga wczesnego skontaktowania się z partnerami i klientami. Powinno to obejmować co najmniej publikację wpisów w blogu, oficjalnych dokumentów lub innych treści internetowych.

  • Każdy z partnerów musi ocenić swoją gotowość do korzystania z protokołu TLS 1.2 poprzez działania obejmujące skanowanie systemów operacyjnych i kodu oraz testy regresyjne opisane w powyższych sekcjach.

Podsumowanie

Usuwanie zależności od protokołu TLS 1.0 to złożony i kompleksowy proces. Firma Microsoft i jej partnerzy branżowi już dziś podejmują działania w tym zakresie, aby zapewnić wyższy domyślny poziom bezpieczeństwa całego naszego stosu produktów, od składników systemu operacyjnego i struktur programistycznych po tworzone na ich podstawie aplikacje i usługi. Zalecenia przedstawione w tym dokumencie pomogą Twojej firmie w sformułowaniu właściwego planu działania i przygotowaniu się na wyzwania związane z tym procesem. Ułatwią one również przygotowanie się na tę zmianę Twoim klientom.

Dodatek A: Symulacja uzgadniania dla różnych klientów łączących się z www.microsoft.com, dzięki uprzejmości SSLLabs.com

Wyniki symulacji uzgadniania

Dodatek B: Wycofanie protokołu TLS 1.0/1.1 przy zachowaniu trybu FIPS

Wykonaj przedstawione poniżej czynności, jeśli chcesz wycofać protokół TLS 1.0/1.1, ale Twoja sieć wymaga stosowania trybu FIPS:

  1. Skonfiguruj wersje protokołu TLS za pośrednictwem rejestru, ustawiając parametr „Enabled” na wartość zero w przypadku wersji protokołu TLS, których nie chcesz używać.

  2. Wyłącz krzywą 25519 (tylko system Windows Server 2016) za pośrednictwem zasad grupy.

  3. Wyłącz wszelkie zestawy szyfrowania korzystające z algorytmów niedozwolonych przez odpowiednią publikację FIPS. W przypadku systemu Windows Server 2016 (przy założeniu, że są stosowane ustawienia domyślne) oznacza to wyłączenie zestawów szyfrowania RC4, PSK i NULL.

Współautorzy/podziękowania

Mark Cartwright
Bryan Sullivan
Patrick Jungles
Michael Scovetta
Tony Rice
David LeBlanc
Mortimer Cook
Daniel Sommerfeld
Andrei Popov
Michiko Short
Justin Burke
Gov Maharaj
Brad Turner
Sean Stevenson