Jaki jest domyślny protokół bezpieczeństwa do komunikacji z serwerami, które obsługują do TLS 1.2
? Będzie .NET
domyślnie wybierać najwyższej protokół zabezpieczeń obsługiwane po stronie serwera, czy muszę jawnie dodać poniższy wiersz kodu:
System.Net.ServicePointManager.SecurityProtocol =
SecurityProtocolType.Tls | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12;
Czy istnieje sposób na zmianę tego ustawienia domyślnego oprócz zmiany kodu?
Wreszcie, obsługuje .NET 4.0
tylko do TLS 1.0
? tj. muszę zaktualizować projekty klienta do 4.5, aby je obsługiwać TLS 1.2
.
Moją motywacją jest usunięcie obsługi SSLv3
po stronie klienta, nawet jeśli serwer ją obsługuje (mam już skrypt PowerShell, aby wyłączyć to w rejestrze komputera) i obsługę najwyższego protokołu TLS obsługiwanego przez serwer.
Aktualizacja:
Patrząc na ServicePointManager
klasę .NET 4.0
nie widzę wyliczonych wartości dla TLS 1.0
i 1.1
. W obu .NET 4.0/4.5
przypadkach wartością domyślną jest SecurityProtocolType.Tls|SecurityProtocolType.Ssl3
. Mamy nadzieję, że to ustawienie domyślne nie ulegnie awarii przez wyłączenie SSLv3
w rejestrze.
Zdecydowałem jednak, że muszę zaktualizować wszystkie aplikacje .NET 4.5
i i tak jawnie dodać je SecurityProtocolType.Tls | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12;
do kodu ładowania wszystkich aplikacji.
Spowoduje to wysłanie żądań wychodzących do różnych aplikacji i usług, aby nie obniżać poziomu SSLv3
i należy wybrać najwyższy poziom TLS
.
Czy to podejście wydaje się rozsądne czy nadmierne? Mam wiele aplikacji do zaktualizowania i chcę je w przyszłości sprawdzić, ponieważ słyszę, że TLS 1.0
niektórzy dostawcy mogą nawet w najbliższej przyszłości stracić ważność.
Czy jako klient wysyłający żądania wychodzące do interfejsów API wyłączenie protokołu SSL3 w rejestrze ma nawet wpływ na środowisko .NET? Domyślnie TLS 1.1 i 1.2 nie są włączone, czy musimy włączyć to przez rejestr? RE http://support.microsoft.com/kb/245030 .
Po krótkiej analizie uważam, że ustawienia rejestru nie będą miały wpływu, ponieważ dotyczą IIS (podklucz serwera) i przeglądarek (podklucz klienta).
Przepraszamy, ten post zamienił się w wiele pytań, a następnie w odpowiedzi „być może”.
Odpowiedzi:
Niektórzy pozostawiający komentarze zauważyli, że ustawienie
System.Net.ServicePointManager.SecurityProtocol
określonych wartości oznacza, że aplikacja nie będzie mogła korzystać z przyszłych wersji TLS, które mogą stać się wartościami domyślnymi w przyszłych aktualizacjach platformy .NET. Zamiast określać stałą listę protokołów, możesz zamiast tego włączać lub wyłączać protokoły, które znasz i na których Ci zależy, pozostawiając inne takie, jakie są.Aby włączyć TLS 1.1 i 1.2 bez wpływu na inne protokoły:
Zauważ, że
|=
możesz włączyć te flagi bez wyłączania innych.Aby wyłączyć SSL3 bez wpływu na inne protokoły:
źródło
[Net.ServicePointManager]::SecurityProtocol = ([Net.ServicePointManager]::SecurityProtocol -bor [Net.SecurityProtocolType]::Tls11 -bor [Net.SecurityProtocolType]::Tls12)
Invoke-RestMethod opiera się na tych samych bazowych bibliotekach .NET.Net.ServicePointManager.SecurityProtocol = Net.ServicePointManager.SecurityProtocol OR Net.SecurityProtocolType.Tls12 OR Net.SecurityProtocolType.Tls12
Domyślnie
System.Net.ServicePointManager.SecurityProtocol
w obu .NET4.0/4.5
jestSecurityProtocolType.Tls|SecurityProtocolType.Ssl3
..NET 4.0
obsługuje doTLS 1.0
chwili.NET 4.5
obsługuje doTLS 1.2
Jednak kierowanie na aplikacje
.NET 4.0
może nadal obsługiwać, nawetTLS 1.2
jeśli.NET 4.5
jest zainstalowane w tym samym środowisku..NET 4.5
instaluje się na górze.NET 4.0
, zastępującSystem.dll
.Zweryfikowałem to, obserwując poprawny protokół bezpieczeństwa ustawiony w ruchu
fiddler4
zi ręcznie ustawiając wyliczone wartości w.NET 4.0
projekcie:Odniesienie:
Jeśli spróbujesz włamać się do środowiska z
.NET 4.0
zainstalowanym TYLKO , otrzymasz wyjątek:Jednak nie poleciłbym tego „hacka”, ponieważ przyszła łatka itp. Może go złamać. *
Dlatego zdecydowałem, że najlepszą drogą do usunięcia wsparcia
SSLv3
jest:.NET 4.5
Dodaj następujący kod do kodu boostrapping, aby zastąpić domyślny i przyszły dowód:
System.Net.ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12;
* Ktoś mnie poprawi, jeśli ten hack jest nieprawidłowy, ale wstępne testy widzę, że działa
źródło
ServicePointManager.cs
zobaczyć referencesource.microsoft.com/#System/net/System/Net/....NET 4.5
domyślne są wartości Tls12 - ale jak już tu napisałeś, tak nie jest. Daje ci możliwość użycia go doSecurityProtocol
SecurityProtocolType.Tls | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12
/...Możesz zastąpić domyślne zachowanie w następującym rejestrze:
i
Aby uzyskać szczegółowe informacje, zobacz wdrożenie
ServicePointManager
.źródło
reg add HKLM\SOFTWARE\Microsoft\.NETFramework\v4.0.30319 /v SchUseStrongCrypto /t REG_DWORD /d 1 /reg:64
(i / lub/reg:32
)Utwórz plik tekstowy z
.reg
rozszerzeniem i następującą zawartością:Lub pobierz go z następującego źródła:
https://tls1test.salesforce.com/s/NET40-Enable-TLS-1_2.reg
Kliknij dwukrotnie, aby zainstalować ...
źródło
Przekonałem się, że kiedy podam tylko TLS 1.2, nadal będzie negocjować do 1.1.
System.Net.ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;
Podałem to w metodzie uruchamiania Global.asax dla mojej aplikacji sieci web .net 4.5.
źródło
Poniższy kod będzie:
Stałe:
Nie wpłynie to na inne protokoły. To sprawia, że jest to zgodne z przyszłymi protokołami (Tls 1.3 itp.).
Kod
Wynik
źródło
Mam problem, gdy mój klient zaktualizował TLS z 1.0 do 1.2. Moja aplikacja korzysta z .NET Framework 3.5 i działa na serwerze. Naprawiłem to w ten sposób:
Przed wywołaniem HttpWebRequest.GetResponse () dodaj następujące polecenie:
Rozszerza 2 biblioteki DLL, dodając 2 nowe klasy: System.Net i System.Security.Authentication
Pobierz pakiet:
Aby pobrać partię i więcej szczegółów, możesz zobaczyć tutaj:
https://support.microsoft.com/en-us/help/3154518/support-for-tls-system-default-versions-included-in-the-.net-framework-3.5.1-on-windows-7 -sp1-and-server-2008-r2-sp1
źródło
Mechanizm zmiany rejestru zadziałał dla mnie po walce. Właściwie moja aplikacja działała w wersji 32-bitowej. Musiałem więc zmienić wartość pod ścieżką.
Typem wartości musi być DWORD, a wartość powyżej 0. Lepsze użycie 1.
źródło
Korzystam z .NET 4.5.2 i nie byłem zadowolony z żadnej z tych odpowiedzi. Ponieważ rozmawiam z systemem obsługującym TLS 1.2 i widzę, że wszystkie SSL3, TLS 1.0 i TLS 1.1 są zepsute i niebezpieczne w użyciu, nie chcę włączać tych protokołów. W .NET 4.5.2 protokoły SSL3 i TLS 1.0 są domyślnie włączone, co widzę w kodzie poprzez sprawdzenie
ServicePointManager.SecurityProtocol
. W .NET 4.7 jest nowySystemDefault
tryb protokołu, który wyraźnie przekazuje wybór protokołu systemowi operacyjnemu, w którym moim zdaniem poleganie na rejestrze lub innych ustawieniach konfiguracji systemu byłoby odpowiednie. Nie wydaje się to jednak obsługiwane w .NET 4.5.2. W interesie pisania kodu kompatybilnego z systemem, który będzie podejmował właściwe decyzje, nawet jeśli TLS 1.2 zostanie nieuchronnie zepsuty w przyszłości lub gdy uaktualnię do .NET 4.7+ i przekażę większą odpowiedzialność za wybór odpowiedniego protokołu do systemu operacyjnego , Przyjąłem następujący kod:Ten kod wykryje, gdy włączony zostanie znany niezabezpieczony protokół, iw takim przypadku usuniemy te niebezpieczne protokoły. Jeśli nie pozostaną żadne inne jawne protokoły, wymusimy włączenie TLS 1.2, jako jedynego znanego bezpiecznego protokołu obsługiwanego przez .NET w tym momencie. Ten kod jest zgodny z poprzednimi wersjami, ponieważ weźmie pod uwagę nowe typy protokołów, o których nie wie, że zostaną dodane w przyszłości, a także będzie dobrze grał z nowym
SystemDefault
stan w .NET 4.7, co oznacza, że nie będę musiał ponownie odwiedzać tego kodu w przyszłości. Zdecydowanie zalecam przyjęcie takiego podejścia, zamiast bezwarunkowego kodowania jakichkolwiek stanów protokołu bezpieczeństwa bezwarunkowo, w przeciwnym razie będziesz musiał ponownie skompilować i zastąpić klienta nową wersją w celu uaktualnienia do nowego protokołu bezpieczeństwa, gdy TLS 1.2 jest nieuchronnie zepsuty, lub bardziej prawdopodobne, że będziesz musiał pozostawić istniejące niepewne protokoły włączone na lata na serwerze, co czyni Twoją organizację celem ataków.źródło
SecurityProtocolType.SystemDefault
flaga jest oceniana na0
, więc sprawdzanieif (securityProtocols == 0)
za pomocą włącznika bitowego lub flagi dla TLS 1.2 zawsze będzie zawierało TLS 1.2, nawet po „zerwaniu”, prawda? Nie ostre strzelanie tutaj. Naprawdę staram się znaleźć najlepszą drogę do przodu.if (!Enum.IsDefined(typeof(SecurityProtocolType), 0) && securityProtocols == 0) { securityProtocols |= SecurityProtocolType.Tls12; }
.securityProtocols |= SecurityProtocolType.Tls12;
(bez bloku jeśli) nie zachowuje SystemDefault, securityProtocols ma tylko TLS2 później. Czy masz na myśli, gdy wartość ma wartość SystemDefault, żadna wartość nie powinna być aktualizowana? Jeśli chodzi o kompatybilność do przodu, czy zakładasz, że system operacyjny zajmie się włączeniem nowszego protokołu, takiego jak TLS 1.3?securityProtocols |= SecurityProtocolType.Tls12;' will add TLS 1.2, but because the
wyliczenia SecurityProtocolType` ma[Flags]
atrybut, a wartością wyliczenia SystemDefault jest0
, wartość SystemDefault zostanie usunięta, nawet jeśli została wcześniej ustawiona. W rezultacie możesz ustawić wartośćSevicePointManager.SecurityProtocol
0 lub dowolną kombinację innych wartości wyliczenia. Jeśli ustawisz go na SystemDefault, zasadniczo rezygnujesz z samodzielnego określania protokołu i pozwalasz systemowi decydować.Firma Microsoft opublikowała ostatnio najlepsze praktyki dotyczące tego. https://docs.microsoft.com/en-us/dotnet/framework/network-programming/tls
Podsumowanie
Celuj w .Net Framework 4.7, usuń dowolny kod ustawiający SecurityProtocol, dzięki czemu system operacyjny zapewni korzystanie z najbardziej bezpiecznego rozwiązania.
Uwaga: Należy również upewnić się, że najnowsza wersja TLS jest obsługiwana i włączona w systemie operacyjnym.
Aby uzyskać więcej informacji i starszych struktur, zapoznaj się z linkiem MS.
źródło
if (System.Environment.OSVersion.Version < new Version(6, 2) /* Windows 8 */) ServicePointManager.SecurityProtocol |= SecurityProtocolType.Tls | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12; else ServicePointManager.SecurityProtocol = SecurityProtocolType.SystemDefault;
Dla kompletności, oto skrypt Powershell, który ustawia wyżej wymienione klucze rejestru:
źródło
Alternatywa dla twardego kodu
ServicePointManager.SecurityProtocol
lub jawnego klucza SchUseStrongCrypto , jak wspomniano powyżej:Możesz .NET może używać domyślnych ustawień SCHANNEL z kluczem SystemDefaultTlsVersions,
np .:
źródło
Najlepszym rozwiązaniem tego problemu wydaje się być uaktualnienie do wersji .NET 4.6 lub nowszej, która automatycznie wybierze silne protokoły, a także silne szyfry.
Jeśli nie możesz zaktualizować do wersji .NET 4.6, porada dotycząca ustawienia
System.Net.ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12;
I używając ustawień rejestru:
HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft.NETFramework \ v4.0.30319 - SchUseStrongCrypto = DWORD z 1 HKEY_LOCAL_MACHINE \ SOFTWARE \ Wow6432Node \ Microsoft.NETFramework \ v4.0.30319 - SchUseStrongCrypto = DWORD z 1
Skutkuje użyciem czegoś innego niż TLS 1.0 i silnego szyfru.
W moich testach tylko ustawienie w Wow6432Node robiło różnicę, mimo że moja aplikacja testowa została zbudowana dla dowolnego procesora.
źródło
Zgodnie z najlepszymi praktykami Transport Layer Security (TLS) z .NET Framework : Aby zapewnić bezpieczeństwo aplikacji .NET Framework, wersja TLS nie powinna być zakodowana na stałe. Zamiast tego ustaw klucze rejestru:
SystemDefaultTlsVersions
iSchUseStrongCrypto
:źródło
Jeśli możesz korzystać z .NET 4.7.1 lub nowszej wersji, użyje TLS 1.2 jako minimalnego protokołu opartego na możliwościach systemu operacyjnego. Zgodnie z zaleceniami Microsoft:
źródło
Dla klucza: HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft.NETFramework \ v4.0.30319 Wartość: SchUseStrongCrypto
Musisz ustawić wartość na 1.
źródło