Zaktualizuj usługę sieci Web .NET, aby korzystała z protokołu TLS 1.2

101

Muszę użyć protokołu TLS 1.2, aby połączyć się z mojej usługi internetowej .NET do innej, która wymusi protokół TLS 1.2. Znalazłem zasób, który powiedział, że .NET 4.6 używa domyślnie TLS 1.2, więc brzmi to jak najłatwiejsze rozwiązanie. Zaktualizowałem platformę .NET na serwerze i uruchomiłem ponownie. W IIS próbowałem utworzyć pulę aplikacji przy użyciu .NET 4.6, ale 4.0 było jedyną opcją. Potem znalazłem coś, co mówiło, że nadal będzie to 4.0, ponieważ 4.6 jest aktualizacją „na miejscu” do .NET 4.0. Więc pomyślałem, że może skończyłem. Jednak na stronie błędu, którą otrzymałem z niepowiązanych powodów, było napisane Microsoft .NET Framework Version:4.0.30319, że wygląda na to, że nie udało mi się zaktualizować. Jakieś wskazówki, jak upewnić się, że moja pula aplikacji używa .NET 4.6 lub bardziej ogólnie, jak włączyć protokół TLS 1.2?

nasch
źródło
4
Uważam, że na serwerze musi być włączony protokół TLS12. support.quovadisglobal.com/kb/a433/ ...
lcryder
4
Dlaczego głosy przeciw?
nasch

Odpowiedzi:

144

Właśnie zaktualizowaliśmy usługę internetową .NET do wersji 4.6, aby umożliwić TLS 1.2.

To, co mówi Artem, było pierwszymi krokami, które zrobiliśmy. Ponownie skompilowaliśmy strukturę usługi internetowej do wersji 4.6 i próbowaliśmy zmienić klucz rejestru, aby włączyć protokół TLS 1.2, chociaż to nie zadziałało: połączenie było nadal w protokole TLS 1.0. Nie chcieliśmy też blokować SLL 3.0, TLS 1.0 lub TLS 1.1 na komputerze: inne usługi sieciowe mogą tego używać; wycofaliśmy nasze zmiany w rejestrze.

Właściwie zmieniliśmy pliki Web.Config, aby powiedzieć IIS: „hej, uruchom mnie w 4.6, proszę”.

Oto zmiany, które dodaliśmy w pliku web.config + rekompilacja w .NET 4.6:

<system.web>
    <compilation targetFramework="4.6"/> <!-- Changed framework 4.0 to 4.6 -->

    <!--Added this httpRuntime -->
    <httpRuntime targetFramework="4.6" />

    <authentication mode="Windows"/>
    <pages controlRenderingCompatibilityVersion="4.0"/>
</system.web>

Połączenie zostało zmienione na TLS 1.2, ponieważ IIS uruchamia teraz usługę internetową w wersji 4.6 (o czym wyraźnie powiedziano), a 4.6 domyślnie używa protokołu TLS 1.2.

Etienne Faucher
źródło
3
Oto dokumentacja, której użyliśmy do badań: HTTPRuntime , RenderingCompatibility
Etienne Faucher
1
Rozgryzłem to - nie prosiłem o HTTPS. Po naprawieniu zadziałało.
nasch
3
W naszym przypadku wystarczyła zmiana kompilacji na 4.6 i dodanie httpRuntime 4.6, dzięki za rozwiązanie!
krilovich
2
To jest całkowicie poprawna odpowiedź. Niedawno przez to przeszedłem. Oto post na blogu na ten temat: blog.thelevelup.com/pci-security-is-your-restaurant-ready i projekt GitHub, który to robi: github.com/TheLevelUp/pos-tls-patcher
user24601
90

Dodaj następujący kod przed utworzeniem wystąpienia klienta usługi sieci Web:

System.Net.ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;

Lub dla wstecznej kompatybilności z TLS 1.1 i wcześniejszymi:

System.Net.ServicePointManager.SecurityProtocol |= SecurityProtocolType.Tls12; 
John Wu
źródło
2
Tak, już to robię, ale komunikat o błędzie nadal wskazuje .NET 4.0.
nasch
13
To jest twoja wersja CLR. NET CLR ma dwie wersje, 2.0 i 4.0. W usługach IIS określasz wersję CLR, a nie wersję Framework. IIS nie powie Ci .Net 4.6, ponieważ go to nie obchodzi. Jeśli skompilowałeś używając 4.6, to używasz 4.6.
Amy
3
TLS 1.2 jest obsługiwany od .NET 4.5 i nowszych
Gilberto Alexandre
6
W tym przypadku | = jest lepszy od just =. Są binarnymi flagami, nie nadpisuj wszystkiego niepotrzebnie.
Izzy,
2
@JohnWu - zwróć uwagę na komentarz Izzy powyżej. Twój kod mówi .NET, aby jawnie używał tylko protokołu TLS 1.2 podczas łączenia się z zasobami HTTPS. To znaczy, jeśli serwer miałby tylko protokół TLS 1.1, kod uniemożliwiłby mu połączenie, ponieważ używa tylko protokołu TLS 1.2. Powinieneś użyć | =, aby powiedzieć swojemu kodowi "spróbuj użyć TLS 1.2 jako opcji", gdy klient i serwer negocjują używany protokół.
Don Cheadle
29

