TLS 1.2 in .NET Framework 4.0

74

Ich habe einen Windows Server 2008 R2-Server, auf dem ein Dutzend .NET Framework 4.0-WebForms-Anwendungen ausgeführt werden, und ich muss TLS 1.0 und niedriger deaktivieren. Wenn ich das mache, schlagen alle sicheren Verbindungen fehl und ich musste TLS 1.0 wieder aktivieren. Gibt es eine Möglichkeit, TLS 1.2 in einer Framework 4.0-Umgebung zu verwenden? Vielleicht fehlt mir etwas?

Aufgrund von Einschränkungen der von uns verwendeten CMS-Version können wir das Framework derzeit nicht aktualisieren.

Betagreg
quelle

Antworten:

41

Die einzige Möglichkeit, dies zu ändern, ist direkt im Code:

Ganz am Anfang Ihrer App legen Sie fest

ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;

Sie sollten die system.netKlasse einschließen

Ich habe dies getan, bevor ich einen Webdienst aufgerufen habe, weil wir auch tls1 blockieren mussten.

Mike
quelle
28
Dies funktioniert nicht für Projekte, die auf .NET 4.0 abzielen, da SecurityProtocolTypekein Mitglied vorhanden ist Tls12.
Martin
55
ServicePointManager.SecurityProtocol = (SecurityProtocolType) 3072; Dies funktioniert in 4.0, obwohl möglicherweise Ihre Laufzeit vollständig gepatcht / aktualisiert werden muss.
STW
8
Während dies ein Jahr alt ist, ist die Antwort in meinen Augen falsch! Es sollte mit der Antwort von @STW
RoLYroLLs
11
Die akzeptierte Antwort ist falsch, wenn Sie .NET 4.0
Krishnan Venkiteswaran
4
Codieren Sie das Sicherheitsprotokoll nicht fest. Siehe TLS Best Practices mit .NET
user24601
87

Wenn Sie der system.netKlassenbibliothek keine Eigenschaft hinzufügen können .

Dann fügen Sie in Global.asax - Datei:

ServicePointManager.SecurityProtocol = (SecurityProtocolType)3072; //TLS 1.2
ServicePointManager.SecurityProtocol = (SecurityProtocolType)768; //TLS 1.1

Und Sie können es in einer Funktion an der Startzeile verwenden:

ServicePointManager.SecurityProtocol = (SecurityProtocolType)768 | (SecurityProtocolType)3072;

Und es ist nützlich für das STRIPEZahlungsgateway, das nur TLS 1.1 und TLS 1.2 unterstützt.

BEARBEITEN: Nachdem so viele Fragen zu .NET 4.5 auf meinem Server installiert sind oder nicht ... hier ist der Screenshot von Registryauf meinem Produktionsserver:

Ich habe nur .NET Framework 4.0 installiert.

Registrierung

Vikrant
quelle
5
Ich denke, dies erfordert die Installation von .net 4.5, daher ist dies technisch gesehen kein Fix für .net 4.0.
NickG
2
Für die Kompilierung muss .NET 4.5 installiert sein, Sie müssen es jedoch nicht im Projekt als Ziel festlegen.
Martin
3
Zukünftige Bestätigung für jedermann: Dies funktioniert unter VB .NET 3.5. ServicePointManager.SecurityProtocol = DirectCast(3072, SecurityProtocolType) 'TLS 1.2
Petrosmm
1
@Martin, aber Sie müssen .NET 4.5 auf dem Zielcomputer installiert haben, damit dies funktioniert.
NickG
4
Der beigefügte Screenshot beweist nicht, dass kein 4.5+ Framework installiert ist. Sie werden unter v4 / Vollständiger Schlüssel mit dem Schlüsselwort "Release" angezeigt
pushist1y
68

Nehmen Sie die folgenden Änderungen in Ihrer Registrierung vor und es sollte funktionieren:

1.) Starke Kryptografie- Registrierungsschlüssel für .NET Framework

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework\v4.0.30319]
"SchUseStrongCrypto"=dword:00000001

[HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\.NETFramework\v4.0.30319]
"SchUseStrongCrypto"=dword:00000001

