Protocollo di sicurezza predefinito in .NET 4.5


253

Qual è il protocollo di sicurezza predefinito per la comunicazione con server che supportano fino a TLS 1.2? Per .NETimpostazione predefinita, sceglierò il protocollo di sicurezza più elevato supportato sul lato server o devo aggiungere esplicitamente questa riga di codice:

System.Net.ServicePointManager.SecurityProtocol = 
SecurityProtocolType.Tls | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12;

C'è un modo per cambiare questo valore predefinito, oltre a una modifica del codice?

Infine, .NET 4.0supporta solo fino a TLS 1.0? cioè devo aggiornare i progetti client a 4.5 per supportare TLS 1.2.

La mia motivazione è quella di rimuovere il supporto SSLv3sul lato client anche se il server lo supporta (ho già uno script PowerShell per disabilitarlo nel registro macchina) e per supportare il protocollo TLS più alto supportato dal server.

Aggiornamento: guardando la ServicePointManagerclasse in .NET 4.0non vedo valori enumerati per TLS 1.0e 1.1. In entrambi .NET 4.0/4.5, il valore predefinito è SecurityProtocolType.Tls|SecurityProtocolType.Ssl3. Si spera che questo valore predefinito non si interrompa disabilitando SSLv3nel registro.

Tuttavia, ho deciso che devo aggiornare tutte le app .NET 4.5e aggiungere esplicitamente SecurityProtocolType.Tls | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12;comunque a tutto il codice di bootstrap di tutte le applicazioni.

Ciò renderà richieste in uscita a varie API e servizi per non effettuare il downgrade SSLv3e dovrebbe selezionare il livello più alto di TLS.

Questo approccio sembra ragionevole o eccessivo? Ho molte applicazioni da aggiornare e voglio provarle in futuro poiché ho sentito che TLS 1.0potrebbero essere deprecate nel prossimo futuro da alcuni provider.

Come client che effettua richieste in uscita alle API, la disabilitazione di SSL3 nel registro ha anche un effetto nel framework .NET? Vedo per impostazione predefinita, TLS 1.1 e 1.2 non sono abilitati, dobbiamo abilitarlo tramite il registro? RE http://support.microsoft.com/kb/245030 .

Dopo un po 'di indagine, credo che le impostazioni del registro non avranno alcun effetto poiché si applicano a IIS (sottochiave del server) e ai browser (sottochiave del client).

Spiacente, questo post si è trasformato in più domande, seguite da risposte "forse".



Per coloro che vogliono vedere la risposta migliore per questo, ordina per voti!
navule

1
Domande e risposte relative a SO: stackoverflow.com/questions/41618766/… I lettori devono tenere presente che questa domanda sta invecchiando e le raccomandazioni più recenti sono in vigore dal 2020.
Nessun rimborso Nessun

Risposte:


280

Alcuni di coloro che hanno lasciato commenti hanno notato che l'impostazione System.Net.ServicePointManager.SecurityProtocolsu valori specifici significa che la tua app non sarà in grado di sfruttare le future versioni TLS che potrebbero diventare i valori predefiniti nei futuri aggiornamenti di .NET. Invece di specificare un elenco fisso di protocolli, puoi invece attivare o disattivare i protocolli che conosci e a cui tieni, lasciando tutti gli altri come sono.

Per attivare TLS 1.1 e 1.2 senza influire su altri protocolli:

System.Net.ServicePointManager.SecurityProtocol |= 
    SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12;

Notare l'uso di |=per attivare queste bandiere senza spegnerne altre.

Per disattivare SSL3 senza influire su altri protocolli:

System.Net.ServicePointManager.SecurityProtocol &= ~SecurityProtocolType.Ssl3;

6
Questa è davvero la risposta corretta. La risposta accettata assicurerà che la tua app disattiverà sempre le nuove versioni TLS a meno che non torni indietro e aggiorni il tuo codice.
Connor,

5
@Gertsen No, è un bit per bit o, quindi attiva solo i bit appropriati se sono disattivati. Se quei bit sono già attivi, non si verifica alcuna modifica.
Scott,

3
E l'equivalente di PowerShell di questo è [Net.ServicePointManager]::SecurityProtocol = ([Net.ServicePointManager]::SecurityProtocol -bor [Net.SecurityProtocolType]::Tls11 -bor [Net.SecurityProtocolType]::Tls12) Invoke-RestMethod si basa sulle stesse librerie di framework .NET sottostanti.
Martin Hollingsworth,

