Freigeben über


Bewährte Methoden für Transport Layer Security (TLS) mit .NET Framework

Hinweis

Diese Seite enthält TLS-Informationen vom .NET Framework. Wenn Sie nach .NET TLS-Informationen suchen, lesen Sie: TLS/SSL Best Practices

.NET Framework unterstützt die Verwendung des TLS-Protokolls (Transport Layer Security) zum Sichern der Netzwerkkommunikation.

Was ist der Transport Layer Security (TLS)?

Warnung

TLS 1.0 und 1.1 wurden von RFC8996 als veraltet erklärt. Dieses Dokument behandelt nur TLS 1.2 und TLS 1.3.

Das TLS-Protokoll (Transport Layer Security) ist die neueste Version des Standards, die zum Schutz der Daten im Internet entwickelt wurde. TLS 1.3 ist ein Standard, der Sicherheitsverbesserungen gegenüber früheren Versionen umfasst. Dieser Artikel enthält Empfehlungen zur Sicherung von .NET Framework-Anwendungen, die das TLS-Protokoll verwenden.

Wer kann von diesem Dokument profitieren?

TLS-Unterstützung in .NET Framework

.NET Framework ist von Schannel auf Windows abhängig. Welche Versionen ausgehandelt werden können und welche Version verwendet wird, hängt vom Betriebssystem ab.

Hier ist eine aktualisierte Beispieltabelle mit der höchsten unterstützten TLS-Version für verschiedene Kombinationen von Betriebssystemversionen und .NET Framework-Zielversionen:

.NET Framework-Zielversion Windows 10 Windows 11
3,5 TLS 1.2 TLS 1.2
4.6.2 TLS 1.2 TLS 1.3
4,7 TLS 1.2 TLS 1.3
4.7.1 TLS 1.2 TLS 1.3
4.7.2 TLS 1.2 TLS 1.3
4.8 TLS 1.2 TLS 1.3
4.8.1 TLS 1.2 TLS 1.3

Weitere Informationen finden Sie unter TLS-Protokollversionsunterstützung in Schannel.

Empfehlungen

  • Zielen Sie bei TLS 1.3 auf .NET Framework 4.8 oder neuer ab. Überprüfen Sie im Abschnitt Überprüfen des Codes, wie Sie Ihre target framework überprüfen können.
  • Spezifizieren Sie nicht die TLS-Version, d. h. verwenden Sie nicht die Methodenüberladungen von SslStream, die einen expliziten SslProtocols-Parameter annehmen.
    • Auf diese Weise lässt der Code das Betriebssystem über die TLS-Version entscheiden.
    • Wenn Sie ServicePointManager.SecurityProtocol festlegen müssen, legen Sie es auf SecurityProtocolType.SystemDefault fest. Dies verwendet auch die Standardeinstellung des Betriebssystems.
    • Wenn Sie die Methodenüberladungen von SslStream verwenden müssen, die einen expliziten SslProtocols-Parameter verwenden, übergeben Sie SslProtocols.SystemDefault als Argument. Dies verwendet auch die Standardeinstellung des Betriebssystems.
  • Führen Sie eine gründliche Codeüberprüfung durch, um sicherzustellen, dass Sie keine TLS- oder SSL-Version explizit festlegen.

Warnung

Verwenden Sie nich SslProtocols.Default, da es die TLS-Version auf SSL3 und TLS 1.0 festlegt, die veraltet sind.

Wenn Ihre App dem Betriebssystem erlaubt, die TLS-Version auszuwählen:

  • Es werden automatisch neue TLS-Protokolle genutzt, die in Zukunft hinzugefügt werden.
  • Das Betriebssystem blockiert Protokolle, die nicht sicher sind (z. B. SSL3 und TLS 1.0).

Dieser Artikel erklärt, wie Sie die höchste Sicherheit für die Version von .NET Framework erreichen, auf die Ihre App abzielt und unter der sie ausgeführt wird. Wenn eine App ein Sicherheitsprotokoll und eine Sicherheitsversion explizit festlegt, entscheidet sie sich damit gegen alle anderen Alternativen sowie gegen das Standardverhalten des .NET Frameworks und des Betriebssystems. Wenn Sie möchten, dass Ihre App eine TLS 1.3-Verbindung aushandeln kann, wird dies durch das explizite Festlegen auf eine niedrigere Version als TLS 1.3 verhindert.

