Was ist das Standardsicherheitsprotokoll für die Kommunikation mit Servern, die bis zu unterstützen TLS 1.2
? Wille.NET
standardmäßig das höchste Sicherheitsprotokoll, das auf der Serverseite unterstützt wird, oder muss ich diese Codezeile explizit hinzufügen:
System.Net.ServicePointManager.SecurityProtocol =
SecurityProtocolType.Tls | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12;
Gibt es neben einer Codeänderung eine Möglichkeit, diese Standardeinstellung zu ändern?
Schließlich unterstützt .NET 4.0
nur bis zu TLS 1.0
? dh ich muss Client-Projekte auf 4.5 aktualisieren, um zu unterstützenTLS 1.2
.
Meine Motivation ist es, die Unterstützung für zu entfernen SSLv3
auf der Clientseite auch wenn der Server dies unterstützt (ich habe bereits ein Powershell-Skript, um dies in der Maschinenregistrierung zu deaktivieren) und das höchste vom Server unterstützte TLS-Protokoll zu unterstützen.
Update:
Wenn ich mir die ServicePointManager
Klasse in .NET 4.0
ansehe, sehe ich keine aufgezählten Werte für TLS 1.0
und 1.1
. In beiden .NET 4.0/4.5
Fällen ist die Standardeinstellung SecurityProtocolType.Tls|SecurityProtocolType.Ssl3
. Hoffentlich wird dieser Standard nicht durch Deaktivieren SSLv3
in der Registrierung unterbrochen.
Ich habe jedoch beschlossen, alle Apps auf alle Bootstrapping-Codes aller Anwendungen zu aktualisieren .NET 4.5
und sie SecurityProtocolType.Tls | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12;
trotzdem explizit hinzuzufügen .
Dadurch werden ausgehende Anforderungen an verschiedene APIs und Dienste gesendet, um kein Downgrade durchzuführen, SSLv3
und es sollte die höchste Ebene von ausgewählt werden TLS
.
Klingt dieser Ansatz vernünftig oder übertrieben? Ich muss viele Anwendungen aktualisieren, und ich möchte sie zukunftssicher machen, da ich höre, TLS 1.0
dass einige Anbieter in naher Zukunft möglicherweise sogar veraltet sind.
Hat das Deaktivieren von SSL3 in der Registrierung als Client, der ausgehende Anforderungen an APIs stellt, überhaupt Auswirkungen auf das .NET Framework? Ich sehe standardmäßig, TLS 1.1 und 1.2 sind nicht aktiviert. Müssen wir es über die Registrierung aktivieren? RE http://support.microsoft.com/kb/245030 .
Nach einigen Nachforschungen glaube ich, dass die Registrierungseinstellungen keine Auswirkungen haben werden, da sie für IIS (Server-Unterschlüssel) und Browser (Client-Unterschlüssel) gelten.
Entschuldigung, dieser Beitrag wurde zu mehreren Fragen, gefolgt von "vielleicht" Antworten.
Antworten:
Einige derjenigen, die Kommentare hinterlassen, haben diese Einstellung zur Kenntnis genommen
System.Net.ServicePointManager.SecurityProtocol
bestimmter Werte dazu führt, dass Ihre App zukünftige TLS-Versionen nicht nutzen kann, die möglicherweise die Standardwerte in zukünftigen Updates für .NET werden. Anstatt eine feste Liste von Protokollen anzugeben, können Sie stattdessen Protokolle aktivieren oder deaktivieren, die Sie kennen und für die Sie sich interessieren, und alle anderen Protokolle so lassen, wie sie sind.So aktivieren Sie TLS 1.1 und 1.2, ohne andere Protokolle zu beeinflussen:
Beachten Sie die Verwendung von
|=
, um diese Flags einzuschalten, ohne andere auszuschalten.So deaktivieren Sie SSL3, ohne andere Protokolle zu beeinflussen:
quelle
[Net.ServicePointManager]::SecurityProtocol = ([Net.ServicePointManager]::SecurityProtocol -bor [Net.SecurityProtocolType]::Tls11 -bor [Net.SecurityProtocolType]::Tls12)
Invoke-RestMethod und basiert auf denselben zugrunde liegenden .NET Framework-Bibliotheken.Net.ServicePointManager.SecurityProtocol = Net.ServicePointManager.SecurityProtocol OR Net.SecurityProtocolType.Tls12 OR Net.SecurityProtocolType.Tls12
Der Standard
System.Net.ServicePointManager.SecurityProtocol
in beiden .NET4.0/4.5
istSecurityProtocolType.Tls|SecurityProtocolType.Ssl3
..NET 4.0
unterstützt bis zu einerTLS 1.0
Weile.NET 4.5
unterstützt bis zuTLS 1.2
Jedoch ist eine Anwendung Targeting
.NET 4.0
unterstützen kann noch bis zu ,TLS 1.2
wenn.NET 4.5
in der gleichen Umgebung installiert..NET 4.5
wird oben installiert.NET 4.0
und ersetztSystem.dll
.Ich habe dies überprüft, indem ich das korrekte Sicherheitsprotokoll beobachtet habe, das im Datenverkehr mit festgelegt wurde,
fiddler4
und indem ich die aufgezählten Werte in einem.NET 4.0
Projekt manuell festgelegt habe :Referenz:
Wenn Sie den Hack in einer Umgebung versuchen, in der NUR
.NET 4.0
installiert ist, wird die Ausnahme angezeigt:Ich würde diesen "Hack" jedoch nicht empfehlen, da ein zukünftiger Patch usw. ihn möglicherweise beschädigen kann. *
Aus diesem Grund habe ich beschlossen, dass der beste Weg zum Entfernen der Unterstützung folgende
SSLv3
ist:.NET 4.5
Fügen Sie dem Boostrapping-Code Folgendes hinzu, um den Standard- und Zukunftssicherungscode zu überschreiben:
System.Net.ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12;
* Jemand korrigiert mich, wenn dieser Hack falsch ist, aber erste Tests, die ich sehe, funktionieren
quelle
ServicePointManager.cs
siehe Referenzenource.microsoft.com/#System/net/System/Net/….NET 4.5
die Standardeinstellungen für Tls12 beanspruchen - aber wie Sie hier angegeben haben, ist dies nicht der Fall. Es gibt Ihnen die Möglichkeit, es fürSecurityProtocol
SecurityProtocolType.Tls | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12
unter support.microsoft.com/en-us/help/3069494/…Sie können das Standardverhalten in der folgenden Registrierung überschreiben:
und
Einzelheiten finden Sie in der Implementierung von
ServicePointManager
.quelle
reg add HKLM\SOFTWARE\Microsoft\.NETFramework\v4.0.30319 /v SchUseStrongCrypto /t REG_DWORD /d 1 /reg:64
(und / oder/reg:32
)Erstellen Sie eine Textdatei mit einer
.reg
Erweiterung und den folgenden Inhalten:Oder laden Sie es von folgender Quelle herunter:
https://tls1test.salesforce.com/s/NET40-Enable-TLS-1_2.reg
Doppelklicken Sie zum Installieren ...
quelle
Ich habe festgestellt, dass, wenn ich nur TLS 1.2 spezifiziere, es immer noch auf 1.1 verhandelt.
System.Net.ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;
Ich habe dies in der Global.asax-Startmethode für meine .net 4.5-Webanwendung angegeben.
quelle
Der folgende Code wird:
Konstanten:
Andere Protokolle sind nicht betroffen. Dies macht dies kompatibel mit zukünftigen Protokollen (Tls1.3 usw.).
Code
Ausgabe
quelle
Ich habe das Problem erhalten, als mein Kunde TLS von 1.0 auf 1.2 aktualisiert hat. Meine Anwendung verwendet .net Framework 3.5 und wird auf dem Server ausgeführt. Also habe ich es so behoben:
Fügen Sie vor dem Aufruf von HttpWebRequest.GetResponse () den folgenden Befehl hinzu:
Erweitert 2 DLLs durch Hinzufügen von 2 neuen Klassen: System.Net und System.Security.Authentication
Batch herunterladen:
Zum Download Batch und weitere Details finden Sie hier:
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
quelle
Der Mechanismus zur Änderung der Registrierung hat nach einem Kampf für mich funktioniert. Eigentlich lief meine Anwendung als 32bit. Also musste ich den Wert unter Pfad ändern.
Der Werttyp muss DWORD und ein Wert über 0 sein. Besser 1 verwenden.
quelle
Ich arbeite unter .NET 4.5.2 und war mit keiner dieser Antworten zufrieden. Da ich mit einem System spreche, das TLS 1.2 unterstützt und SSL3, TLS 1.0 und TLS 1.1 defekt und für die Verwendung unsicher sind, möchte ich diese Protokolle nicht aktivieren. Unter .NET 4.5.2 sind die Protokolle SSL3 und TLS 1.0 standardmäßig aktiviert, was ich durch Überprüfen im Code sehen kann
ServicePointManager.SecurityProtocol
. Unter .NET 4.7 gibt es das NeueSystemDefault
Protokollmodus, der die Auswahl des Protokolls explizit an das Betriebssystem übergibt, wobei ich der Meinung bin, dass es angemessen wäre, sich auf die Registrierung oder andere Systemkonfigurationseinstellungen zu verlassen. Dies scheint jedoch unter .NET 4.5.2 nicht unterstützt zu werden. Im Interesse des Schreibens von vorwärtskompatiblem Code trifft dies auch dann die richtigen Entscheidungen, wenn TLS 1.2 in Zukunft unvermeidlich beschädigt wird oder wenn ich auf .NET 4.7+ aktualisiere und mehr Verantwortung für die Auswahl eines geeigneten Protokolls an das Betriebssystem übergebe Ich habe den folgenden Code übernommen:Dieser Code erkennt, wenn ein bekanntes unsicheres Protokoll aktiviert ist. In diesem Fall werden diese unsicheren Protokolle entfernt. Wenn keine anderen expliziten Protokolle übrig bleiben, erzwingen wir die Aktivierung von TLS 1.2, dem einzigen bekannten sicheren Protokoll, das zu diesem Zeitpunkt von .NET unterstützt wird. Dieser Code ist vorwärtskompatibel, da er neue Protokolltypen berücksichtigt, von denen er nicht weiß, dass sie in Zukunft hinzugefügt werden, und er wird auch mit dem neuen gut funktionieren
SystemDefault
Status in .NET 4.7, was bedeutet, dass ich diesen Code in Zukunft nicht mehr besuchen muss. Ich würde dringend empfehlen, einen solchen Ansatz zu wählen, anstatt bestimmte Sicherheitsprotokollzustände bedingungslos fest zu codieren. Andernfalls müssen Sie Ihren Client neu kompilieren und durch eine neue Version ersetzen, um bei TLS 1.2 auf ein neues Sicherheitsprotokoll zu aktualisieren ist unweigerlich defekt, oder es ist wahrscheinlicher, dass Sie die vorhandenen unsicheren Protokolle jahrelang auf Ihrem Server aktiviert lassen müssen, was Ihre Organisation zu einem Ziel für Angriffe macht.quelle
SecurityProtocolType.SystemDefault
Flag als ausgewertet. Wenn Sie0
alsoif (securityProtocols == 0)
mit dem Bitwise Inclusive oder Flag für TLS 1.2 prüfen, wird TLS 1.2 immer enthalten, auch wenn es "pausiert" ist, oder? Nicht scharfes Schießen hier. Ich versuche wirklich, den besten Weg vorwärts zu finden.if (!Enum.IsDefined(typeof(SecurityProtocolType), 0) && securityProtocols == 0) { securityProtocols |= SecurityProtocolType.Tls12; }
.securityProtocols |= SecurityProtocolType.Tls12;
(ohne if-Block) SystemDefault nicht verwaltet. Die securityProtocols haben danach nur TLS2. Meinen Sie also, wenn der Wert SystemDefault ist, sollte kein Wert aktualisiert werden? Gehen Sie in Bezug auf die Vorwärtskompatibilität davon aus, dass das Betriebssystem dafür sorgt, dass neuere Protokolle wie TLS 1.3 aktiviert werden?securityProtocols |= SecurityProtocolType.Tls12;' will add TLS 1.2, but because the
SecurityProtocolType` enum hat ein[Flags]
Attribut, und der SystemDefault-Aufzählungswert ist0
, der SystemDefault-Wert wird entfernt, selbst wenn er zuvor festgelegt wurde. Das Endergebnis ist, dass Sie entweder denSevicePointManager.SecurityProtocol
Wert auf 0 oder eine beliebige Kombination der anderen Aufzählungswerte setzen können. Wenn Sie SystemDefault festlegen, können Sie das Protokoll grundsätzlich nicht selbst angeben und das Betriebssystem entscheiden lassen.Microsoft hat kürzlich Best Practices veröffentlicht. https://docs.microsoft.com/en-us/dotnet/framework/network-programming/tls
Zusammenfassung
Entfernen Sie in .NET Framework 4.7 den Code, der das SecurityProtocol festlegt, damit das Betriebssystem sicherstellt, dass Sie die sicherste Lösung verwenden.
NB: Sie müssen auch sicherstellen, dass die neueste Version von TLS auf Ihrem Betriebssystem unterstützt und aktiviert wird.
Weitere Informationen und ältere Frameworks finden Sie unter dem MS-Link.
quelle
if (System.Environment.OSVersion.Version < new Version(6, 2) /* Windows 8 */) ServicePointManager.SecurityProtocol |= SecurityProtocolType.Tls | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12; else ServicePointManager.SecurityProtocol = SecurityProtocolType.SystemDefault;
Der Vollständigkeit halber finden Sie hier ein Powershell-Skript, mit dem die oben genannten Registrierungsschlüssel festgelegt werden:
quelle
Eine Alternative zur Hardcodierung
ServicePointManager.SecurityProtocol
oder zum expliziten SchUseStrongCrypto- Schlüssel wie oben erwähnt:Sie können .NET anweisen, die Standard-SCHANNEL-Einstellungen mit dem SystemDefaultTlsVersions-Schlüssel zu verwenden,
z.
quelle
Die BESTE Lösung für dieses Problem scheint ein Upgrade auf mindestens .NET 4.6 oder höher zu sein, bei dem automatisch starke Protokolle sowie starke Chiffren ausgewählt werden.
Wenn Sie kein Upgrade auf .NET 4.6 durchführen können, empfehlen wir die Einstellung
System.Net.ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12;
Und mit den Registrierungseinstellungen:
HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft.NETFramework \ v4.0.30319 - SchUseStrongCrypto = DWORD von 1 HKEY_LOCAL_MACHINE \ SOFTWARE \ Wow6432Node \ Microsoft.NETFramework \ v4.0.30319 - SchUseStrongCrypto = DWORD von 1
Dies führt dazu, dass etwas anderes als TLS 1.0 und eine starke Verschlüsselung verwendet werden.
Bei meinen Tests hat nur die Einstellung im Wow6432Node einen Unterschied gemacht, obwohl meine Testanwendung für jede CPU erstellt wurde.
quelle
Gemäß den Best Practices für Transport Layer Security (TLS) mit .NET Framework : Um sicherzustellen, dass .NET Framework-Anwendungen sicher bleiben, sollte die TLS-Version nicht fest codiert werden. Legen Sie stattdessen die Registrierungsschlüssel fest:
SystemDefaultTlsVersions
undSchUseStrongCrypto
:quelle
Wenn Sie .NET 4.7.1 oder höher verwenden können, wird TLS 1.2 als Mindestprotokoll verwendet, das auf den Funktionen des Betriebssystems basiert. Gemäß Microsoft-Empfehlung:
quelle
Für Schlüssel: HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft.NETFramework \ v4.0.30319 Wert: SchUseStrongCrypto
Sie müssen den Wert auf 1 setzen.
quelle