15
Poiché nessuno parla di dove inserire questo codice, l'ho inserito correttamente in Application_Start di Global.asax.cs per la mia applicazione MVC ASP.NET. Stavo cercando come ottenere le mie richieste SMTP da inviare su TLS1.2 e NON su TLS1.0. Ho anche aggiunto & = ~ SecurityProtocolType.Tls per disattivare TLS 1.0
Greg Veres

2
In VB l'equivalente èNet.ServicePointManager.SecurityProtocol = Net.ServicePointManager.SecurityProtocol OR Net.SecurityProtocolType.Tls12 OR Net.SecurityProtocolType.Tls12
Codespaced

188

L'impostazione predefinita System.Net.ServicePointManager.SecurityProtocolin entrambi .NET 4.0/4.5è SecurityProtocolType.Tls|SecurityProtocolType.Ssl3.

.NET 4.0supporta fino a TLS 1.0mentre .NET 4.5supporta fino aTLS 1.2

Tuttavia, il targeting di un'applicazione .NET 4.0può ancora supportare fino a TLS 1.2quando .NET 4.5è installato nello stesso ambiente. .NET 4.5si installa sopra .NET 4.0, sostituendo System.dll.

Ho verificato questo osservando il protocollo di sicurezza corretto impostato nel traffico fiddler4e impostando manualmente i valori enumerati in un .NET 4.0progetto:

ServicePointManager.SecurityProtocol = (SecurityProtocolType)192 |
(SecurityProtocolType)768 | (SecurityProtocolType)3072;

Riferimento:

namespace System.Net
{
    [System.Flags]
    public enum SecurityProtocolType
    {
       Ssl3 = 48,
       Tls = 192,
       Tls11 = 768,
       Tls12 = 3072,
    }
}

Se provi l'hacking in un ambiente con SOLO .NET 4.0installato, otterrai l'eccezione:

Eccezione non gestita: System.NotSupportedException: il protocollo di sicurezza richiesto non è supportato. su System.Net.ServicePointManager.set_SecurityProtocol (SecurityProtocolType v alue)

Tuttavia, non consiglierei questo "hack" poiché una patch futura, ecc. Potrebbe romperlo. *

Pertanto, ho deciso che il percorso migliore per rimuovere il supporto SSLv3è quello di:

  1. Aggiorna tutte le applicazioni a .NET 4.5
  2. Aggiungi quanto segue al codice boostrapping per sovrascrivere l'impostazione predefinita e la prova futura:

    System.Net.ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12;

* Qualcuno mi corregga se questo trucco è sbagliato, ma i test iniziali vedo che funziona


6
Si prega di consultare imperialviolet.org/2014/12/08/poodleagain.html "Questo sembra un buon momento per ribadire che tutto meno di TLS 1.2 con una suite di cifratura AEAD è crittografato."
Neil,

3
@Mathew, visualizzando il codice sorgente di ServicePointManager.csvedi references.microsoft.com/#System/net/System/Net/…
Luke Hutton il

12
Continuo a vedere la gente rivendicare i .NET 4.5valori predefiniti su Tls12 - ma come hai messo qui, non lo fa. Ti dà la possibilità di usarlo perSecurityProtocol
Don Cheadle

17
Non declasserò questa risposta poiché fornisce molte informazioni utili, ma l'implementazione di una versione del protocollo hardcoded non è una buona idea in quanto limiterà l'applicazione all'utilizzo della migliore crittografia disponibile e potrebbe causare problemi di sicurezza lungo la strada. Il registro cambia per cambiare il comportamento predefinito di .Net per supportare effettivamente i protocolli moderni è decisamente preferibile. (Vale comunque la pena notare che la modifica del registro disabilita anche SSL v3.)
AJ Henderson

6
Su FW 4.6 e 4.7, il valore predefinito è ora SecurityProtocolType.Tls | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12come support.microsoft.com/en-us/help/3069494/…
Ian Kemp

68

È possibile ignorare il comportamento predefinito nel seguente registro:

Key  : HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework\v4.0.30319 
Value: SchUseStrongCrypto
Type: REG_DWORD
Data : 1

e

Key  : HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\.NETFramework\v4.0.30319
Value: SchUseStrongCrypto
Type: REG_DWORD
Data : 1

Per i dettagli, consultare l' implementazione diServicePointManager .


