Compartir a través de


Conjuntos de cifrado TLS predeterminados para .NET en Linux

Ahora .NET en Linux respeta la configuración de OpenSSL para los conjuntos de cifrado predeterminados al realizar TLS/SSL a través de la clase SslStream o de las operaciones de nivel superior, como HTTPS a través de la clase HttpClient. Cuando los conjuntos de cifrado predeterminados no se configuran de forma explícita, .NET en Linux usa una lista rigurosamente restringida de conjuntos de cifrado permitidos.

Descripción del cambio

En versiones anteriores, .NET no respeta la configuración del sistema para los conjuntos de cifrado predeterminados. La lista de conjuntos de cifrado predeterminados para .NET en Linux es muy permisiva.

A partir de .NET 5, .NET en Linux respeta la configuración de OpenSSL para los conjuntos de cifrado predeterminados cuando se especifica en openssl.cnf. Cuando los conjuntos de cifrado no se configuran de forma explícita, los únicos que se permiten son los siguientes:

  • Conjuntos de cifrado 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

Como este valor predeterminado de reserva no incluye ningún conjunto de cifrado que sea compatible con TLS 1.0 o TLS 1.1, estas versiones de protocolo anteriores están deshabilitadas de forma predeterminada.

Si se proporciona un valor CipherSuitePolicy a SslStream para una sesión específica, se reemplazará el contenido del archivo de configuración o el valor predeterminado de reserva de .NET.

Motivo del cambio

Los usuarios que ejecutan .NET en Linux han solicitado que la configuración predeterminada de SslStream se cambie por otra que proporcione una clasificación de alta seguridad de herramientas de evaluación de terceros.

Versión introducida

5.0

Es probable que los nuevos valores predeterminados funcionen al comunicarse con servidores o clientes modernos. Si tiene que expandir la lista de conjuntos de cifrado predeterminados para aceptar clientes heredados (o para ponerse en contacto con servidores heredados), use uno de las siguientes soluciones alternativas:

  • Especifique una directiva de criptografía mediante la configuración del CipherSuitesPolicy tipo como pertenece a 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);
        // ...
    }
    

    O bien, para 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))
    {
        // ...
    }
    
  • Cambie el archivo de configuración de OpenSSL. En muchas distribuciones de Linux, el archivo de configuración de OpenSSL está en /etc/ssl/openssl.cnf.

    Este archivo openssl.cnf de ejemplo es un archivo mínimo que equivale a la directiva de conjuntos de cifrado predeterminados para .NET 5 y versiones posteriores en Linux. En lugar de reemplazar el archivo del sistema, combine estos conceptos con el archivo que se encuentre en el 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
    

En las distribuciones Red Hat Enterprise Linux, CentOS Stream y Fedora, las aplicaciones .NET tienen como valor predeterminado los conjuntos de cifrado permitidos por las directivas de cifrado de todo el sistema. En estas distribuciones, use la configuración de directivas criptográficas en lugar de cambiar el archivo de configuración de OpenSSL.

API afectadas

N/D