Procedure consigliate per Transport Layer Security (TLS) con .NET FrameworkTransport Layer Security (TLS) best practices with the .NET Framework

Il protocollo Transport Layer Security (TLS) è uno standard del settore progettato per proteggere la riservatezza delle informazioni comunicate tramite Internet.The Transport Layer Security (TLS) protocol is an industry standard designed to help protect the privacy of information communicated over the Internet. TLS 1.2 è uno standard che offre miglioramenti per la sicurezza rispetto alle versioni precedenti.TLS 1.2 is a standard that provides security improvements over previous versions. TLS 1.2 verrà sostituito dalla versione più recente dello standard, TLS 1.3, più veloce e che offre maggiore sicurezza.TLS 1.2 will eventually be replaced by the newest released standard TLS 1.3 which is faster and has improved security. Questo articolo presenta alcune raccomandazioni per proteggere le applicazioni .NET Framework che usano il protocollo TLS.This article presents recommendations to secure .NET Framework applications that use the TLS protocol.

Per garantire la sicurezza delle applicazioni .NET Framework, la versione di TLS non deve essere hardcoded.To ensure .NET Framework applications remain secure, the TLS version should not be hardcoded. Le applicazioni .NET Framework devono usare la versione di TLS supportata dal sistema operativo..NET Framework applications should use the TLS version the operating system (OS) supports.

Questo documento è destinato agli sviluppatori che:This document targets developers who are:

È consigliabile:We recommend that you:

  • Usare .NET Framework 4.7 o versioni successive come destinazione per le app.Target .NET Framework 4.7 or later versions on your apps. Usare .NET Framework 4.7.1 o versioni successive come destinazione per le app WCF.Target .NET Framework 4.7.1 or later versions on your WCF apps.
  • Non specificare la versione di TLS.Do not specify the TLS version. Configurare il codice per consentire al sistema operativo di decidere la versione di TLS.Configure your code to let the OS decide on the TLS version.
  • Eseguire un controllo esaustivo del codice per assicurarsi che non venga specificata una versione di TLS o SSL.Perform a thorough code audit to verify you're not specifying a TLS or SSL version.

Quando l'app consente al sistema operativo di scegliere la versione di TLS:When your app lets the OS choose the TLS version:

  • L'app sfrutta automaticamente i nuovi protocolli aggiunti in futuro, ad esempio TLS 1.3.It automatically takes advantage of new protocols added in the future, such as TLS 1.3.
  • Il sistema operativo blocca i protocolli riscontrati come non sicuri.The OS blocks protocols that are discovered not to be secure.

La sezione Controllare il codice e apportare modifiche al codice tratta il controllo e l'aggiornamento del codice.The section Audit your code and make code changes covers auditing and updating your code.

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.This article explains how to enable the strongest security available for the version of the .NET Framework that your app targets and runs on. 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.When an app explicitly sets a security protocol and version, it opts out of any other alternative, and opts out of .NET Framework and OS default behavior. Se si vuole che l'app sia in grado di negoziare una connessione TLS 1.2, l'impostazione esplicita di una versione di TLS precedente impedisce una connessione TLS 1.2.If you want your app to be able to negotiate a TLS 1.2 connection, explicitly setting to a lower TLS version prevents a TLS 1.2 connection.

Se non è possibile evitare di usare una versione del protocollo hardcoded, è consigliabile specificare TLS 1.2.If you can't avoid hardcoding a protocol version, we strongly recommend that you specify TLS 1.2. Per indicazioni sull'identificazione e la rimozione delle dipendenze di TLS 1.0, scaricare il white paper Solving the TLS 1.0 Problem (Risoluzione del problema relativo a TLS 1.0).For guidance on identifying and removing TLS 1.0 dependencies, download the Solving the TLS 1.0 Problem whitepaper.

WCF supporta TLS1.0, 1.1 e 1.2 come impostazione predefinita in .NET Framework 4.7.WCF Supports TLS1.0, 1.1 and 1.2 as the default in .NET Framework 4.7. A partire da .NET Framework 4.7.1, WCF usa come predefinita la versione configurata dal sistema operativo.Starting with .NET Framework 4.7.1, WCF defaults to the operating system configured version. Se un'applicazione è configurata in modo esplicito con SslProtocols.None, WCF usa l'impostazione predefinita del sistema operativo quando si usa il trasporto NetTcp.If an application is explicitly configured with SslProtocols.None, WCF uses the operating system default setting when using the NetTcp transport.

È 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).You can ask questions about this document in the GitHub issue Transport Layer Security (TLS) best practices with the .NET Framework.

Controllare il codice e apportare modifiche al codiceAudit your code and make code changes

Per le applicazioni ASP.NET, controllare l'elemento <system.web><httpRuntime targetFramework> di Web.config per verificare di usare la versione prevista di .NET Framework.For ASP.NET applications, inspect the <system.web><httpRuntime targetFramework> element of web.config to verify you're using the intended version of the .NET Framework.

Per Windows Forms e altre applicazioni, vedere Procedura: Scegliere una versione di .NET Framework di destinazione.For Windows Forms and other applications, see How to: Target a Version of the .NET Framework.

