Procedure consigliate per Transport Layer Security (TLS) con .NET Framework

Nota

Questa pagina contiene informazioni TLS di .NET Framework. Per informazioni su TLS .NET, vedere: procedure consigliate TLS/SSL

.NET Framework supporta l'uso del protocollo Transport Layer Security (TLS) per proteggere le comunicazioni di rete.

Che cos'è Transport Layer Security (TLS)?

Avviso

TLS 1.0 e 1.1 è stato deprecato da RFC8996. Questo documento illustra solo TLS 1.2 e TLS 1.3.

Il protocollo Transport Layer Security (TLS) è una versione più recente dello standard del settore progettato per proteggere la riservatezza delle informazioni comunicate tramite Internet. TLS 1.3 è uno standard che offre miglioramenti per la sicurezza rispetto alle versioni precedenti. Questo articolo presenta alcune raccomandazioni per proteggere le applicazioni .NET Framework che usano il protocollo TLS.

Chi può trarre vantaggio da questo documento?

Supporto TLS in .NET Framework

Poiché .NET Framework dipende da Schannel in Windows, quali versioni possono essere negoziate e quale versione verrà usata dipende dal sistema operativo.

Di seguito è riportata una tabella di esempio aggiornata che mostra la versione TLS più recente supportata per diverse combinazioni di versioni del sistema operativo e versioni di destinazione di .NET Framework:

Versione di destinazione di .NET Framework 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

Per altre informazioni, vedere supporto della versione del protocollo TLS in Schannel.

Consigli

  • Per TLS 1.3, usare .NET Framework 4.8 o versione successiva.
  • Non specificare la versione di TLS in modo esplicito. Configurare il codice per consentire al sistema operativo di decidere la versione di TLS.
  • Eseguire un controllo esaustivo del codice per assicurarsi che non venga specificata una versione di TLS o SSL in modo esplicito.
  • Non usare SslProtocols.Default. (SslProtocols.Default specifica SSL3 e TLS1.0 che è una versione obsoleta.)

Quando l'app consente al sistema operativo di scegliere la versione di TLS:

  • L'app sfrutta automaticamente i nuovi protocolli aggiunti in futuro.
  • Il sistema operativo blocca i protocolli riscontrati come non sicuri.

La sezione Controllare il codice e apportare modifiche al codice tratta il controllo e l'aggiornamento del codice.

Questo articolo spiega come abilitare il livello di sicurezza più alto disponibile per la versione di .NET Framework a cui è destinata l'app e in cui viene eseguita. Quando un'app imposta in modo esplicito un protocollo di sicurezza e una versione, rifiuta esplicitamente qualsiasi altra alternativa e il comportamento predefinito di .NET Framework e del sistema operativo. Se si vuole che l'app sia in grado di negoziare una connessione TLS 1.3, l'impostazione esplicita di una versione di TLS precedente impedisce una connessione TLS 1.3.

Se non è possibile evitare di specificare una versione del protocollo in modo esplicito, è consigliabile specificare TLS1.2 o TLS 1.3 (che è currently considered secure). Per indicazioni sull'identificazione e la rimozione delle dipendenze di TLS 1.0, scaricare il white paper Risoluzione del problema relativo a TLS 1.0.

WCF supporta TLS 1.2 come impostazione predefinita in .NET Framework 4.7. A partire da .NET Framework 4.7.1, WCF usa come predefinita la versione configurata dal sistema operativo. Se un'applicazione è configurata in modo esplicito con SslProtocols.None, WCF usa l'impostazione predefinita del sistema operativo quando si usa il trasporto NetTcp.

È possibile porre domande su questo documento nel problema di GitHub Transport Layer Security (TLS) best practices with the .NET Framework (Procedure consigliate per Transport Layer Security (TLS) con .NET Framework).

Controllare il codice e apportare modifiche al codice

Per le applicazioni ASP.NET, controllare l'elemento <system.web><httpRuntime targetFramework> di Web.config per verificare di usare la versione di destinazione prevista di .NET Framework.

Per Windows Forms e altre applicazioni, vedere Procedura: Scegliere una versione di .NET Framework di destinazione.

