Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
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?
- Usano direttamente le API System.Net (ad esempio System.Net.Http.HttpClient e System.Net.Security.SslStream).
- Usano direttamente i client e i servizi WCF tramite lo spazio dei nomi System.ServiceModel.
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. Verifica la sezione Verifica del codice su come verificare il tuo
target framework. - Non specificare la versione TLS in modo esplicito, ad esempio, non utilizzare le sovraccariche di
SslStreamche richiedono un parametroSslProtocolsesplicito.- In questo modo il codice consentirà al sistema operativo di decidere la versione TLS.
- Se è necessario impostare ServicePointManager.SecurityProtocol, impostarlo su SecurityProtocolType.SystemDefault. In questo modo verrà usata anche l’impostazione predefinita del sistema operativo.
- Se è necessario utilizzare gli overload del metodo
SslStreamche accettano un parametroSslProtocolsesplicito, passareSslProtocols.SystemDefaultcome argomento. In questo modo verrà usata anche l’impostazione predefinita del sistema operativo.
- Eseguire un controllo esaustivo del codice per assicurarsi che non venga specificata una versione di TLS o SSL in modo esplicito.
Avviso
Non usare SslProtocols.Default, perché imposta la versione TLS su SSL3 e TLS 1.0 che sono obsoleti.
Quando l'app consente al sistema operativo di scegliere la versione di TLS:
- Sfrutta automaticamente i nuovi protocolli TLS aggiunti in futuro.
- Il sistema operativo blocca i protocolli individuati che non devono essere sicuri ( ad esempio SSL3 e TLS 1.0).
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 TLS 1.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.
Impostare in modo esplicito un protocollo di sicurezza
Se è necessario impostare in modo esplicito un protocollo di sicurezza anziché consentire a .NET o al sistema operativo di selezionare il protocollo di sicurezza, selezionare questi protocolli:
- 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)
Le sezioni seguenti illustrano come configurare l'applicazione per l'uso di "versioni protette attualmente considerate" di TLS (ovvero TLS 1.2 e TLS 1.3) se è destinato a .NET Framework 4.7 o versione successiva.
Per HttpClient e HttpWebRequest
ServicePointManager usa 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 fa sì che venga utilizzato ServicePointManager il protocollo di sicurezza predefinito configurato dal sistema operativo, l'applicazione potrebbe funzionare in modo diverso a seconda del sistema operativo su cui viene eseguita. Ad esempio, Windows 10 usa TLS 1.2, mentre Windows 11 usa TLS 1.3.
Per SslStream
SslStream per impostazione predefinita il protocollo di sicurezza e la versione scelti dal sistema operativo. Per ottenere la scelta migliore del sistema operativo predefinito, se possibile, non usare i sovraccarichi del metodo di SslStream che richiedono 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 i sovraccarichi di metodo di SslStream che accettano un parametro SslProtocols esplicito (per le reti di sockets TCP). Quando si ridestina l'app a .NET Framework 4.7 o versioni successive, si seguiranno le procedure consigliate.
Per le app WCF
Le sezioni seguenti illustrano come configurare l'applicazione per l'uso di "versioni attualmente considerate sicure" di TLS (ovvero TLS 1.2 e TLS 1.3).
Uso del trasporto TCP con sicurezza del trasporto tramite credenziali basate su 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. È possibile impostare questo valore su 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 configurazione, impostare il protocollo utilizzato 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.
Configurare la sicurezza tramite commutatori AppContext
Le opzioni AppContext descritte in questa sezione sono rilevanti se l'app è destinata o viene eseguita in .NET Framework 4.6.2 o versione successiva. Gli interruttori devono essere false per impostazione predefinita, o impostandoli in modo esplicito, se possibile. Se si vuole configurare la sicurezza tramite uno o entrambi i commutatori, non specificare un valore del protocollo di sicurezza nel codice; questo sovrascriverebbe i commutatori.
Gli interruttori hanno lo stesso effetto sia nel networking HTTP (ServicePointManager) che nel networking di socket TCP (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.
Configurare protocolli Schannel nel Registro di sistema di Windows
È possibile usare il registro di sistema per un controllo granulare sui protocolli negoziati dall'app client 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 o da 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.