Pacchetti di crittografia TLS predefiniti per .NET in Linux

.NET, in Linux, rispetta ora la configurazione OpenSSL per i pacchetti di crittografia predefiniti quando si esegue TLS/SSL tramite la classe SslStream o si eseguono operazioni di livello superiore, ad esempio HTTPS tramite la classe HttpClient. Quando i pacchetti di crittografia predefiniti non sono configurati in modo esplicito, .NET in Linux usa un elenco ristretto di pacchetti di crittografia consentiti.

Descrizione delle modifiche

Nelle versioni precedenti .NET non rispetta la configurazione di sistema per i pacchetti di crittografia predefiniti. L'elenco di pacchetti di crittografia predefiniti per .NET in Linux è molto permissivo.

A partire da .NET 5, .NET in Linux rispetta la configurazione OpenSSL per i pacchetti di crittografia predefiniti quando viene specificata in openssl.cnf. Quando i pacchetti di crittografia non sono configurati in modo esplicito, gli unici pacchetti di crittografia consentiti sono i seguenti:

  • Pacchetti di crittografia TLS 1.3
  • TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384
  • TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256
  • TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384
  • TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256
  • TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384
  • TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256
  • TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384
  • TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256

Poiché questo valore predefinito di fallback non include pacchetti di crittografia compatibili con TLS 1.0 o TLS 1.1, queste versioni precedenti del protocollo sono effettivamente disabilitate per impostazione predefinita.

Se si specifica un valore CipherSuitePolicy a SslStream per una sessione specifica, il contenuto del file di configurazione e/o il valore predefinito di fallback di .NET verrà comunque sostituito.

Motivo della modifica

Gli utenti che eseguono .NET in Linux hanno richiesto che la configurazione predefinita per SslStream venisse modificata in una configurazione che fornisce una classificazione di sicurezza elevata dagli strumenti di valutazione di terze parti.

Versione di introduzione

5.0

È probabile che le nuove impostazioni predefinite funzionino durante la comunicazione con client o server moderni. Se è necessario espandere l'elenco di pacchetti di crittografia predefiniti per accettare i client legacy o per contattare server legacy, usare una delle soluzioni alternative seguenti:

  • Specificare un criterio di crittografia configurando il tipo CipherSuitesPolicy per quanto riguarda SslServerAuthenticationOptions.CipherSuitesPolicy o SslClientAuthenticationOptions.CipherSuitesPolicy.

    var clientOpts = new SslClientAuthenticationOptions
    {
        // ...
        CipherSuitesPolicy = new CipherSuitesPolicy(
            new[]
            {
                TlsCipherSuite.TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384,
                TlsCipherSuite.TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,
            }),
    };
    
    using (SslStream sslStream = new SslStream(networkStream))
    {
        sslStream.AuthenticateAsClient(clientOptions);
        // ...
    }
    

    In alternativa, per HttpClient:

    var handler = new SocketsHttpHandler
    {
        SslOptions =
        {
            CipherSuitesPolicy = new CipherSuitesPolicy(
                new[]
                {
                    TlsCipherSuite.TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384,
                    TlsCipherSuite.TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,
                }),
        },
    };
    
    using (var httpClient = new HttpClient(handler))
    {
        // ...
    }
    
  • Modificare il file di configurazione di OpenSSL. In molte distribuzioni Linux il file di configurazione di OpenSSL si trova in /etc/ssl/openssl.cnf.

    Questo file openssl.cnf di esempio è un file minimo equivalente ai criteri dei pacchetti di crittografia predefiniti per .NET 5 e versioni successive in Linux. Invece di sostituire il file di sistema, unire questi concetti con il file presente nel sistema.

    openssl_conf = default_conf
    
    [default_conf]
    ssl_conf = ssl_sect
    
    [ssl_sect]
    system_default = system_default_sect
    
    [system_default_sect]
    CipherString = ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA256
    

Nelle distribuzioni Red Hat Enterprise Linux, CentOS e Fedora, per impostazione predefinita le applicazioni .NET usano i pacchetti di crittografia consentiti dai criteri di crittografia a livello di sistema. In queste distribuzioni usare la configurazione dei criteri di crittografia anziché modificare il file di configurazione di OpenSSL.

API interessate

N/D