Aktualisieren Sie den .NET-Webdienst, um TLS 1.2 zu verwenden


94

Ich muss TLS 1.2 verwenden, um eine Verbindung von meinem .NET-Webdienst zu einem anderen herzustellen, der TLS 1.2 erzwingen wird. Ich habe eine Ressource gefunden, die besagt, dass .NET 4.6 standardmäßig TLS 1.2 verwendet, sodass dies nach der einfachsten Lösung klingt. Ich habe das .NET Framework auf dem Server aktualisiert und neu gestartet. In IIS habe ich versucht, einen Anwendungspool mit .NET 4.6 zu erstellen, aber 4.0 war die einzige Option. Dann habe ich etwas gefunden, das besagt, dass immer noch 4.0 angezeigt wird, da 4.6 ein "In-Place" -Update für .NET 4.0 ist. Also dachte ich, vielleicht wäre ich fertig. Auf einer Fehlerseite, die ich aus nicht verwandten Gründen erhalten habe, heißt Microsoft .NET Framework Version:4.0.30319es jedoch, dass ich anscheinend kein erfolgreiches Upgrade durchgeführt habe. Gibt es Hinweise, wie Sie sicherstellen können, dass mein Anwendungspool .NET 4.6 verwendet, oder allgemeiner, wie Sie TLS 1.2 aktivieren?


3
Ich glaube, TLS12 muss auf dem Server aktiviert sein. support.quovadisglobal.com/kb/a433/…
lcryder

3
Warum die Abstimmungen?
Nasch

Antworten:


131

Wir haben gerade einen .NET-Webdienst auf 4.6 aktualisiert, um TLS 1.2 zuzulassen.

Was Artem sagt, waren die ersten Schritte, die wir getan haben. Wir haben das Framework des Webdienstes auf 4.6 neu kompiliert und versucht, den Registrierungsschlüssel so zu ändern, dass TLS 1.2 aktiviert wird, obwohl dies nicht funktioniert hat: Die Verbindung war noch in TLS 1.0. Außerdem wollten wir SLL 3.0, TLS 1.0 oder TLS 1.1 auf dem Computer nicht verbieten: Andere Webdienste könnten dies verwenden. Wir haben unsere Änderungen in der Registrierung rückgängig gemacht.

Wir haben die Web.Config-Dateien tatsächlich geändert, um IIS mitzuteilen: "Hey, führen Sie mich bitte in 4.6 aus."

Hier sind die Änderungen, die wir in der web.config + Neukompilierung in .NET 4.6 hinzugefügt haben:

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

Die Verbindung wurde auf TLS 1.2 geändert, da IIS den Webdienst jetzt in 4.6 ausführt (explizit angegeben) und 4.6 standardmäßig TLS 1.2 verwendet.


3
Hier ist die Dokumentation, die wir für die Forschung verwendet haben: HTTPRuntime , RenderingCompatibility
Etienne Faucher

1
Ich habe es herausgefunden - ich habe kein HTTPS angefordert. Nachdem ich das behoben hatte, funktionierte es.
Nasch

3
In unserem Fall hat es gereicht, die Kompilierung auf 4.6 zu ändern und httpRuntime 4.6 hinzuzufügen. Vielen Dank für die Lösung!
Krilovich

2
Dies ist die richtige Antwort. Ich habe das kürzlich durchgemacht. Hier ist ein Blog-Beitrag darüber: blog.thelevelup.com/pci-security-is-your-restaurant-ready und ein GitHub-Projekt, das dies tut: github.com/TheLevelUp/pos-tls-patcher
user24601


84

Fügen Sie den folgenden Code hinzu, bevor Sie Ihren Webdienst-Client instanziieren:

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

Oder für die Abwärtskompatibilität mit TLS 1.1 und früheren Versionen:

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

1
Ja, das mache ich schon, aber die Fehlermeldung zeigt immer noch .NET 4.0 an.
Nasch

11
Das ist deine CLR-Version. Die .Net CLR verfügt über zwei Versionen, 2.0 und 4.0. In IIS geben Sie die CLR-Version an, nicht die Framework-Version. IIS wird es Ihnen nicht sagen. Net 4.6, weil es das nicht interessiert. Wenn Sie mit 4.6 kompiliert haben, verwenden Sie 4.6.
Amy

1
TLS 1.2 wird ab .NET 4.5 unterstützt
Gilberto Alexandre

4
In diesem Fall ist | = nur = überlegen. Sie sind binäre Flags, überschreiben Sie nicht alles andere unnötig.
Izzy