2.) TLS 1.2- Registrierungsschlüssel für Secure Channel (Schannel)

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.2]

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.2\Client]
"DisabledByDefault"=dword:00000000
"Enabled"=dword:00000001

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.2\Server]
"DisabledByDefault"=dword:00000000
"Enabled"=dword:00000001
Aditya Landge
quelle
6
Dies funktionierte perfekt und ich musste nicht die Codezeile hinzufügen, über die die anderen Beiträge sprechen.
Baxter
5
Es war fantastisch, dass .Net40 mit TLS 1.2-Zahlungsgateways und Mailservern kommunizieren konnte. Der Neustart des WWW-Veröffentlichungsdienstes war ausreichend, damit er funktioniert.
ExternalUse
4
Ich brauchte alle diese Schlüssel / Werte und musste auch den Server neu starten, aber danach wurde TLS 1.2 in einer .NET 4.0-Anwendung ohne Codeänderungen unterstützt.
Cori
3
Ich wünschte, ich hätte nicht 5 Stunden gebraucht, um diesen Beitrag zu finden. Dies hat meinen SSL-Handshake-Fehler behoben (Die Anforderung wurde abgebrochen: Sicherer SSL / TLS-Kanal konnte nicht erstellt werden).
Birken25
3
Danke!!! Dies löste mein Problem mit den Markdown-Rendering-Diensten von github über MarkdownPad.
Rev.
25

Nach dieser , müssen Sie .NET 4.5 installiert. Weitere Informationen finden Sie auf der Webseite. Das Wesentliche dabei ist, dass Ihre 4.0-Apps nach der Installation von .NET 4.5 die 4.5 System.dll verwenden. Sie können TLS 1.2 auf zwei Arten aktivieren:

  • Fügen Sie zu Beginn der Anwendung diesen Code hinzu: ServicePointManager.SecurityProtocol = (SecurityProtocolType)3072;
  • Setzen Sie den Registrierungsschlüssel HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework\v4.0.30319: SchUseStrongCryptoaufDWORD 1
BrainStorm.exe
quelle
3
Um TLS 1.2 ohne Codeänderungen zu erhalten, muss zusätzlich zu den Registrierungsschlüsseln auch .NET 4.6 installiert sein. Weitere Infos hier: github.com/TheLevelUp/pos-tls-patcher
user24601
12

Ich habe in VB codiert und konnte meiner Datei Global.asax.vb in Application_Start die folgende Zeile hinzufügen

ServicePointManager.SecurityProtocol = CType(3072, SecurityProtocolType)    'TLS 1.2
user2721607
quelle
2

Es gibt zwei mögliche Szenarien:

  1. Wenn Ihre Anwendung auf .net Framework 4.5 oder weniger ausgeführt wird und Sie problemlos neuen Code für die Produktion bereitstellen können, können Sie die folgende Lösung verwenden.

    Sie können die folgende Codezeile hinzufügen, bevor Sie den API-Aufruf ausführen.

    ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12; // .NET 4.5
    ServicePointManager.SecurityProtocol = (SecurityProtocolType)3072; // .NET 4.0
    
  2. Wenn Sie keinen neuen Code bereitstellen können und das Problem mit demselben Code beheben möchten, der in der Produktion vorhanden ist, haben Sie zwei Möglichkeiten.

Option 1 :

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework\v4.0.30319]
"SchUseStrongCrypto"=dword:00000001

[HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\.NETFramework\v4.0.30319]
"SchUseStrongCrypto"=dword:00000001


Erstellen Sie dann eine Datei mit der Erweiterung .regund installieren Sie sie.

Hinweis: Diese Einstellung gilt auf Registrierungsebene und gilt für alle auf diesem Computer vorhandenen Anwendungen. Wenn Sie sich auf nur eine Anwendung beschränken möchten, können Sie sie verwendenOption 2

Option 2 : Dies kann durch Ändern einiger Konfigurationseinstellungen in der Konfigurationsdatei erfolgen. Sie können entweder in Ihrer Konfigurationsdatei hinzufügen.

<runtime>
    <AppContextSwitchOverrides value="Switch.System.Net.DontEnableSchUseStrongCrypto=false"/>
</runtime>

oder

<runtime>
  <AppContextSwitchOverrides value="Switch.System.Net.DontEnableSystemDefaultTlsVersions=false"
</runtime>
Sagar Borol
quelle
0

Ich treffe das gleiche Problem auf einem Windows installierten .NET Framework 4.0.
Und ich habe dieses Problem durch die Installation von .NET Framework 4.6.2 gelöst .
Oder Sie können das neueste Paket herunterladen , um es auszuprobieren.

Krain Chen
quelle
und was ist, wenn sie 4.5 ausführen müssen?
TS
Ich habe es bereits installiert und es funktioniert nicht. Die Registrierungsschlüssel haben tatsächlich den Job gemacht.
Uwe Allner