Usare le sezioni seguenti per verificare che non sia in uso una versione specifica di TLS o SSL.

Se è necessario impostare in modo esplicito un protocollo di sicurezza

Se è necessario impostare esplicitamente un protocollo di sicurezza anziché consentire a .NET o al sistema operativo di selezionare il protocollo di sicurezza, selezionare i protocolli seguenti:

  • Per .NET Framework 3.5: TLS 1.2
  • Per .NET Framework 4.6.2 o versione successiva: TLS 1.3

Se non è possibile trovare i protocolli specificati nell'enumerazione, è possibile aggiungerli come file di estensione. Vedere di seguito:

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

Per altre informazioni, vedere Supporto per le versioni predefinite del sistema TLS incluso in .NET Framework 3.5 in Windows 8.1 e Windows Server 2012 R2.

Per le API System.Net (HttpClient, SslStream)

Se l'app è destinata a .NET Framework 4.7 o versioni successive

Le sezioni seguenti illustrano come configurare l'applicazione per l'uso di currently considered secure versions di TLS. (TLS 1.2, TLS 1.3)

Per HttpClient e HttpWebRequest

ServicePointManager, tramite .NET Framework 4.7 e versioni successive, userà il protocollo di sicurezza predefinito configurato nel sistema operativo. Per ottenere la scelta del sistema operativo predefinita, se possibile, non impostare un valore per la proprietà ServicePointManager.SecurityProtocol, il cui valore predefinito è SecurityProtocolType.SystemDefault.

Poiché l'impostazione SecurityProtocolType.SystemDefault determina l'uso del protocollo di sicurezza predefinito configurato dal sistema operativo da parte di ServicePointManager, l'applicazione può essere eseguita in modo diverso in base al sistema operativo in cui viene eseguita. Ad esempio, Windows 10 usa TLS 1.2 mentre Windows 11 usa TLS 1.3.

Per SslStream

SslStream, quando si usano .NET Framework 4.7 e versioni successive, per impostazione predefinita delega al sistema operativo la scelta del protocollo di sicurezza e della versione ottimali. Per ottenere la scelta migliore del sistema operativo predefinita, se possibile, non usare overload di metodo di SslStream che accettano un parametro SslProtocols esplicito. In caso contrario, passare SslProtocols.None. È consigliabile non usare Default. L'impostazione SslProtocols.Default impone l'uso di SSL 3.0/TLS 1.0 e impedisce l'uso di TLS 1.2.

Non impostare un valore per la proprietà SecurityProtocol (per le reti HTTP).

Non usare overload di metodo di SslStream che accettano un parametro SslProtocols esplicito (per le reti TCP Sockets). Quando si ridestina l'app a .NET Framework 4.7 o versioni successive, si seguiranno le procedure consigliate.

Per le applicazioni WCF

Se l'app è destinata a .NET Framework 4.7 o versioni successive

Le sezioni seguenti illustrano come configurare l'applicazione per l'uso di currently considered secure versions di TLS. (TLS 1.2, TLS 1.3)

Uso del trasporto TCP tramite la sicurezza del trasporto con credenziali del certificato

WCF usa lo stesso stack di rete del resto di .NET Framework.

Se la destinazione è 4.7.1, WCF viene configurato per consentire al sistema operativo di scegliere il protocollo di sicurezza ottimale per impostazione predefinita, a meno che non venga configurato in modo esplicito:

  • Nel file di configurazione dell'applicazione.
  • Oppure nell'applicazione nel codice sorgente.

Per impostazione predefinita, .NET Framework 4.7 e versioni successive sono configurati per l'uso di TLS 1.2 e consentono connessioni tramite TLS 1.1 o TLS 1.0. Configurare WCF per consentire al sistema operativo di scegliere il protocollo di sicurezza ottimale configurando il binding per l'uso di SslProtocols.None. Questa impostazione può essere eseguita in SslProtocols. SslProtocols.None è accessibile da Transport. NetTcpSecurity.Transport è accessibile da Security.

Se si usa un binding personalizzato:

  • Configurare WCF per consentire al sistema operativo di scegliere il protocollo di sicurezza ottimale impostando SslProtocols per l'uso di SslProtocols.None.
  • Oppure configurare il protocollo usato con il percorso di configurazione system.serviceModel/bindings/customBinding/binding/sslStreamSecurity:sslProtocols.