Wenn Sie keine explizite Angabe einer Protokollversion vermeiden können, wird dringend empfohlen, TLS 1.2 oder TLS 1.3 (was currently considered secure ist) anzugeben. Eine Anleitung zum Identifizieren und Entfernen von TLS 1.0-Abhängigkeiten finden Sie im Whitepaper Solving the TLS 1.0 Problem (Lösung des TLS 1.0-Problems), das als Download verfügbar ist.

WCF unterstützt TLS 1.2 als Standard in .NET Framework 4.7. Ab .NET Framework 4.7.1 verwendet WCF standardmäßig die vom Betriebssystem konfigurierte Version. Wenn eine Anwendung explizit mit SslProtocols.None konfiguriert ist, verwendet WCF die Standardeinstellung des Betriebssystems für den NetTcp-Transport.

Fragen zu diesem Dokument können Sie im GitHub-Thema Transport Layer Security (TLS) best practices with the .NET Framework (Bewährte Methoden für TLS mit .NET Framework) stellen.

Überprüfen Ihres Codes und vornehmen von Codeänderungen

Für ASP.NET-Anwendungen überprüfen Sie das Element <system.web><httpRuntime targetFramework> von web.config, um sicherzustellen, dass Sie die beabsichtigte Version von .NET Framework verwenden.

Für Windows Forms und andere Anwendungen lesen Sie Vorgehensweise: Zielen auf eine bestimmte .NET Framework-Version.

Verwenden Sie die folgenden Abschnitte, um sicherzustellen, dass Sie keine bestimmte TLS- oder SSL-Version verwenden.

Explizites Festlegen eines Sicherheitsprotokolls

Wenn Sie explizit ein Sicherheitsprotokoll festlegen müssen, anstatt .NET oder das Betriebssystem die Auswahl treffen zu lassen, wählen Sie die folgenden Sicherheitsprotokolle aus:

  • Für .NET Framework 3.5: TLS 1.2
  • Für .NET Framework 4.6.2 oder höher: TLS 1.3

Wenn Sie die angegebenen Protokolle in den Enumerationen nicht finden können, können Sie die Protokolle als Erweiterungsdatei hinzufügen. Siehe unten:

SslProtocolExtensions.cs

namespace System.Security.Authentication
{
    public static class SslProtocolsExtensions
    {
        // For .NET Framework 3.5
        public const SslProtocols Tls12 = (SslProtocols)3072;
        // For .NET Framework 4.6.2 and later
        public const SslProtocols Tls13 = (SslProtocols)12288;
    }
}

SecurityProtocolExtensions.cs

using System.Security.Authentication;

namespace System.Net
{
    public static class SecurityProtocolTypeExtensions
    {
        // For .NET Framework 3.5
        public const SecurityProtocolType Tls12 = (SecurityProtocolType)SslProtocolsExtensions.Tls12;
        // For .NET Framework 4.6.2 and later
        public const SecurityProtocolType Tls13 = (SecurityProtocolType)SslProtocolsExtensions.Tls13;
    }
}

Weitere Informationen finden Sie unter Unterstützung für Standardversionen des TLS-Systems im .NET Framework 3.5 unter Windows 8.1 und Windows Server 2012 R2.

Für System.Net-APIs (HttpClient, SslStream)

In den folgenden Abschnitten wird gezeigt, wie Sie Ihre Anwendung so konfigurieren, dass sie "derzeit als sichere Versionen" von TLS (nämlich TLS 1.2 und TLS 1.3) verwendet, wenn sie auf .NET Framework 4.7 oder höher ausgerichtet ist.

Für HttpClient und HttpWebRequest

ServicePointManager verwendet das im Betriebssystem konfigurierte Standardsicherheitsprotokoll. Damit die Standardauswahl des Betriebssystems übernommen wird, sofern möglich, legen Sie keinen Wert für die ServicePointManager.SecurityProtocol-Eigenschaft fest. Diese ist standardmäßig auf SecurityProtocolType.SystemDefault festgelegt.

Da die SecurityProtocolType.SystemDefault Einstellung dazu führt, dass das ServicePointManager vom Betriebssystem konfigurierte Standardsicherheitsprotokoll verwendet wird, kann Ihre Anwendung je nach Betriebssystem, auf dem sie ausgeführt wird, anders ausgeführt werden. Beispielsweise verwendet Windows 10 TLS 1.2, während Windows 11 TLS 1.3 verwendet.

Für SslStream