Usare le sezioni seguenti per verificare che non sia in uso una versione specifica di TLS o SSL.Use the following sections to verify you're not using a specific TLS or SSL version.

Se l'app è destinata a .NET Framework 4.7 o versioni successiveIf your app targets .NET Framework 4.7 or later versions

Le sezioni seguenti illustrano come verificare che non sia in uso una versione specifica di TLS o SSL.The following sections show how to verify you're not using a specific TLS or SSL version.

Per reti HTTPFor HTTP networking

ServicePointManager, utilizzando .NET Framework 4,7 e versioni successive, utilizzerà il protocollo di sicurezza predefinito configurato nel sistema operativo.ServicePointManager, using .NET Framework 4.7 and later versions, will use the default security protocol configured in the OS. Per ottenere la scelta del sistema operativo predefinita, se possibile, non impostare un valore per la proprietà ServicePointManager.SecurityProtocol, che per impostazione predefinita è SecurityProtocolType.SystemDefault.To get the default OS choice, if possible, don't set a value for the ServicePointManager.SecurityProtocol property, which defaults to SecurityProtocolType.SystemDefault.

Poiché l'impostazione SecurityProtocolType.SystemDefault fa in modo che il ServicePointManager usi il protocollo di sicurezza predefinito configurato dal sistema operativo, è possibile che l'applicazione venga eseguita in modo diverso in base al sistema operativo in cui è in esecuzione.Because the SecurityProtocolType.SystemDefault setting causes the ServicePointManager to use the default security protocol configured by the operating system, your application may run differently based on the OS it's run on. Windows 7 SP1, ad esempio, usa TLS 1,0 mentre Windows 8 e Windows 10 usano TLS 1,2.For example, Windows 7 SP1 uses TLS 1.0 while Windows 8 and Windows 10 use TLS 1.2.

Il resto di questo articolo non è pertinente se la destinazione è .NET Framework 4.7 o versioni successive per le reti HTTP.The remainder of this article is not relevant when targeting .NET Framework 4.7 or later versions for HTTP networking.

Per reti TCP SocketsFor TCP sockets networking

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.SslStream, using .NET Framework 4.7 and later versions, defaults to the OS choosing the best security protocol and version. Per ottenere la scelta migliore del sistema operativo predefinita, se possibile, non usare overload di metodo di SslStream che accettano un parametro SslProtocols esplicito.To get the default OS best choice, if possible, don't use the method overloads of SslStream that take an explicit SslProtocols parameter. In caso contrario, passare SslProtocols.None.Otherwise, pass 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.We recommend that you don't use Default; setting SslProtocols.Default forces the use of SSL 3.0 /TLS 1.0 and prevents TLS 1.2.

Non impostare un valore per la proprietà SecurityProtocol (per le reti HTTP).Don't set a value for the SecurityProtocol property (for HTTP networking).

Non usare overload di metodo di SslStream che accettano un parametro SslProtocols esplicito (per le reti TCP Sockets).Don't use the method overloads of SslStream that take an explicit SslProtocols parameter (for TCP sockets networking). Quando si ridestina l'app a .NET Framework 4.7 o versioni successive, si seguiranno le procedure consigliate.When you retarget your app to .NET Framework 4.7 or later versions, you'll be following the best practices recommendation.

Il resto di questo argomento non è pertinente se la destinazione è .NET Framework 4.7 o versioni successive per le reti TCP Sockets.The remainder of this topic is not relevant when targeting .NET Framework 4.7 or later versions for TCP sockets networking.

Per il trasporto TCP WCF con sicurezza del trasporto con credenziali del certificatoFor WCF TCP transport using transport security with certificate credentials

WCF usa lo stesso stack di rete del resto di .NET Framework.WCF uses the same networking stack as the rest of the .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:If you are targeting 4.7.1, WCF is configured to allow the OS to choose the best security protocol by default unless explicitly configured:

  • Nel file di configurazione dell'applicazione.In your application configuration file.
  • Oppure nell'applicazione nel codice sorgente.Or, in your application in the source code.

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.By default, .NET Framework 4.7 and later versions is configured to use TLS 1.2 and allows connections using TLS 1.1 or 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.Configure WCF to allow the OS to choose the best security protocol by configuring your binding to use SslProtocols.None. Questa impostazione può essere eseguita in SslProtocols.This can be set on SslProtocols. SslProtocols.None è accessibile da Transport.SslProtocols.None can be accessed from Transport. NetTcpSecurity.Transport è accessibile da Security.NetTcpSecurity.Transport can be accessed from Security.

Se si usa un binding personalizzato:If you're using a custom binding:

  • Configurare WCF per consentire al sistema operativo di scegliere il protocollo di sicurezza ottimale impostando SslProtocols per l'uso di SslProtocols.None.Configure WCF to allow the OS to choose the best security protocol by setting SslProtocols to use SslProtocols.None.
  • Oppure configurare il protocollo usato con il percorso di configurazione system.serviceModel/bindings/customBinding/binding/sslStreamSecurity:sslProtocols.Or configure the protocol used with the configuration path 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.If you're not using a custom binding and you're setting your WCF binding using configuration, set the protocol used with the configuration path system.serviceModel/bindings/netTcpBinding/binding/security/transport:sslProtocols.