Se non si usa un binding personalizzato e si imposta il binding WCF tramite la configurazione, impostare il protocollo usato con il percorso di configurazione system.serviceModel/bindings/netTcpBinding/binding/security/transport:sslProtocols.

Uso della sicurezza dei messaggi con le credenziali del certificato

.NET Framework 4.7 e versioni successive usano per impostazione predefinita il protocollo specificato nella proprietà SecurityProtocol. Quando AppContextSwitchSwitch.System.ServiceModel.DisableUsingServicePointManagerSecurityProtocols è impostato su true, WCF sceglie il protocollo ottimale, fino a TLS 1.0.

Se l'app è destinata a una versione di .NET Framework precedente alla 4.7

Le sezioni seguenti illustrano come configurare l'applicazione per l'uso di currently considered secure versions di TLS. (TLS 1.2, TLS 1.3)

Uso di .NET Framework 4.6.2 tramite la sicurezza del trasporto TCP con credenziali del certificato

Il framework WCF sceglie automaticamente il protocollo più alto disponibile fino a TLS 1.2, a meno che non si configuri in modo esplicito una versione del protocollo. Per altre informazioni, vedere la sezione precedente Per il trasporto TCP WCF con sicurezza del trasporto con credenziali del certificato.

Uso di .NET Framework 3.5 tramite la sicurezza del trasporto TCP con credenziali del certificato

Queste versioni del framework WCF vengono specificate in modo esplicito per l'uso dei valori SSL 3.0 e TLS 1.0. Questi valori non sono modificabili. È necessario aggiornare e ridestinare a NET Framework 4.6.2 o versioni successive per l'uso di TLS 1.2.

Configurare la sicurezza tramite le opzioni di AppContext (per .NET Framework 4.6.2 o versioni successive)

Le opzioni di AppContext descritte in questa sezione sono rilevanti se l'app è destinata a, o viene eseguita in .NET Framework 4.6.2 o versioni successive. Le opzioni devono essere false se possibile, per impostazione predefinita o impostandole in modo esplicito. Se si vuole configurare la sicurezza tramite una o entrambe le opzioni, non specificare un valore del protocollo di sicurezza nel codice, perché avrebbe la precedenza rispetto alle opzioni.

Per le API System.Net (HttpClient, SslStream)

Le opzioni hanno lo stesso effetto sia per le reti HTTP (ServicePointManager) che per le reti TCP Sockets (SslStream).

Switch.System.Net.DontEnableSchUseStrongCrypto

Il valore false per Switch.System.Net.DontEnableSchUseStrongCrypto imposta l'uso della crittografia avanzata per l'app. Il valore false per DontEnableSchUseStrongCrypto usa protocolli di rete più sicuri (TLS 1.2 e TLS 1.1) e blocca i protocolli non sicuri. Per altre informazioni, vedere Flag SCH_USE_STRONG_CRYPTO. Il valore true disabilita la crittografia avanzata per l'app. Questa opzione influisce solo sulle connessioni client (in uscita) nell'applicazione.

Se l'app è destinata a .NET Framework 4.6.2 o versioni successive, l'impostazione predefinita di questa opzione è false. Si tratta di un'impostazione predefinita sicura, consigliata. Se l'app viene eseguita in .NET Framework 4.6.2, ma è destinata a una versione precedente, l'impostazione predefinita dell'opzione è true. In questo caso, è consigliabile impostarla in modo esplicito su false.

DontEnableSchUseStrongCrypto deve avere il valore true solo se è necessario connettersi a servizi legacy che non supportano la crittografia avanzata e non possono essere aggiornati.

Switch.System.Net.DontEnableSystemDefaultTlsVersions

Il valore false per Switch.System.Net.DontEnableSystemDefaultTlsVersions fa sì che l'app consenta al sistema operativo di scegliere il protocollo. Il valore true fa sì che l'app usi i protocolli selezionati da .NET Framework.