SslStream Standardmäßig wird das vom Betriebssystem ausgewählte Sicherheitsprotokoll und die vom Betriebssystem ausgewählte Version verwendet. Damit standardmäßig die beste Wahl des Betriebssystems übernommen wird, verwenden Sie möglichst nicht die Methodenüberladungen von SslStream, die einen expliziten SslProtocols-Parameter übernehmen. Andernfalls übergeben Sie SslProtocols.None. Die Verwendung von Default wird nicht empfohlen. Durch die Einstellung SslProtocols.Default wird die Verwendung von SSL 3.0/TLS 1.0 erzwungen und TLS 1.2 nicht genutzt.

Legen Sie (bei HTTP-Netzwerken) keinen Wert für die SecurityProtocol-Eigenschaft fest.

Verwenden Sie (bei TCP-Socketnetzwerken) keine Methodenüberladungen von SslStream, die einen expliziten SslProtocols-Parameter übernehmen. Wenn Sie Ihre App auf das .NET Framework 4.7 oder höhere Versionen anpassen, folgen Sie der Empfehlung der bewährten Praktiken.

Für WCF-Apps

In den folgenden Abschnitten wird gezeigt, wie Sie Ihre Anwendung so konfigurieren, dass sie die "derzeit als sicher geltenden Versionen" von TLS (nämlich TLS 1.2 und TLS 1.3) verwendet.

Verwendung des TCP-Transports unter Verwendung der Transportsicherheit mit Zertifikatanmeldedaten

WCF verwendet den gleichen Netzwerkstack wie der Rest von .NET Framework.

Wenn Sie auf 4.7.1 abzielen, ist WCF so konfiguriert, dass das Betriebssystem standardmäßig das beste Sicherheitsprotokoll auswählen kann, sofern es nicht explizit an einem der folgenden Orte festgelegt ist:

  • In der Konfigurationsdatei Ihrer Anwendung
  • Oder, im Quellcode Ihrer Anwendung

.NET Framework 4.7 und höhere Versionen sind standardmäßig für die Verwendung von TLS 1.2 konfiguriert und erlauben Verbindungen mit TLS 1.1 oder TLS 1.0. Konfigurieren Sie WCF, damit das Betriebssystem das beste Sicherheitsprotokoll auswählen kann, indem Sie für Ihre Bindung die Verwendung von SslProtocols.None festlegen. Sie können dies auf SslProtocols festlegen. SslProtocols.None kann von Transport aus aufgerufen werden. NetTcpSecurity.Transport kann von Security aus aufgerufen werden.

Bei Verwendung einer benutzerdefinierten Bindung:

  • Konfigurieren Sie WCF, damit das Betriebssystem das beste Sicherheitsprotokoll auswählen kann, indem Sie für SslProtocols die Verwendung von SslProtocols.None festlegen.
  • Oder konfigurieren Sie das Protokoll, das mit dem Konfigurationspfad system.serviceModel/bindings/customBinding/binding/sslStreamSecurity:sslProtocols verwendet wird.

Wenn Sie keine benutzerdefinierte Bindung verwenden und Ihre WCF-Bindung über die Konfiguration einstellen, legen Sie das verwendete Protokoll mit dem Konfigurationspfad system.serviceModel/bindings/netTcpBinding/binding/security/transport:sslProtocols fest.

Verwenden der Nachrichtensicherheit mit Zertifikatanmeldeinformationen

.NET Framework 4.7 und höhere Versionen verwenden standardmäßig das in der SecurityProtocol-Eigenschaft angegebene Protokoll. Wenn die AppContextSwitchSwitch.System.ServiceModel.DisableUsingServicePointManagerSecurityProtocols auf true gesetzt ist, wählt WCF das beste Protokoll bis TLS 1.0.

Konfigurieren der Sicherheit über AppContext-Switches

Die in diesem Abschnitt beschriebenen AppContext-Switches sind relevant, wenn Ihre App auf .NET Framework 4.6.2 oder eine höhere Version ausgerichtet oder ausgeführt wird. Ob standardmäßig oder explizit, die Switches sollten nach Möglichkeit auf false festgelegt sein. Wenn Sie die Sicherheit über einen oder beide Switches konfigurieren möchten, geben Sie keinen Sicherheitsprotokollwert in Ihrem Code an. Dadurch werden die Schalter überschrieben.

Die Switches haben den gleichen Effekt, unabhängig davon, ob Sie HTTP-Netzwerke (ServicePointManager) oder TCP-Socketnetzwerke (SslStream) betreiben.

Switch.System.Net.DontEnableSchUseStrongCrypto