Per la sicurezza dei messaggi WCF con le credenziali del certificatoFor WCF Message Security with certificate credentials

.NET Framework 4.7 e versioni successive usano per impostazione predefinita il protocollo specificato nella proprietà SecurityProtocol..NET Framework 4.7 and later versions by default uses the protocol specified in the SecurityProtocol property. Quando AppContextSwitch Switch.System.ServiceModel.DisableUsingServicePointManagerSecurityProtocols è impostato su true, WCF sceglie il protocollo ottimale, fino a TLS 1.0.When the AppContextSwitch Switch.System.ServiceModel.DisableUsingServicePointManagerSecurityProtocols is set to true, WCF chooses the best protocol, up to TLS 1.0.

Se l'app è destinata a una versione di .NET Framework precedente alla 4.7If your app targets a .NET Framework version earlier than 4.7

Controllare il codice per assicurarsi di non impostare una versione specifica di TLS o SSL usando le sezioni seguenti:Audit your code to verify you're not setting a specific TLS or SSL version using the following sections:

Per .NET Framework 4.6 - 4.6.2 e non WCFFor .NET Framework 4.6 - 4.6.2 and not WCF

Impostare l'opzione DontEnableSystemDefaultTlsVersions AppContext su false.Set the DontEnableSystemDefaultTlsVersions AppContext switch to false. Vedere Configurazione della sicurezza tramite opzioni di AppContext.See Configuring security via AppContext switches.

Per WCF con .NET Framework 4.6 - 4.6.2 e la sicurezza del trasporto TCP con credenziali del certificatoFor WCF using .NET Framework 4.6 - 4.6.2 using TCP transport security with Certificate Credentials

È necessario installare le patch più recenti del sistema operativo.You must install the latest OS patches. Vedere Aggiornamenti della sicurezza.See Security updates.

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.The WCF framework automatically chooses the highest protocol available up to TLS 1.2 unless you explicitly configure a protocol version. Per altre informazioni, vedere la sezione precedente Per il trasporto TCP WCF con sicurezza del trasporto con credenziali del certificato.For more information, see the preceding section For WCF TCP transport using transport security with certificate credentials.

Per .NET Framework 3.5 - 4.5.2 e non WCFFor .NET Framework 3.5 - 4.5.2 and not WCF

È consigliabile aggiornare l'app a .NET Framework 4.7 o versioni successive.We recommend you upgrade your app to .NET Framework 4.7 or later versions. Se non è possibile eseguire l'aggiornamento, procedere come segue.If you cannot upgrade, take the following steps. A un certo punto in futuro, l'applicazione potrebbe non funzionare più fino a quando non viene aggiornata a .NET Framework 4.7 o versioni successive.At some point in the future, your application may fail until you upgrade to .NET Framework 4.7 or later versions.

Impostare le chiavi del Registro di sistema SchUseStrongCrypto e SystemDefaultTlsVersions su 1.Set the SchUseStrongCrypto and SystemDefaultTlsVersions registry keys to 1. Vedere Configurazione della sicurezza tramite il Registro di sistema di Windows.See Configuring security via the Windows Registry. .NET Framework versione 3.5 supporta il flag SchUseStrongCrypto solo quando viene passato un valore esplicito di TLS.The .NET Framework version 3.5 supports the SchUseStrongCrypto flag only when an explicit TLS value is passed.

Se l'app è in esecuzione in .NET Framework 3.5, è necessario installare una patch a caldo in modo che TLS 1.2 possa essere specificato dal programma:If you are running on .NET Framework 3.5, you need to install a hot patch so that TLS 1.2 can be specified by your program:

KB3154518KB3154518 Aggiornamento cumulativo per l'affidabilità HR-1605 - Supporto per le versioni predefinite del sistema TLS incluso in .NET Framework 3.5.1 in Windows 7 SP1 e Windows Server 2008 R2 SP1Reliability Rollup HR-1605 - Support for TLS System Default Versions included in the .NET Framework 3.5.1 on Windows 7 SP1 and Server 2008 R2 SP1
KB3154519KB3154519 Aggiornamento cumulativo per l'affidabilità HR-1605 - Supporto per le versioni predefinite del sistema TLS incluso in .NET Framework 3.5 in Windows Server 2012Reliability Rollup HR-1605 - Support for TLS System Default Versions included in the .NET Framework 3.5 on Windows Server 2012
KB3154520KB3154520 Aggiornamento cumulativo per l'affidabilità HR-1605 - Supporto per le versioni predefinite del sistema TLS incluso in .NET Framework 3.5 in Windows 8.1 e Windows Server 2012 R2Reliability Rollup HR-1605 -Support for TLS System Default Versions included in the .NET Framework 3.5 on Windows 8.1 and Windows Server 2012 R2
KB3156421KB3156421 Aggiornamento cumulativo hotfix 1605 3154521 per .NET Framework 4.5.2 e 4.5.1 in Windows1605 Hotfix rollup 3154521 for the .NET Framework 4.5.2 and 4.5.1 on Windows

