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?
- 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. Controllare la sezione Controllare il codice, come verificare
target framework
. - Non specificare la versione TLS in modo esplicito, ad esempio non usare gli overload di
SslStream
che accettano un parametroSslProtocols
esplicito.- 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
SslStream
che accettano un parametroSslProtocols
esplicito, passareSslProtocols.SystemDefault
come 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 che vengono individuati per non 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.
Se è necessario 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)
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 AppContextSwitch Switch.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 AppContext
DontEnableSchUseStrongCrypto
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.