Der Wert false für Switch.System.Net.DontEnableSchUseStrongCrypto bewirkt, dass Ihre App starke Kryptographie verwendet. Durch den Wert false für DontEnableSchUseStrongCrypto werden sicherere Netzwerkprotokolle (TLS 1.2 und TLS 1.1) verwendet und nicht sichere Protokolle blockiert. Weitere Informationen finden Sie unter dem Flag SCH_USE_STRONG_CRYPTO. Ein Wert true deaktiviert eine starke Kryptographie für Ihre App. Dieser Schalter wirkt sich nur auf Clientverbindungen in Ihrer Anwendung aus (ausgehende Verbindungen).

Wenn Ihre App auf .NET Framework 4.6.2 oder höhere Versionen abzielt, wird dieser Switch standardmäßig auf false gesetzt. Das ist ein sicherer Standard, den wir empfehlen. Wenn Ihre App auf .NET Framework 4.6.2 ausgeführt wird, aber auf eine frühere Version abzielt, wird der Switch standardmäßig auf true gesetzt. In diesem Fall sollten Sie ihn explizit auf false setzen.

DontEnableSchUseStrongCrypto sollte nur dann den Wert true aufweisen, wenn Sie sich mit älteren Diensten verbinden müssen, die keine starke Kryptographie unterstützen und nicht aktualisiert werden können.

Switch.System.Net.DontEnableSystemDefaultTlsVersions

Der Wert false für Switch.System.Net.DontEnableSystemDefaultTlsVersions bewirkt, dass in Ihrer App das Protokoll vom Betriebssystem ausgewählt werden kann. Der Wert true bewirkt, dass Ihre App Protokolle verwendet, die vom .NET Framework ausgewählt wurden.

Wenn Ihre App auf .NET Framework 4.7 oder höhere Versionen ausgerichtet ist, wird dieser Switch standardmäßig auf false festgelegt. Das ist eine sichere Voreinstellung, die wir empfehlen. Wenn Ihre App unter .NET Framework 4.7 oder höheren Versionen ausgeführt wird, aber auf eine frühere Version abzielt, wird der Switch standardmäßig auf true gesetzt. In diesem Fall sollten Sie ihn explizit auf false setzen.

Konfigurieren von Schannel-Protokollen in der Windows-Registrierung

Sie können die Registrierung für eine differenzierte Kontrolle über die Protokolle verwenden, die Ihre Client- oder Server-App aushandelt. Die Vernetzung Ihrer App erfolgt über Schannel (eine andere Bezeichnung für Secure Channel). Durch die Konfiguration von Schannel können Sie das Verhalten Ihrer App konfigurieren.

Beginnen Sie mit dem Registrierungsschlüssel HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols. Unter diesem Schlüssel können Sie alle Unterschlüssel im Satz TLS 1.2, TLS 1.3 erstellen. Unter jedem dieser Unterschlüssel können Sie die Unterschlüssel Client und/oder Server anlegen. Unter Client und Server können Sie die DWORD-Werte DisabledByDefault (0 oder 1) und Enabled (0 oder 1) erstellen.

Weitere Informationen finden Sie unter: TLS Registry Settings - Schannel

Das Flag SCH_USE_STRONG_CRYPTO

Wenn es aktiviert ist (standardmäßig oder durch einen Umschalter), verwendet .NET Framework das SCH_USE_STRONG_CRYPTO-Kennzeichen, wenn Ihre App eine TLS-Verbindung zu einem Server initiiert. .NET Framework übergibt das Flag an Schannel und weist es an, bekannte schwache Kryptografiealgorithmen, Verschlüsselungssuiten und TLS/SSL-Protokollversionen zu deaktivieren, die andernfalls für eine bessere Interoperabilität aktiviert werden könnten. Weitere Informationen finden Sie unter:

Für Clientverbindungen (ausgehende Verbindungen) wird das Flag SCH_USE_STRONG_CRYPTO ebenfalls an Schannel übergeben, wenn Sie explizit die Enumerationswerte Tls11 oder Tls12 von SecurityProtocolType oder SslProtocols verwenden. Das Flag SCH_USE_STRONG_CRYPTO wird nur für Verbindungen verwendet, bei denen Ihre Anwendung die Rolle des Clients übernimmt. Sie können schwache Protokolle und Algorithmen deaktivieren, wenn Ihre Anwendungen die Rolle des Servers übernehmen, indem Sie die computerweiten Schannel-Registrierungseinstellungen konfigurieren.