Per WCF con .NET Framework 3.5 - 4.5.2 e la sicurezza del trasporto TCP con credenziali del certificatoFor WCF using .NET Framework 3.5 - 4.5.2 using TCP transport security with Certificate Credentials

Queste versioni del framework WCF sono hardcoded per l'uso dei valori SSL 3.0 e TLS 1.0.These versions of the WCF framework are hardcoded to use values SSL 3.0 and TLS 1.0. Questi valori non sono modificabili.These values cannot be changed. È necessario aggiornare e ridestinare a NET Framework 4.6 o versioni successive per l'uso di TLS 1.1 e 1.2.You must update and retarget to NET Framework 4.6 or later versions to use TLS 1.1 and 1.2.

Se l'app è destinata a .NET Framework 3.5If your app targets .NET Framework 3.5

Se è necessario impostare esplicitamente un protocollo di sicurezza anziché consentire a .NET Framework o al sistema operativo di selezionare il protocollo di sicurezza, aggiungere le enumerazioni SecurityProtocolTypeExtensions e SslProtocolsExtension al codice.If you must explicitly set a security protocol instead of letting the .NET framework or the OS pick the security protocol, add SecurityProtocolTypeExtensions and SslProtocolsExtension enumerations to your code. SecurityProtocolTypeExtensions e SslProtocolsExtension includono i valori per Tls12, Tls11 e il valore SystemDefault.SecurityProtocolTypeExtensions and SslProtocolsExtension include values for Tls12, Tls11, and the SystemDefault value. Vedere Supporto per le versioni predefinite del sistema TLS incluso in .NET Framework 3.5 in Windows 8.1 e Windows Server 2012 R2.See Support for TLS System Default Versions included in .NET Framework 3.5 on Windows 8.1 and Windows Server 2012 R2.

Configurazione della sicurezza tramite le opzioni di AppContext (per .NET Framework 4.6 o versioni successive)Configuring security via AppContext switches (for .NET Framework 4.6 or later versions)

Le opzioni di AppContext descritte in questa sezione sono rilevanti se l'app è destinata a, o viene eseguita in .NET Framework 4.6 o versioni successive.The AppContext switches described in this section are relevant if your app targets, or runs on, .NET Framework 4.6 or later versions. Le opzioni devono essere false se possibile, per impostazione predefinita o impostandole in modo esplicito.Whether by default, or by setting them explicitly, the switches should be false if possible. 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.If you want to configure security via one or both switches, then don't specify a security protocol value in your code; doing so would override the switch(es).

Le opzioni hanno lo stesso effetto sia per le reti HTTP (ServicePointManager) che per le reti TCP Sockets (SslStream).The switches have the same effect whether you're doing HTTP networking (ServicePointManager) or TCP sockets networking (SslStream).

Switch.System.Net.DontEnableSchUseStrongCryptoSwitch.System.Net.DontEnableSchUseStrongCrypto

Il valore false per Switch.System.Net.DontEnableSchUseStrongCrypto imposta l'uso della crittografia avanzata per l'app.A value of false for Switch.System.Net.DontEnableSchUseStrongCrypto causes your app to use strong cryptography. Il valore false per DontEnableSchUseStrongCrypto usa protocolli di rete più sicuri (TLS 1.2, TLS 1.1 e TLS 1.0) e blocca i protocolli non sicuri.A value of false for DontEnableSchUseStrongCrypto uses more secure network protocols (TLS 1.2, TLS 1.1, and TLS 1.0) and blocks protocols that are not secure. Per altre informazioni, vedere Flag SCH_USE_STRONG_CRYPTO.For more info, see The SCH_USE_STRONG_CRYPTO flag. Il valore true disabilita la crittografia avanzata per l'app.A value of true disables strong cryptography for your app.

Se l'app è destinata a .NET Framework 4.6 o versioni successive, l'impostazione predefinita di questa opzione è false.If your app targets .NET Framework 4.6 or later versions, this switch defaults to false. Si tratta di un'impostazione predefinita sicura, consigliata.That's a secure default, which we recommend. Se l'app viene eseguita in .NET Framework 4.6, ma è destinata a una versione precedente, l'impostazione predefinita dell'opzione è true.If your app runs on .NET Framework 4.6, but targets an earlier version, the switch defaults to true. In questo caso, è consigliabile impostarla in modo esplicito su false.In that case, you should explicitly set it to 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.DontEnableSchUseStrongCrypto should only have a value of true if you need to connect to legacy services that don't support strong cryptography and can't be upgraded.

Switch.System.Net.DontEnableSystemDefaultTlsVersionsSwitch.System.Net.DontEnableSystemDefaultTlsVersions

Il valore false per Switch.System.Net.DontEnableSystemDefaultTlsVersions fa sì che l'app consenta al sistema operativo di scegliere il protocollo.A value of false for Switch.System.Net.DontEnableSystemDefaultTlsVersions causes your app to allow the operating system to choose the protocol. Il valore true fa sì che l'app usi i protocolli selezionati da .NET Framework.A value of true causes your app to use protocols picked by the .NET Framework.