Grazie, non lo sapevo. Lo proverò. Ho creato uno script powershel per impostarlo: gist.github.com/lukehutton/ab80d207172a923401b1
Luke Hutton

6
La modifica del registro non sembra una buona soluzione. Se l'applicazione desidera supportare TLS1, l'applicazione dovrebbe prenderne atto. Non l'ambiente in esecuzione. Altrimenti potrebbe danneggiare altre applicazioni o fare un inferno dalla distribuzione e dall'aggiornamento della tua applicazione.
Mikhail G,

13
@MikhailG al contrario. La modifica del registro è il metodo preferibile. SChannel fornisce un'astrazione della negoziazione sottostante e si desidera che l'applicazione utilizzi qualunque sia il livello di sicurezza più elevato supportato. La limitazione artificiale nel software comporta problemi futuri in caso di rilascio di nuovi protocolli e il software non è in grado di utilizzarli. Sarebbe bello se ci fosse un'opzione per dire di usare solo meglio di un determinato protocollo nel software, ma non esiste alcuna opzione per questo senza impedire anche alle versioni future di funzionare. Tuttavia disabilitò SSL v3 con quella modifica ...
AJ Henderson l'

13
Riga di comando: reg add HKLM\SOFTWARE\Microsoft\.NETFramework\v4.0.30319 /v SchUseStrongCrypto /t REG_DWORD /d 1 /reg:64(e / o /reg:32)
Kevin Smyth,

7
@MikhailG: l'impostazione del registro non impedisce alle applicazioni di supportare protocolli precedenti. Cambia solo le impostazioni predefinite (che includono tls 1.0 a partire da ora). Inoltre, il comportamento predefinito in .Net 4.6+ è l'uso della crittografia avanzata; in tal caso questa voce di registro sarebbe utile solo come mezzo per disabilitare la crittografia avanzata.
Brian,

51

Creare un file di testo con .regun'estensione e il seguente contenuto:

Windows Registry Editor Version 5.00

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

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

O scaricalo dalla seguente fonte:

https://tls1test.salesforce.com/s/NET40-Enable-TLS-1_2.reg

Fare doppio clic per installare ...


3
Il link che hai fornito sembra avere problemi con il certificato SSL.
NathanAldenSr

Anche quando aggiungo queste chiavi di registro, ho ancora quel problema. Qualche idea ?
Samidjo,

@Samidjo - Quale versione .NET stai usando? La risposta di Luke è molto più dettagliata della mia, ma sembra che tu abbia almeno .NET 4.5 installato. Inoltre, se hai appena apportato la modifica, potresti dover riciclare il pool di app. Si tratta di ipotesi, quindi senza ulteriori dettagli potrei essere in grado di aiutare molto di più :)
dana,

2
Una patch recentemente applicata support.microsoft.com/en-us/help/4019114/… su un server ha causato il fallimento della nostra applicazione .net 4.5.2 sulle richieste REST di https. Queste chiavi hanno risolto il nostro problema.
Kleinux,

21

Ho scoperto che quando specifico solo TLS 1.2, sarà comunque negoziato con 1.1. System.Net.ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;

Ho specificato questo nel metodo di avvio Global.asax per la mia app Web .net 4.5.


2
Qual è il protocollo di sicurezza supportato sul server? Credo che questo sia un fattore anche qui e potrebbe essere 1.1 è l'ultimo sul server. www.passionatecoder.ca
Ehsan

14
Eseguito l'upgrade perché questa è l'unica risposta che indica DOVE inserire la riga di codice che è la soluzione.
jgerman,