1
@ JohnWu - bitte beachte Izzys Kommentar oben. Ihr Code weist .NET an, NUR TLS 1.2 explizit zu verwenden, wenn eine Verbindung zu HTTPS-Ressourcen hergestellt wird. Wenn ein Server nur TLS 1.1 hätte, würde Ihr Code die Verbindung verhindern, da er nur TLS 1.2 verwendet. Sie sollten | = verwenden, um Ihrem Code mitzuteilen, dass "versuchen Sie, TLS 1.2 auch als Option zu verwenden", wenn Client und Server das zu verwendende Protokoll aushandeln.
Don Cheadle

26

wenn Sie mit .Net früher als 4,5 Sie werden nicht Tls12 im Enum haben so Zustand explizit erwähnt wird hier

ServicePointManager.SecurityProtocol = (SecurityProtocolType)3072;

16

Drei Schritte erforderlich:

  1. Markieren Sie SSL2.0, TLS1.0, TLS1.1 explizit auf Ihrem Server als verboten, indem Sie Enabled=0und DisabledByDefault=1zu Ihrer Registrierung hinzufügen (der vollständige Pfad lautet HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols). Siehe Bildschirm für Details Registrierung

  2. Explizit ermöglichen , TLS1.2indem sie die Schritte von 1. Benutzen Sie einfach folgenden Enabled=1und DisabledByDefault=0jeweils.

HINWEIS: Serverversion überprüfen: Windows Server 2003Unterstützt das TLS 1.2Protokoll nicht

  1. Aktivieren Sie TLS1.2nur auf App - Ebene, wie @ John Wu oben vorgeschlagen.

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

Hoffe, dieser Leitfaden hilft.

UPDATE Wie @Subbu erwähnt: Offizieller Leitfaden



Hallo @Artem, nachdem ich die tls hinzugefügt habe, muss ich den Server neu starten?
Simba

@ Simba du hast das wahrscheinlich gelöst, aber gerade jetzt musste ich den Server NICHT neu starten.
Matt N.

4

Für mich hat unten gearbeitet:

Schritt 1: Laden Sie die Web Installer-Exe von https://www.microsoft.com/en-us/download/details.aspx?id=48137 auf den Anwendungsserver herunter und installieren Sie sie . Starten Sie den Anwendungsserver nach Abschluss der Installation neu.

Schritt 2: Die folgenden Änderungen wurden in der web.config hinzugefügt

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

Schritt 3: Nach Abschluss der Schritte 1 und 2 wurde der Fehler " WebForms UnobtrusiveValidationMode erfordert ein ScriptResourceMapping für 'jquery'. Bitte fügen Sie ein ScriptResourceMapping mit dem Namen jquery (Groß- und Kleinschreibung beachten) hinzu" angezeigt. Um diesen Fehler zu beheben, habe ich den folgenden Schlüssel in den Einstellungen hinzugefügt in meiner web.config Datei

<appSettings>
      <add key="ValidationSettings:UnobtrusiveValidationMode" value="None" />
</appSettings>

Das Hinzufügen des httpRuntime-Zielframeworks hat bei mir funktioniert.
Mark Redman

0

PowerBI Embedded erfordert TLS 1.2.

Die obige Antwort von Etienne Faucher ist Ihre Lösung. Schnelllink zur obigen Antwort ... Schnelllink zur obigen Antwort ... ( https://stackoverflow.com/a/45442874 )

PowerBI erfordert TLS 1.2 Juni 2020 - Dies ist Ihre Antwort - Erwägen Sie, Ihre IIS-Laufzeit auf 4.6 zu zwingen, um das von Ihnen gesuchte Standardverhalten von TLS 1.2 aus dem Framework zu erzwingen. Die obige Antwort gibt Ihnen eine Lösung nur für Konfigurationsänderungen.

Symptome : Erzwungene geschlossene abgelehnte abgelehnte TCP / IP-Verbindung zu Microsoft PowerBI Embedded, die auf allen Systemen plötzlich angezeigt wird.

Diese PowerBI-Aufrufe funktionieren nicht mehr mit einem Hard TCP / IP Close-Fehler, als würde eine Firewall eine Verbindung blockieren. Normalerweise funktionieren die Authentifizierungsschritte. Wenn Sie den Dienst für einen bestimmten Arbeitsbereich aufrufen und IDs melden, schlägt dies fehl.

Dies ist der 2020-Hinweis von Microsoft PowerBI zu TLS 1.2

PowerBIClient

Methoden, die dieses Problem zeigen

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

Suchfehlerbegriffe, um Personen beim Auffinden zu helfen: System.Net.Http.HttpRequestException: Beim Senden der Anforderung ist ein Fehler aufgetreten. System.Net.WebException: Die zugrunde liegende Verbindung wurde geschlossen: Beim Senden ist ein unerwarteter Fehler aufgetreten. System.IO.IOException: Daten von der Transportverbindung können nicht gelesen werden: Eine vorhandene Verbindung wurde vom Remote-Host zwangsweise geschlossen.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.