Se l'app è destinata a .NET Framework 4.7 o versioni successive, l'impostazione predefinita di questa opzione è false.If your app targets .NET Framework 4.7 or later versions, this switch defaults to false. Si tratta di un'impostazione predefinita sicura, consigliata.That's a secure default that we recommend. 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.If your app runs on .NET Framework 4.7 or later versions, but targets an earlier version, the switch defaults to true. In questo caso, è consigliabile impostarla in modo esplicito su false.In that case, you should explicitly set it to false.

Switch.System.ServiceModel.DisableUsingServicePointManagerSecurityProtocolsSwitch.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.A value of false for Switch.System.ServiceModel.DisableUsingServicePointManagerSecurityProtocols causes your application to use the value defined in ServicePointManager.SecurityProtocols for message security using certificate credentials. Il valore true usa il protocollo più alto disponibile, fino a TLS 1.0A value of true uses the highest protocol available, up to TLS1.0

Per le applicazioni destinate a .NET Framework 4.7 e versioni successive, l'impostazione predefinita di questo valore è false.For applications targeting .NET Framework 4.7 and later versions, this value defaults to false. Per le applicazioni destinate a .NET Framework 4.6.2 e versioni precedenti, l'impostazione predefinita di questo valore è true.For applications targeting .NET Framework 4.6.2 and earlier, this value defaults to true.

Switch.System.ServiceModel.DontEnableSystemDefaultTlsVersionsSwitch.System.ServiceModel.DontEnableSystemDefaultTlsVersions

Il valore false per Switch.System.ServiceModel.DontEnableSystemDefaultTlsVersions imposta la configurazione predefinita per consentire al sistema operativo di scegliere il protocollo.A value of false for Switch.System.ServiceModel.DontEnableSystemDefaultTlsVersions sets the default configuration to allow the operating system to choose the protocol. Il valore true imposta il valore predefinito sul protocollo più alto disponibile, fino a TLS 1.2.A value of true sets the default to the highest protocol available, up to TLS1.2.

Per le applicazioni destinate a .NET Framework 4.7.1 e versioni successive, l'impostazione predefinita di questo valore è false.For applications targeting .NET Framework 4.7.1 and later versions, this value defaults to false. Per le applicazioni destinate a .NET Framework 4.7 e versioni precedenti, l'impostazione predefinita di questo valore è true.For applications targeting .NET Framework 4.7 and earlier, this value defaults to true.

Per altre informazioni sui protocolli TLS, vedere Mitigazione: Protocolli TLS.For more information about TLS protocols, see Mitigation: TLS Protocols. Per altre informazioni sulle opzioni AppContext, vedere <AppContextSwitchOverrides> Element.For more information about AppContext switches, see <AppContextSwitchOverrides> Element.

Configurazione della sicurezza tramite il Registro di sistema di WindowsConfiguring security via the Windows Registry

Avviso

L'impostazione delle chiavi del Registro di sistema influisce su tutte le applicazioni nel sistema.Setting registry keys affects all applications on the system. Usare questa opzione solo se si ha il controllo completo del computer ed è possibile controllare le modifiche apportate al Registro di sistema.Use this option only if you are in full control of the machine and can control changes to the registry.

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.If setting one or both AppContext switches isn't an option, you can control the security protocols that your app uses with the Windows Registry keys described in this section. L'uso di una o entrambe le opzioni di AppContext potrebbe non essere possibile se l'app viene eseguita in .NET Framework 4.5.2 o versioni precedenti oppure se non è possibile modificare il file di configurazione.You might not be able to use one or both the AppContext switches if your app runs on .NET Framework 4.5.2 or earlier versions, or if you can't edit the configuration file. 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.If you want to configure security with the registry, don't specify a security protocol value in your code; doing so overrides the registry setting.

I nomi delle chiavi del Registro di sistema sono simili a quelli delle opzioni AppContext corrispondenti, ma senza il prefisso DontEnable nel nome.The names of the registry keys are similar to the names of the corresponding AppContext switches but without a DontEnable prepended to the name. Ad esempio, l'opzione di AppContext DontEnableSchUseStrongCrypto corrisponde alla chiave del Registro di sistema denominata SchUseStrongCrypto.For example, the AppContext switch DontEnableSchUseStrongCrypto is the registry key called SchUseStrongCrypto.

Queste chiavi sono disponibili in tutte le versioni di .NET Framework per cui è disponibile una patch di sicurezza recente.These keys are available in all .NET Framework versions for which there's a recent security patch. Vedere Aggiornamenti della sicurezza.See Security updates.

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).All of the registry keys described below have the same effect whether you're doing HTTP networking (ServicePointManager) or TCP sockets networking (SslStream).

SchUseStrongCryptoSchUseStrongCrypto