Se l'app è destinata a .NET Framework 4.7 o versioni successive, l'impostazione predefinita di questa opzione è false. Si tratta di un'impostazione predefinita sicura, consigliata. Se l'app viene eseguita in .NET Framework 4.7 o versioni successive, ma è destinata a una versione precedente, l'impostazione predefinita dell'opzione è true. In questo caso, è consigliabile impostarla in modo esplicito su false.

Per le applicazioni WCF

Switch.System.ServiceModel.DisableUsingServicePointManagerSecurityProtocols

Il valore false per Switch.System.ServiceModel.DisableUsingServicePointManagerSecurityProtocols fa sì che l'applicazione usi il valore definito in ServicePointManager.SecurityProtocols per la sicurezza dei messaggi con le credenziali del certificato. Il valore true usa il protocollo più alto disponibile, fino a TLS 1.0

Per le applicazioni destinate a .NET Framework 4.7 e versioni successive, l'impostazione predefinita di questo valore è false. Per le applicazioni destinate a .NET Framework 4.6.2 e versioni precedenti, l'impostazione predefinita di questo valore è true.

Switch.System.ServiceModel.DontEnableSystemDefaultTlsVersions

Il valore false per Switch.System.ServiceModel.DontEnableSystemDefaultTlsVersions imposta la configurazione predefinita per consentire al sistema operativo di scegliere il protocollo. Il valore true imposta il valore predefinito sul protocollo più alto disponibile, fino a TLS 1.2.

Per le applicazioni destinate a .NET Framework 4.7.1 e versioni successive, l'impostazione predefinita di questo valore è false. Per le applicazioni destinate a .NET Framework 4.7 e versioni precedenti, l'impostazione predefinita di questo valore è true.

Per altre informazioni sui protocolli TLS, vedere Mitigazione: Protocolli TLS. Per altre informazioni sulle opzioni AppContext, vedere <AppContextSwitchOverrides> Element.

Configurare la sicurezza tramite il Registro di sistema di Windows

Avviso

L'impostazione delle chiavi del Registro di sistema influisce su tutte le applicazioni nel sistema. Usare questa opzione solo se si ha il controllo completo del computer ed è possibile controllare le modifiche apportate al Registro di sistema.

Se l'impostazione di una o entrambe le opzioni di AppContext non è praticabile, è possibile controllare i protocolli di sicurezza usati dall'app con le chiavi del Registro di sistema di Windows descritte in questa sezione. L'uso di una o entrambe le opzioni di AppContext potrebbe non essere possibile se l'app viene eseguita in .NET Framework 3.5 oppure se non è possibile modificare il file di configurazione. Se si vuole configurare la sicurezza con il Registro di sistema, non specificare un valore del protocollo di sicurezza nel codice, perché ha la precedenza rispetto all'impostazione del Registro di sistema.

I nomi delle chiavi del Registro di sistema sono simili a quelli delle opzioni AppContext corrispondenti, ma senza il prefisso DontEnable nel nome. Ad esempio, l'opzione di AppContextDontEnableSchUseStrongCrypto corrisponde alla chiave del Registro di sistema denominata SchUseStrongCrypto.

Queste chiavi sono disponibili in tutte le versioni di .NET Framework.

Tutte le chiavi del Registro di sistema descritte di seguito hanno lo stesso effetto sia per le reti HTTP (ServicePointManager) che per le reti TCP Sockets (SslStream).

SchUseStrongCrypto

Il valore della voce del Registro di sistema HKEY_LOCAL_MACHINE\SOFTWARE\[Wow6432Node\]Microsoft\.NETFramework\<VERSION>: SchUseStrongCrypto è di tipo DWORD. Il valore 1 imposta l'uso della crittografia avanzata per l'app. La crittografia avanzata usa protocolli di rete più sicuri (TLS 1.2 e TLS 1.1) e blocca i protocolli non sicuri. Un valore pari a 0 disabilita la crittografia avanzata. Per altre informazioni, vedere Flag SCH_USE_STRONG_CRYPTO. Questa impostazione del Registro di sistema influisce solo sulle connessioni client (in uscita) nell'applicazione.