jeśli używasz .Net starszego niż 4.5, nie będziesz mieć Tls12 w wyliczeniu, więc stan jest tutaj wyraźnie wymieniony

ServicePointManager.SecurityProtocol = (SecurityProtocolType)3072;
bresleveloper
źródło
Dziękuję Ci. To mi pomogło. Dla każdego, kto szukał, próbowałem utworzyć nowy folder w AzureFileStorage: fileDirectory.CreateIfNotExists (); FileDirectory jest obiektem CloudFileDirectory. Po prostu umieściłem ServicePointManager.SecurityProtocol = (SecurityProtocolType) 3072; wcześniej i to działało jak urok. Dzięki jeszcze raz.
SuperVillainPresident
17

Potrzebne są trzy kroki:

  1. Wyraźnie oznacz SSL2.0, TLS1.0, TLS1.1 jako zabronione na serwerze, dodając Enabled=0i DisabledByDefault=1do rejestru (pełna ścieżka to HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols). Szczegóły na ekranie rejestr

  2. Włącz jawnie TLS1.2, wykonując kroki z 1. Po prostu użyj odpowiednio Enabled=1i DisabledByDefault=0.

UWAGA: sprawdź wersję serwera: Windows Server 2003nie obsługuje TLS 1.2protokołu

  1. Włączyć TLS1.2 tylko na poziomie aplikacji, jak sugerowany powyżej @John Wu.

    System.Net.ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;

Mam nadzieję, że ten przewodnik pomoże.

AKTUALIZACJA Jak wspomniał @Subbu: Oficjalny przewodnik

Artem
źródło
1
Oficjalne odniesienie - technet.microsoft.com/en-us/library/ ...
Subbu
Witam @Artem czy po dodaniu tls muszę zrestartować serwer?
Simba
@Simba prawdopodobnie rozwiązałeś ten problem, ale robiąc to przed chwilą, NIE musiałem restartować serwera.
Matt N.
5

U mnie poniżej działało:

Krok 1: Pobrano i zainstalowano Web Installer exe z https://www.microsoft.com/en-us/download/details.aspx?id=48137 na serwerze aplikacji. Uruchomiono ponownie serwer aplikacji po zakończeniu instalacji.

Krok 2: Dodano poniższe zmiany w pliku web.config

<system.web>
    <compilation targetFramework="4.6"/> <!-- Changed framework 4.0 to 4.6 -->
    <!--Added this httpRuntime -->
    <httpRuntime targetFramework="4.6" />
</system.web>

Krok 3: Po wykonaniu kroków 1 i 2 wystąpił błąd „ WebForms UnobtrusiveValidationMode wymaga ScriptResourceMapping dla„ jquery ”. Dodaj ScriptResourceMapping o nazwie jquery (rozróżniana wielkość liter) ” i aby rozwiązać ten błąd, dodałem poniżej klucz w appsettings w moim pliku web.config

<appSettings>
      <add key="ValidationSettings:UnobtrusiveValidationMode" value="None" />
</appSettings>
KRM
źródło
Dodanie platformy docelowej httpRuntime zadziałało dla mnie.
Mark Redman
0

PowerBI Embedded wymaga protokołu TLS 1.2.

Odpowiedź powyżej autorstwa Etienne Faucher jest rozwiązaniem. szybki link do powyższej odpowiedzi ... szybki link do powyższej odpowiedzi ... ( https://stackoverflow.com/a/45442874 )

PowerBI wymaga protokołu TLS 1.2 czerwca 2020 r. - To jest Twoja odpowiedź - rozważ wymuszenie w środowisku wykonawczym usług IIS maksymalnie 4,6, aby wymusić domyślne zachowanie TLS 1,2, którego szukasz we frameworku. Powyższa odpowiedź daje rozwiązanie tylko do zmiany konfiguracji.

Objawy : Wymuszone Zamknięte Odrzucone połączenie TCP / IP z Microsoft PowerBI Embedded, które nagle pojawia się w Twoich systemach.

Te wywołania PowerBI po prostu przestają działać z błędem Hard TCP / IP Close, tak jakby zapora sieciowa blokowała połączenie. Zwykle kroki autoryzacji działają - kończy się to, gdy trafiasz do usługi dla określonego obszaru roboczego i identyfikatory raportu.

To jest notatka firmy Microsoft PowerBI 2020 dotycząca wymaganego protokołu TLS 1.2

PowerBIClient

metody, które pokazują ten problem

GetReportsInGroupAsync GetReportsInGroupAsAdminAsync GetReportsAsync GetReportsAsAdminAsync Microsoft.PowerBI.Api HttpClientHandler Force TLS 1.1 TLS 1.2

Wyszukiwane terminy błędów ułatwiające znalezienie tego: System.Net.Http.HttpRequestException: Wystąpił błąd podczas wysyłania żądania System.Net.WebException: Połączenie podstawowe zostało zamknięte: Wystąpił nieoczekiwany błąd podczas wysyłania. System.IO.IOException: nie można odczytać danych z połączenia transportowego: istniejące połączenie zostało wymuszone przez zdalnego hosta.

Sql Surfer
źródło