Il valore della chiave del Registro di sistema HKEY_LOCAL_MACHINE\SOFTWARE\[Wow6432Node\]Microsoft\.NETFramework\<VERSION>: SchUseStrongCrypto è di tipo DWORD.The HKEY_LOCAL_MACHINE\SOFTWARE\[Wow6432Node\]Microsoft\.NETFramework\<VERSION>: SchUseStrongCrypto registry key has a value of type DWORD. Il valore 1 imposta l'uso della crittografia avanzata per l'app.A value of 1 causes your app to use strong cryptography. La crittografia avanzata usa protocolli di rete più sicuri (TLS 1.2, TLS 1.1 e TLS 1.0) e blocca i protocolli non sicuri.The strong cryptography uses more secure network protocols (TLS 1.2, TLS 1.1, and TLS 1.0) and blocks protocols that are not secure. Un valore pari a 0 disabilita la crittografia avanzata.A value of 0 disables strong cryptography. Per altre informazioni, vedere Flag SCH_USE_STRONG_CRYPTO.For more information, see The SCH_USE_STRONG_CRYPTO flag.

Se l'app è destinata a .NET Framework 4.6 o versioni successive, il valore predefinito di questa chiave è 1.If your app targets .NET Framework 4.6 or later versions, this key defaults to a value of 1. Si tratta di un'impostazione predefinita sicura, consigliata.That's a secure default that we recommend. Se l'app viene eseguita in .NET Framework 4.6, ma è destinata a una versione precedente, l'impostazione predefinita della chiave è 0.If your app runs on .NET Framework 4.6, but targets an earlier version, then the key defaults to 0. In questo caso, è consigliabile impostarla in modo esplicito su 1.In that case, you should explicitly set its value to 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.This key should only have a value of 0 if you need to connect to legacy services that don't support strong cryptography and can't be upgraded.

SystemDefaultTlsVersionsSystemDefaultTlsVersions

Il valore della chiave del Registro di sistema HKEY_LOCAL_MACHINE\SOFTWARE\[Wow6432Node\]Microsoft\.NETFramework\<VERSION>: SystemDefaultTlsVersions è di tipo DWORD.The HKEY_LOCAL_MACHINE\SOFTWARE\[Wow6432Node\]Microsoft\.NETFramework\<VERSION>: SystemDefaultTlsVersions registry key has a value of type DWORD. Il valore 1 fa sì che l'app consenta al sistema operativo di scegliere il protocollo.A value of 1 causes your app to allow the operating system to choose the protocol. Il valore 0 fa sì che l'app usi i protocolli selezionati da .NET Framework.A value of 0 causes your app to use protocols picked by the .NET Framework.

<VERSION> deve essere v4.0.30319 (per .NET Framework 4 e versioni successive) o v2.0.50727 (per .NET Framework 3.5).<VERSION> must be v4.0.30319 (for .NET Framework 4 and above) or v2.0.50727 (for .NET Framework 3.5).

Se l'app è destinata a .NET Framework 4.7 o versioni successive, il valore predefinito di questa chiave è 1.If your app targets .NET Framework 4.7 or later versions, this key defaults to a value of 1. Si tratta di un'impostazione predefinita sicura, consigliata.That's a secure default that we recommend. Se l'app viene eseguita in .NET Framework 4.7 o versioni successive, ma è destinata a una versione precedente, l'impostazione predefinita della chiave è 0.If your app runs on .NET Framework 4.7 or later versions, but targets an earlier version, the key defaults to 0. In questo caso, è consigliabile impostarla in modo esplicito su 1.In that case, you should explicitly set its value to 1.

Per altre informazioni, vedere Aggiornamento cumulativo per Windows 10 versione 1511 e Windows Server 2016 Technical Preview 4: 10 maggio 2016.For more info, see Cumulative Update for Windows 10 Version 1511 and Windows Server 2016 Technical Preview 4: May 10, 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.For more information with .NET framework 3.5.1, see Support for TLS System Default Versions included in .NET Framework 3.5.1 on Windows 7 SP1 and Server 2008 R2 SP1.

Il file .REG seguente imposta le chiavi del Registro di sistema e le relative varianti sui valori più sicuri:The following .REG file sets the registry keys and their variants to their most safe values:

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

Configurazione dei protocolli Schannel nel Registro di sistema di WindowsConfiguring Schannel protocols in the Windows Registry

È possibile usare il Registro di sistema per un controllo dettagliato dei protocolli negoziati dall'app client e/o server.You can use the registry for fine-grained control over the protocols that your client and/or server app negotiates. Le funzionalità di rete dell'app passano attraverso Schannel (ovvero un nome diverso per canale sicuro).Your app's networking goes through Schannel (which is another name for Secure Channel. Configurando Schannel è possibile configurare il comportamento dell'app.By configuring Schannel, you can configure your app's behavior.

Iniziare con la chiave del Registro di sistema HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols.Start with the HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols registry key. In tale chiave è possibile creare qualsiasi sottochiave nel set SSL 2.0, SSL 3.0, TLS 1.0, TLS 1.1 e TLS 1.2.Under that key you can create any subkeys in the set SSL 2.0, SSL 3.0, TLS 1.0, TLS 1.1, and TLS 1.2. In ognuna di queste sottochiavi, è possibile creare sottochiavi Client e/o Server.Under each of those subkeys, you can create subkeys Client and/or Server. In Client e Server, è possibile creare valori DWORD DisabledByDefault (0 o 1) e Enabled (0 o 0xFFFFFFFF).Under Client and Server, you can create DWORD values DisabledByDefault (0 or 1) and Enabled (0 or 0xFFFFFFFF).