Se l'app è destinata a .NET Framework 4.6 o versioni successive, il valore predefinito di questa chiave è 1. Si tratta di un'impostazione predefinita sicura, consigliata. Se l'app è destinata a .NET Framework 4.5.2 o versioni successive, l'impostazione predefinita di questa opzione è 0. In questo caso, è consigliabile impostarla in modo esplicito su 1.

Questa chiave deve avere il valore 0 solo se è necessario connettersi a servizi legacy che non supportano la crittografia avanzata e non possono essere aggiornati.

SystemDefaultTlsVersions

Il valore della voce del Registro di sistema HKEY_LOCAL_MACHINE\SOFTWARE\[Wow6432Node\]Microsoft\.NETFramework\<VERSION>: SystemDefaultTlsVersions è di tipo DWORD. Il valore 1 fa sì che l'app consenta al sistema operativo di scegliere il protocollo. Il valore 0 fa sì che l'app usi i protocolli selezionati da .NET Framework.

<VERSION> deve essere v4.0.30319 (per .NET Framework 4 e versioni successive) o v2.0.50727 (per .NET Framework 3.5).

Se l'app è destinata a .NET Framework 4.7 o versioni successive, il valore predefinito di questa chiave è 1. Si tratta di un'impostazione predefinita sicura, consigliata. Se l'app è destinata a .NET Framework 4.6.1 o versioni successive, l'impostazione predefinita di questa opzione è 0. In questo caso, è consigliabile impostarla in modo esplicito su 1.

Per altre informazioni, vedere Aggiornamento cumulativo per Windows 10 versione 1511 e Windows Server 2016 Technical Preview 4: 10 maggio 2016.

Per altre informazioni con .NET Framework 3.5.1, vedere Supporto per le versioni predefinite del sistema TLS incluso in .NET Framework 3.5.1 in Windows 7 SP1 e Windows Server 2008 R2 SP1.

Il file .REG seguente imposta le voci del Registro di sistema e le relative varianti sui valori più sicuri:

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\.NETFramework\v2.0.50727]
"SystemDefaultTlsVersions"=dword:00000001
"SchUseStrongCrypto"=dword:00000001

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

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework\v2.0.50727]
"SystemDefaultTlsVersions"=dword:00000001
"SchUseStrongCrypto"=dword:00000001

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

Configurare protocolli Schannel nel Registro di sistema di Windows

È possibile usare il Registro di sistema per un controllo dettagliato dei protocolli negoziati dall'app client e/o server. Le funzionalità di rete dell'app passano attraverso Schannel (ovvero un nome diverso per canale sicuro). Configurando Schannel è possibile configurare il comportamento dell'app.

Iniziare con la chiave del Registro di sistema HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols. In tale chiave è possibile creare qualsiasi sottochiave nel set TLS 1.2 e TLS 1.3. In ognuna di queste sottochiavi, è possibile creare sottochiavi Client e/o Server. In Client e Server, è possibile creare valori DWORD DisabledByDefault (0 o 1) e Enabled (0 o 1).

Per altre informazioni, vedere: impostazioni del Registro di sistema TLS - Schannel

Flag SCH_USE_STRONG_CRYPTO

Quando è abilitata (per impostazione predefinita, da un'opzione AppContext o dal Registro di sistema di Windows), .NET Framework usa il flag SCH_USE_STRONG_CRYPTO quando l'app avvia una connessione TLS a un server. .NET Framework passa il flag a Schannel per richiedere la disabilitazione degli algoritmi di crittografia vulnerabili noti, dei pacchetti di crittografia e delle versioni del protocollo TLS/SSL che potrebbero essere abilitati in caso contrario, per una migliore interoperabilità. Per altre informazioni, vedi:

Il flag SCH_USE_STRONG_CRYPTO viene passato anche a Schannel per le connessioni client (in uscita) quando si usano in modo esplicito i valori enumerati Tls11 o Tls12 di SecurityProtocolType o SslProtocols. Il flag SCH_USE_STRONG_CRYPTO viene usato solo per le connessioni in cui l'applicazione svolge il ruolo del client. È possibile disabilitare protocolli e algoritmi deboli quando le applicazioni fungono da server configurando le impostazioni del Registro di sistema Schannel a livello di computer.