1
Il client (ad es. Il tuo client Web C #) e il server (server API che stai chiamando) negozieranno per utilizzare il protocollo più elevato supportato da entrambi. Quindi, se il tuo client supporta TLS 1.2, ma il server utilizza solo TLS 1.1, il client utilizzerà TLS 1.1 (a meno che tu NON RIMUOVI TLS 1.1 dal tuo client), nel qual caso potrebbero non trovare un protocollo reciprocamente supportato e il client genererà un errore)
Don Cheadle,

Ho dovuto aggiungere utilizzando System.Net in global.asax.cs
Patrick

16

Il seguente codice sarà:

  • protocolli di stampa abilitati
  • stampa i protocolli disponibili
  • abilitare TLS1.2 se la piattaforma lo supporta e se non è abilitato per iniziare
  • disabilitare SSL3 se è abilitato
  • stampa il risultato finale

costanti:

  • 48 è SSL3
  • 192 è TLS1
  • 768 è TLS1.1
  • 3072 è TLS1.2

Altri protocolli non saranno interessati. Questo lo rende compatibile con i protocolli futuri (Tls1.3, ecc.).

Codice

// print initial status
    Console.WriteLine("Runtime: " + System.Diagnostics.FileVersionInfo.GetVersionInfo(typeof(int).Assembly.Location).ProductVersion);
    Console.WriteLine("Enabled protocols:   " + ServicePointManager.SecurityProtocol);
    Console.WriteLine("Available protocols: ");
    Boolean platformSupportsTls12 = false;
    foreach (SecurityProtocolType protocol in Enum.GetValues(typeof(SecurityProtocolType))) {                
        Console.WriteLine(protocol.GetHashCode());
        if (protocol.GetHashCode() == 3072){
            platformSupportsTls12 = true;
        }
    }
    Console.WriteLine("Is Tls12 enabled: " + ServicePointManager.SecurityProtocol.HasFlag((SecurityProtocolType)3072));    


// enable Tls12, if possible
    if (!ServicePointManager.SecurityProtocol.HasFlag((SecurityProtocolType)3072)){
        if (platformSupportsTls12){
            Console.WriteLine("Platform supports Tls12, but it is not enabled. Enabling it now.");
            ServicePointManager.SecurityProtocol |= (SecurityProtocolType)3072;
        } else {
            Console.WriteLine("Platform does not supports Tls12.");
        }
    }

// disable ssl3
   if (ServicePointManager.SecurityProtocol.HasFlag(SecurityProtocolType.Ssl3)) { 
      Console.WriteLine("Ssl3SSL3 is enabled. Disabling it now.");
      // disable SSL3. Has no negative impact if SSL3 is already disabled. The enclosing "if" if just for illustration.
      System.Net.ServicePointManager.SecurityProtocol &= ~SecurityProtocolType.Ssl3;                      
   }
    Console.WriteLine("Enabled protocols:   " + ServicePointManager.SecurityProtocol);

Produzione

Runtime: 4.7.2114.0
Enabled protocols:   Ssl3, Tls
Available protocols: 
0
48
192
768
3072
Is Tls12 enabled: False
Platform supports Tls12, but it is not enabled. Enabling it now.
Ssl3 is enabled. Disabling it now.
Enabled protocols:   Tls, Tls12

14

Ho riscontrato il problema quando il mio cliente ha aggiornato TLS da 1.0 a 1.2. La mia applicazione utilizza .net framework 3.5 ed è in esecuzione sul server. Quindi l'ho risolto in questo modo:

  1. Risolvi il programma

Prima di chiamare HttpWebRequest.GetResponse () aggiungere questo comando:

ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3 | SecurityProtocolType.Tls | SecurityProtocolTypeExtensions.Tls11 | SecurityProtocolTypeExtensions.Tls12;

Estende 2 DLL aggiungendo 2 nuove classi: System.Net e System.Security.Authentication

    namespace System.Net
    {
        using System.Security.Authentication;
        public static class SecurityProtocolTypeExtensions
        {
            public const SecurityProtocolType Tls12 = (SecurityProtocolType)SslProtocolsExtensions.Tls12;
            public const SecurityProtocolType Tls11 = (SecurityProtocolType)SslProtocolsExtensions.Tls11;
            public const SecurityProtocolType SystemDefault = (SecurityProtocolType)0;
        }
    } 

    namespace System.Security.Authentication
    {
        public static class SslProtocolsExtensions
        {
            public const SslProtocols Tls12 = (SslProtocols)0x00000C00;
            public const SslProtocols Tls11 = (SslProtocols)0x00000300;
        }
    } 
  1. Aggiorna batch Microsoft

Scarica batch:

  • Per Windows 2008 R2: windows6.1-kb3154518-x64.msu
  • Per Windows 2012 R2: windows8.1-kb3154520-x64.msu

Per il download batch e maggiori dettagli puoi vedere qui:

https://support.microsoft.com/en-us/help/3154518/support-for-tls-system-default-versions-included-in-the-.net-framework-3.5.1-on-windows-7 -sp1-e-server-2008-r2-sp1


1
è possibile cambiare SecurityProtocol senza cambiare il codice sorgente? come un machine.config o app.config.
ahankendi,

1
Wow. Questo è il premio voodoo dell'anno ... roba ... proprio lì. Scuoti i sobborghi!
granadaCoder

14

Il meccanismo di modifica del registro ha funzionato per me dopo una lotta. In realtà la mia applicazione funzionava a 32 bit. Quindi ho dovuto cambiare il valore sotto il percorso.

HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft.NETFramework\v4.0.30319

Il tipo di valore deve essere DWORD e un valore superiore a 0. Utilizzare meglio 1.Le impostazioni del registro per ottenere l'app .Net 4.0 utilizzano TLS 1.2 fornito .Net 4.5 è installato nella macchina.


Non è preciso Per .NET 4.5.2, questo deve essere impostato su 1 (o superiore); ma per .NET 4.6, è sufficiente non essere impostato su 0 (ovvero, può essere non impostato).
Jirka Hanika,

Oh, non ho provato in .Net 4.6. Le mie scoperte ci sono nel blogpost joymonscode.blogspot.com/2015/08/…
Joy George Kunjikkuru

La chiave di registro menzionata dovrebbe essere "Wow6432Node". Hai omesso la parte "Nodo" per qualche motivo. Ho provato a modificare la tua risposta ma la mia modifica è stata di sole 4 lettere, quindi non me lo ha permesso. : \
Jeffrey LeCours

Ho dovuto far rimbalzare IIS per avere questa impostazione attiva come impostazione predefinita.
Jeff Mitchell,

10

Sono in esecuzione con .NET 4.5.2 e non ero contento di nessuna di queste risposte. Dato che sto parlando con un sistema che supporta TLS 1.2 e visto che SSL3, TLS 1.0 e TLS 1.1 sono tutti rotti e non sicuri per l'uso, non voglio abilitare questi protocolli. In .NET 4.5.2, i protocolli SSL3 e TLS 1.0 sono entrambi abilitati per impostazione predefinita, che posso vedere nel codice controllando ServicePointManager.SecurityProtocol. Sotto .NET 4.7, c'è il nuovoSystemDefaultmodalità di protocollo che passa esplicitamente la selezione del protocollo al sistema operativo, dove credo sia opportuno basarsi sul registro o su altre impostazioni di configurazione del sistema. Tuttavia, ciò non sembra essere supportato in .NET 4.5.2. Nell'interesse di scrivere un codice compatibile con i forward, questo continuerà a prendere le giuste decisioni anche quando TLS 1.2 verrà inevitabilmente rotto in futuro, o quando eseguirò l'aggiornamento a .NET 4.7+ e consegnerò più responsabilità per la selezione di un protocollo appropriato al sistema operativo , Ho adottato il seguente codice:

SecurityProtocolType securityProtocols = ServicePointManager.SecurityProtocol;
if (securityProtocols.HasFlag(SecurityProtocolType.Ssl3) || securityProtocols.HasFlag(SecurityProtocolType.Tls) || securityProtocols.HasFlag(SecurityProtocolType.Tls11))
{
    securityProtocols &= ~(SecurityProtocolType.Ssl3 | SecurityProtocolType.Tls | SecurityProtocolType.Tls11);
    if (securityProtocols == 0)
    {
        securityProtocols |= SecurityProtocolType.Tls12;
    }
    ServicePointManager.SecurityProtocol = securityProtocols;
}

Questo codice rileverà quando è abilitato un protocollo non sicuro noto e, in questo caso, rimuoveremo questi protocolli non sicuri. Se non rimangono altri protocolli espliciti, forzeremo quindi l'abilitazione di TLS 1.2, come l'unico protocollo sicuro noto supportato da .NET in questo momento. Questo codice è compatibile in avanti, poiché prenderà in considerazione nuovi tipi di protocollo che non sa di essere aggiunto in futuro e giocherà anche con il nuovoSystemDefaultstato in .NET 4.7, il che significa che non dovrò visitare nuovamente questo codice in futuro. Consiglio vivamente di adottare un approccio come questo, anziché codificare incondizionatamente qualsiasi particolare protocollo di sicurezza in modo incondizionato, altrimenti dovrai ricompilare e sostituire il tuo client con una nuova versione per aggiornare a un nuovo protocollo di sicurezza quando TLS 1.2 è inevitabilmente rotto, o più probabilmente dovrai lasciare i protocolli non sicuri esistenti per anni sul tuo server, rendendo la tua organizzazione un bersaglio per gli attacchi.


1
Questa risposta sembra la più ponderata, tuttavia, a meno che non mi manchi qualcosa, non sono sicuro che sarà compatibile in avanti ogni volta che TLS 1.2 si romperà inevitabilmente. Da quello che vedo nella mia app .NET 4.7.2, il SecurityProtocolType.SystemDefaultflag valuta 0, quindi il controllo if (securityProtocols == 0)con l'inclusione bit per bit o il flag per TLS 1.2 includerà sempre TLS 1.2, anche dopo che si è "rotto", giusto? Scatto non nitido qui. Sto davvero cercando di trovare la strada migliore da percorrere.
Griswald_911,

Ho modificato il codice per includere questo e sembra di lavorare e di essere compatibile: if (!Enum.IsDefined(typeof(SecurityProtocolType), 0) && securityProtocols == 0) { securityProtocols |= SecurityProtocolType.Tls12; }.
Griswald_911,

@ Griswald_911, ho un codice simile nella mia applicazione console 4.7.2 e ho scoperto che questa riga securityProtocols |= SecurityProtocolType.Tls12;(senza blocco) non mantiene SystemDefault, i protocolli di sicurezza hanno solo TLS2 in seguito. Quindi vuoi dire quando il valore è SystemDefault, nessun valore dovrebbe essere aggiornato? Per quanto riguarda il forward compatibile, pensi che il sistema operativo si occuperebbe di abilitare il protocollo più recente come TLS 1.3?
Yang,

@Yang - Corretto. La riga securityProtocols |= SecurityProtocolType.Tls12;' will add TLS 1.2, but because the SecurityProtocolType` enum ha un [Flags]attributo e il valore di enumerazione SystemDefault è 0, il valore SystemDefault verrà rimosso, anche se precedentemente impostato. Il risultato finale è che è possibile impostare SevicePointManager.SecurityProtocol su 0 o su qualsiasi combinazione degli altri valori di enumerazione. Se lo si imposta su SystemDefault, fondamentalmente si sceglie di non specificare il protocollo e di lasciare decidere al sistema operativo.
Griswald_911,

1
@Yang - Il punto è che, dopo aver impostato il valore su SystemDefault, l'app dovrebbe utilizzare qualunque cosa il sistema operativo specifichi, ovvero TLS 1.2 nelle ultime versioni di Windows 10. L'idea è che, in futuro, quando TLS 1.3 diventerà lo standard, non è necessario modificare l'applicazione per ereditare quella funzionalità. Vedere la documentazione qui , dove SystemDefault "consente al sistema operativo di scegliere il protocollo migliore da utilizzare e di bloccare protocolli non sicuri".
Griswald_911,

6

Microsoft ha recentemente pubblicato le migliori pratiche al riguardo. https://docs.microsoft.com/en-us/dotnet/framework/network-programming/tls

Sommario

Target .Net Framework 4.7, rimuovi qualsiasi codice che imposta SecurityProtocol, quindi il sistema operativo ti garantirà di utilizzare la soluzione più sicura.

NB: Sarà inoltre necessario assicurarsi che l'ultima versione di TLS sia supportata e abilitata sul proprio sistema operativo.

OS                          TLS 1.2 support

Windows 10                  \_ Supported, and enabled by default.
Windows Server 2016         /   
Windows 8.1                 \_ Supported, and enabled by default.
Windows Server 2012 R2      /
Windows 8.0                 \_ Supported, and enabled by default.
Windows Server 2012         /
Windows 7 SP1               \_ Supported, but not enabled by default*.
Windows Server 2008 R2 SP1  /
Windows Server 2008         -  Support for TLS 1.2 and TLS 1.1 requires an update. See Update to add support for TLS 1.1 and TLS 1.2 in Windows Server 2008 SP2.
Windows Vista               -  Not supported.

* To enable TLS1.2 via the registry see https://docs.microsoft.com/en-us/windows-server/security/tls/tls-registry-settings#tls-12 

    Path: HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS1.2\Server

        Property: Enabled
        Type: REG_DWORD
        Value: 1

        Property: DisabledByDefault 
        Type: REG_DWORD
        Value: 0

    Path: HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS1.2\Client

        Property: Enabled
        Type: REG_DWORD
        Value: 1

        Property: DisabledByDefault 
        Type: REG_DWORD
        Value: 0

Per ulteriori informazioni e quadri precedenti, fare riferimento al collegamento MS.


3
Il problema è che tls 1.1 e tls 1.2 non funzioneranno su Windows 7 e Server 2008 se segui le linee guida (mantenendo SecurityProtocolType.SystemDefault) perché non sono "abilitati" (qualunque cosa significhi) in questi sistemi operativi senza una modifica del registro. Ciò rende SystemDefault in pratica rotto dal design. Microsoft ha davvero incasinato questo.
osexpert,

Bello, grazie @osexpert, buona cattura. Ho modificato la risposta per includere informazioni sui sistemi operativi supportati, quindi non ci sono sorprese per le persone che eseguono sistemi operativi più vecchi in cui il targeting 4.7 non è sufficiente.
JohnLBevan,

1
NB: Esiste anche un KB per abilitare i protocolli più recenti su alcuni sistemi operativi: support.microsoft.com/en-my/help/3140245/…
JohnLBevan,

1
Se le impostazioni del registro non sono un'opzione, penso che questa sia la soluzione migliore per .NET 4.7+: if (System.Environment.OSVersion.Version < new Version(6, 2) /* Windows 8 */) ServicePointManager.SecurityProtocol |= SecurityProtocolType.Tls | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12; else ServicePointManager.SecurityProtocol = SecurityProtocolType.SystemDefault;
osexpert,

5

Per completezza, ecco uno script Powershell che imposta le suddette chiavi di registro:

new-itemproperty -path "HKLM:\SOFTWARE\Microsoft\.NETFramework\v4.0.30319" -name "SchUseStrongCrypto" -Value 1 -PropertyType "DWord";
new-itemproperty -path "HKLM:\SOFTWARE\Wow6432Node\Microsoft\.NETFramework\v4.0.30319" -name "SchUseStrongCrypto" -Value 1 -PropertyType "DWord"

2

Un'alternativa alla codifica hardwareServicePointManager.SecurityProtocol o alla chiave esplicita SchUseStrongCrypto come menzionato sopra:
puoi dire a .NET di utilizzare le impostazioni SCHANNEL predefinite con la chiave SystemDefaultTlsVersions,
ad esempio:

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

2

La soluzione MIGLIORE a questo problema sembra essere l'aggiornamento a .NET 4.6 o versione successiva, che sceglierà automaticamente protocolli forti e cifre forti.

Se non è possibile eseguire l'aggiornamento a .NET 4.6, il consiglio di impostazione

System.Net.ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12;

E usando le impostazioni del registro:

HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft.NETFramework \ v4.0.30319 - SchUseStrongCrypto = DWORD di 1 HKEY_LOCAL_MACHINE \ SOFTWARE \ Wow6432Node \ Microsoft.NETFramework \ v4.0.30319 - SchUseStrongCrypto = DWORD di 1

Risultati nell'uso di qualcosa di diverso da TLS 1.0 e una cifra forte.

Nel mio test, solo l'impostazione nel nodo Wow6432 ha fatto la differenza, anche se la mia applicazione di test è stata creata per qualsiasi CPU.


Chiarimento: è sufficiente impostare SevicePointManager.SecurityProtocol OPPURE impostare le impostazioni del registro. Non è necessario fare entrambe le cose. Per la mia applicazione, ho scelto di impostare solo ServicePointManager.SecurityProtocol. Il mio ragionamento è che l'impostazione del registro influisce sull'intera macchina e non volevo che l'applicazione di qualcun altro si rompesse perché dipendeva da TLS 1.0.
GWC

1

Secondo le migliori pratiche di Transport Layer Security (TLS) con .NET Framework : Per garantire che le applicazioni .NET Framework rimangano sicure, la versione TLS non deve essere codificata. Invece imposta le chiavi di registro: SystemDefaultTlsVersions e SchUseStrongCrypto :

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

0

Se è possibile utilizzare .NET 4.7.1 o versioni successive, utilizzerà TLS 1.2 come protocollo minimo in base alle funzionalità del sistema operativo. Come da raccomandazione Microsoft:

To ensure .NET Framework applications remain secure, the TLS version should not be hardcoded. .NET Framework applications should use the TLS version the operating system (OS) supports.

-2

Per chiave: HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft.NETFramework \ v4.0.30319 Valore: SchUseStrongCrypto

Devi impostare il valore su 1.


5
Penso che vieni ridimensionato perché è la stessa risposta offerta da Jira Mares, ma con meno dettagli
Stuart Siegler,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.