Flag SCH_USE_STRONG_CRYPTOThe SCH_USE_STRONG_CRYPTO flag

Quando è abilitato (per impostazione predefinita, tramite un'opzione di AppContext o con il Registro di sistema Windows), .NET Framework usa il flag SCH_USE_STRONG_CRYPTO quando l'app richiede un protocollo di sicurezza TLS.When it's enabled (by default, by an AppContext switch, or by the Windows Registry), the .NET Framework uses the SCH_USE_STRONG_CRYPTO flag when your app requests a TLS security protocol. Il flag SCH_USE_STRONG_CRYPTO può essere abilitato per impostazione predefinita, con l'opzione AppContext o con il Registro di sistema.The SCH_USE_STRONG_CRYPTO flag can be enabled by default, with the AppContext switch, or with the Registry. Il sistema operativo 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à.The OS passes the flag to Schannelto instruct it to disable known weak cryptographic algorithms, cipher suites, and TLS/SSL protocol versions that may be otherwise enabled for better interoperability. Per altre informazioni, vedere:For more information, see:

Il flag SCH_USE_STRONG_CRYPTO viene anche passato a Schannel quando si usano in modo esplicito i valori enumerati Tls (TLS 1.0), Tls11 o Tls12 di SecurityProtocolType o SslProtocols.The SCH_USE_STRONG_CRYPTO flag is also passed to Schannel when you explicitly use the Tls (TLS 1.0), Tls11, or Tls12 enumerated values of SecurityProtocolType or SslProtocols.

Aggiornamenti della sicurezzaSecurity updates

Le procedure consigliate in questo articolo dipendono dagli aggiornamenti della sicurezza installati.The best practices in this article depend on recent security updates being installed. Questi aggiornamenti includono la possibilità di usare funzionalità avanzate di .NET Framework 4.7 e versioni successive.These updates include the ability to use advanced .NET Framework 4.7 and later features. Gli aggiornamenti della sicurezza recenti sono importanti se l'app viene eseguita in .NET Framework 4.7 e versioni successive (anche se è destinata a una versione precedente).Recent security updates are important if your app runs on .NET Framework 4.7 and later versions (even if it targets an earlier version).

Per aggiornare .NET Framework per consentire al sistema operativo scegliere la versione migliore di TLS da usare, è necessario installare almeno:To update the .NET Framework to allow the operating system to choose the best version of TLS to use, you must install at least:

Vedere anche:See also:

Supporto per TLS 1.2Support for TLS 1.2

Per consentire all'app di negoziare TLS 1.2, il sistema operativo e la versione di .NET Framework devono entrambi supportare TLS 1.2.For your app to negotiate TLS 1.2, the OS and the .NET Framework version both need to support TLS 1.2.

Requisiti del sistema operativo per il supporto di TLS 1.2Operating system requirements to support TLS 1.2

Per abilitare o riabilitare TLS 1.2 e/o TLS 1.1 in un sistema che li supporta, vedere Impostazioni del Registro di sistema di Transport Layer Security (TLS).To enable or re-enable TLS 1.2 and/or TLS 1.1 on a system that supports them, see Transport Layer Security (TLS) registry settings.

Sistema operativoOS Supporto di TLS 1.2TLS 1.2 support
Windows 10Windows 10
Windows Server 2016Windows Server 2016
Supportato e abilitato per impostazione predefinita.Supported, and enabled by default.
Windows 8,1Windows 8.1
Windows Server 2012 R2Windows Server 2012 R2
Supportato e abilitato per impostazione predefinita.Supported, and enabled by default.
Windows 8.0Windows 8.0
Windows Server 2012Windows Server 2012
Supportato e abilitato per impostazione predefinita.Supported, and enabled by default.
Windows 7 SP1Windows 7 SP1
Windows Server 2008 R2 SP1Windows Server 2008 R2 SP1
Supportato, ma non abilitato per impostazione predefinita.Supported, but not enabled by default. Vedere la pagina Web Impostazioni del Registro di sistema di Transport Layer Security (TLS) per informazioni dettagliate su come abilitare TLS 1.2.See the Transport Layer Security (TLS) registry settings web page for details on how to enable TLS 1.2.
Windows Server 2008Windows Server 2008 Il supporto per TLS 1.1 e TLS 1.2 richiede un aggiornamento.Support for TLS 1.2 and TLS 1.1 requires an update. Vedere Aggiornamento per aggiungere il supporto per TLS 1.1 e TLS 1.2 in Windows Server 2008 SP2.See Update to add support for TLS 1.1 and TLS 1.2 in Windows Server 2008 SP2.
Windows VistaWindows Vista Non supportato.Not supported.

Per informazioni su quali protocolli TLS/SSL sono abilitati per impostazione predefinita in ogni versione di Windows, vedere Protocols in TLS/SSL (Schannel SSP) (Protocolli in TLS/SSL - Schannel SSP).For information about which TLS/SSL protocols are enabled by default on each version of Windows, see Protocols in TLS/SSL (Schannel SSP).

Requisiti per il supporto di TLS 1.2 con .NET Framework 3.5Requirements to support TLS 1.2 with .NET Framework 3.5

Questa tabella mostra l'aggiornamento del sistema operativo che è necessario per il supporto di TLS 1.2 con .NET Framework 3.5.This table shows the OS update you'll need to support TLS 1.2 with .NET Framework 3.5. Si consiglia di applicare tutti gli aggiornamenti del sistema operativo.We recommend you apply all OS updates.

Sistema operativoOS Aggiornamento minimo necessario per supportare TLS 1.2 con .NET Framework 3.5Minimum update needed to support TLS 1.2 with .NET Framework 3.5
Windows 10Windows 10
Windows Server 2016Windows Server 2016
Aggiornamento cumulativo per Windows 10 versione 1511 e Windows Server 2016 Technical Preview 4: 10 maggio 2016Cumulative Update for Windows 10 Version 1511 and Windows Server 2016 Technical Preview 4: May 10, 2016
Windows 8,1Windows 8.1
Windows Server 2012 R2Windows Server 2012 R2
Supporto per le versioni predefinite del sistema TLS incluso in .NET Framework 3.5 in Windows 8.1 e Windows Server 2012 R2Support for TLS System Default Versions included in the .NET Framework 3.5 on Windows 8.1 and Windows Server 2012 R2
Windows 8.0Windows 8.0
Windows Server 2012Windows Server 2012
Supporto per le versioni predefinite del sistema TLS incluso in .NET Framework 3.5 in Windows Server 2012Support for TLS System Default Versions included in the .NET Framework 3.5 on Windows Server 2012
Windows 7 SP1Windows 7 SP1
Windows Server 2008 R2 SP1Windows Server 2008 R2 SP1
Supporto per le versioni predefinite del sistema TLS incluso in .NET Framework 3.5.1 in Windows 7 SP1 e Windows Server 2008 R2 SP1Support for TLS System Default Versions included in the .NET Framework 3.5.1 on Windows 7 SP1 and Server 2008 R2 SP1
Windows Server 2008Windows Server 2008 Supporto per le versioni predefinite del sistema TLS incluso in .NET Framework 2.0 SP2 in Windows Vista SP2 e Windows Server 2008 SP2Support for TLS System Default Versions included in the .NET Framework 2.0 SP2 on Windows Vista SP2 and Server 2008 SP2
Windows VistaWindows Vista Non supportatoNot supported

Servizi cloud di AzureAzure Cloud Services

Se si usano i ruoli di lavoro e Web di Servizi cloud di Azure per ospitare ed eseguire l'applicazione, esistono alcune considerazioni di cui è necessario tenere conto per il supporto di TLS 1.2.If you are using Azure Cloud Services Web and Worker roles to host and run your application, there are some considerations that you need to take into account to support TLS 1.2.

.NET Framework 4.7 non viene installato nel sistema operativo guest di Azure per impostazione predefinita.NET Framework 4.7 is not installed on Azure Guest OS by default

La versione più recente installata nell'ultima versione 5 della famiglia del sistema operativo guest di Azure (Windows Server 2016) è 4.6.2.The latest version installed in the latest Azure Guest OS Family 5 release (Windows Server 2016) is 4.6.2. Per individuare le versioni di .NET Framework installate in ogni sistema operativo guest di Azure, vedere Rilasci del sistema operativo guest Azure e matrice di compatibilità dell'SDK.To see which versions of .NET Framework are installed on each Azure Guest OS, see the Azure Guest OS releases and SDK compatibility matrix.

Se l'app è destinata a una versione di .NET Framework che non è disponibile nella versione del sistema operativo guest di Azure, è necessario installarla manualmente.If your app targets a .NET Framework version that is not available on the Azure Guest OS version, then you need to install it yourself. Vedere Installare .NET nei ruoli di Servizi cloud di Azure.See Install .NET on Azure Cloud Service Roles. Se l'installazione del framework richiede un riavvio, anche i ruoli del servizio potrebbero essere riavviati prima che siano pronti.If the framework installation requires a restart, the service roles might also restart before entering the Ready state.

Impostazioni del Registro di sistema del sistema operativo guest di AzureAzure Guest OS registry settings

L'immagine della famiglia del sistema operativo guest di Azure 5 per Servizi cloud di Azure ha già la chiave del Registro di sistema SchUseStrongCrypto impostata sul valore 1.The Azure Guest OS Family 5 image for Azure Cloud Services already has the SchUseStrongCrypto registry key set to a value of 1. Per altre informazioni, vedere SchUseStrongCrypto.For more information, see SchUseStrongCrypto.

Impostare la chiave del Registro di sistema SystemDefaultTlsVersions su 1.Set the SystemDefaultTlsVersions registry key to 1. Vedere Configurazione della sicurezza tramite il Registro di sistema di Windows.See Configuring security via the Windows Registry.