Comparteix a través de


Procedimientos recomendados sobre la seguridad de la capa de transporte (TLS) con .NET Framework

Nota:

Esta página contiene información de TLS de .NET Framework. Si busca información de TLS de .NET, consulte: Procedimientos recomendados de TLS/SSL

.NET Framework admite el uso del protocolo de Seguridad de la capa de transporte (TLS) para proteger las comunicaciones de red.

¿Qué es la seguridad de la capa de transporte (TLS)?

Advertencia

TLS 1.0 y 1.1 han quedado en desuso RFC8996. En este documento solo se tratan TLS 1.2 y TLS 1.3.

El protocolo de seguridad de capa de transporte (TLS) es un estándar de la ultima versión del sector diseñado para ayudar a proteger la privacidad de la información que se comunica a través de Internet. TLS 1.3 es un estándar que proporciona mejoras de seguridad con respecto a versiones anteriores. En este artículo se presentan recomendaciones para proteger las aplicaciones de .NET Framework que utilizan el protocolo TLS.

¿Quién puede beneficiarse de este documento?

Compatibilidad con TLS en .NET Framework

Dado que .NET Framework depende de Schannel en Windows, qué versiones se pueden negociar y qué versión se usará depende del sistema operativo.

Esta es una tabla de ejemplo actualizada que muestra la versión de TLS más alta admitida para diferentes combinaciones de versiones del sistema operativo y versiones de destino de .NET Framework:

Versión de destino de .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

Para obtener más información, consulte Compatibilidad con la versión del protocolo TLS en Schannel.

Recomendaciones

  • Para TLS 1.3, establezca como destino .NET Framework 4.8 o versiones posteriores. Consulte la sección Auditar su código para saber cómo verificar su target framework.
  • No especifique explícitamente la versión de TLS, es decir, no use las sobrecargas de método de SslStream que toman un parámetro SslProtocols explícito.
    • De este modo, el código permitirá que el sistema operativo decida sobre la versión de TLS.
    • Si fuera necesario establecer ServicePointManager.SecurityProtocol, establézcalo en SecurityProtocolType.SystemDefault. Esto también usará el valor predeterminado del sistema operativo.
    • Si fuera necesario usar las sobrecargas del método SslStream que toman un parámetro SslProtocols explícito, pase SslProtocols.SystemDefault como argumento. Esto también usará el valor predeterminado del sistema operativo.
  • Realice una exhaustiva revisión del código para comprobar que no está especificando una versión explícitamente de TLS o SSL.

Advertencia

No use SslProtocols.Default, ya que establece la versión de TLS en SSL3 y TLS 1.0 que están obsoletos.

Cuando la aplicación permite que el sistema operativo elija la versión de TLS:

  • Aprovecha automáticamente los nuevos protocolos TLS que se agregarán en el futuro.
  • El sistema operativo bloquea los protocolos que se detectan que no son seguros (por ejemplo, SSL3 y TLS 1.0).

En este artículo, se explica cómo habilitar el mayor nivel de seguridad disponible para la versión de .NET Framework que tiene como destino la aplicación y en la que esta se ejecuta. Cuando una aplicación establece explícitamente un protocolo de seguridad y una versión, deja de recibir cualquier otra alternativa y se mantiene al margen del comportamiento predeterminado de .NET Framework y el sistema operativo. Si desea que la aplicación pueda negociar una conexión TLS 1.3, el establecimiento explícito de una versión de TLS anterior impide una conexión de TLS 1.3.

Si no puede evitar especificar explícitamente una versión de protocolo, se recomienda encarecidamente especificar TLS 1.2 o TLS 1.3 (que es currently considered secure). Para obtener instrucciones sobre cómo identificar y quitar dependencias de TLS 1.0, descargue el documento Solución del problema de TLS 1.0.

WCF admite TLS 1.2 como valor predeterminado en .NET Framework 4.7. A partir de .NET Framework 4.7.1, WCF toma como valor predeterminado la versión configurada en el sistema operativo. Si una aplicación se configura explícitamente con SslProtocols.None, WCF utiliza los parámetros predeterminados del sistema operativo al utilizar el transporte NetTcp.

Puede formular preguntas sobre este documento en el tema de GitHub Procedimientos recomendados sobre la seguridad de la capa de transporte (TLS) con .NET Framework.

Revisión del código y aplicación de cambios en el código

Para las aplicaciones ASP.NET, inspeccione el <system.web><httpRuntime targetFramework> elemento de web.config para comprobar que está utilizando la versión de destino deseada de .NET Framework.

Para Windows Forms y otras aplicaciones, consulte Cómo: usar una versión de .NET Framework como destino.

Consulte las siguientes secciones para comprobar que no está utilizando una versión específica de TLS o SSL.

Establecimiento explícito de un protocolo de seguridad

Si se debe establecer explícitamente un protocolo de seguridad en lugar de permitir a .NET o el sistema operativo seleccionar el protocolo de seguridad, elija estos protocolos:

  • Para .NET Framework 3.5: TLS 1.2
  • Para .NET Framework 4.6.2 o posterior: TLS 1.3

Si no encuentra protocolos especificados en enumeración, puede agregarlos como un archivo de extensión. Observe a continuación:

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;
    }
}

Para obtener más información, consulte Compatibilidad para las versiones predeterminadas del sistema TLS incluidas en .NET Framework 3.5 en Windows 8.1 y Windows Server 2012 R2.

Para las API de System.Net (HttpClient, SslStream)

En las secciones siguientes se muestra cómo configurar la aplicación para que use "versiones seguras actualmente consideradas" de TLS (es decir, TLS 1.2 y TLS 1.3) si tiene como destino .NET Framework 4.7 o posterior.

Para HttpClient y HttpWebRequest

ServicePointManager usa el protocolo de seguridad predeterminado configurado en el sistema operativo. Para obtener la mejor opción de sistema operativo de forma predeterminada, si es posible, no establezca un valor para la propiedad ServicePointManager.SecurityProtocol, que adopta como predeterminado SecurityProtocolType.SystemDefault.

Dado que la SecurityProtocolType.SystemDefault configuración hace que ServicePointManager use el protocolo de seguridad predeterminado configurado por el sistema operativo, la aplicación podría ejecutarse de forma diferente en función del sistema operativo en el que se ejecuta. Por ejemplo, Windows 10 usa TLS 1.2, mientras que Windows 11 usa TLS 1.3.

Para SslStream

SslStream el valor predeterminado es el protocolo de seguridad y la versión elegido por el sistema operativo. Para obtener la mejor opción de sistema operativo predeterminado, si es posible, no use las sobrecargas del método de SslStream que toman un parámetro SslProtocols explícito. De lo contrario, pase SslProtocols.None. Se recomienda no usar Default; el parámetro SslProtocols.Default fuerza el uso de SSL 3.0/TLS 1.0 y evita TLS 1.2.

No establezca un valor para la propiedad SecurityProtocol (para las redes de HTTP).

No use las sobrecargas del método de SslStream que toman un parámetro SslProtocols explícito (para redes de sockets TCP). Al redirigir su aplicación a .NET Framework 4.7 o versiones posteriores, seguirá las mejores prácticas recomendadas.

Para aplicaciones WCF

En las secciones siguientes se muestra cómo configurar la aplicación para que use "versiones seguras actualmente consideradas" de TLS (es decir, TLS 1.2 y TLS 1.3).

Uso del transporte TCP con seguridad de transporte mediante credenciales de certificado

WCF usa la misma pila de redes que el resto de .NET Framework.

Si tiene como destino 4.7.1, WCF está configurado para permitir que el sistema operativo elija el mejor protocolo de seguridad de forma predeterminada a menos que se configure explícitamente:

  • En el archivo de configuración de aplicación.
  • O, en el código fuente de la aplicación.

De forma predeterminada, .NET Framework 4.7, así como las versiones posteriores, está configurado para usar TLS 1.2 y permite conexiones con TLS 1.1 o TLS 1.0. Configurar WCF para permitir que el sistema operativo seleccione el mejor protocolo de seguridad configurando la vinculación para usar SslProtocols.None. Puede establecerlo en SslProtocols. Se puede tener acceso a SslProtocols.None desde Transport. Se puede tener acceso a NetTcpSecurity.Transport desde Security.

Si está usando un enlace personalizado:

  • Configure WCF para permitir que el sistema operativo seleccione el mejor protocolo de seguridad, configurando SslProtocols para usar SslProtocols.None.
  • O bien configure el protocolo utilizado con la ruta de acceso de configuración system.serviceModel/bindings/customBinding/binding/sslStreamSecurity:sslProtocols.

Si no utiliza un enlace personalizado y está configurando su enlace de WCF utilizando la configuración, configure el protocolo utilizado con la ruta de acceso de configuración system.serviceModel/bindings/netTcpBinding/binding/security/transport:sslProtocols.

Uso de Message Security con credenciales de certificado

.NET Framework 4.7, así como sus versiones posteriores, utiliza de forma predeterminada el protocolo especificado en la propiedad SecurityProtocol. Cuando se configura el AppContextSwitchSwitch.System.ServiceModel.DisableUsingServicePointManagerSecurityProtocols en true, WCF elige el mejor protocolo, hasta TLS 1.0.

Configuración de la seguridad mediante modificadores de AppContext

Los modificadores de AppContext descritos en esta sección son relevantes si la aplicación tiene como destino o se ejecuta en .NET Framework 4.6.2 o una versión posterior. Ya sea de forma predeterminada, o estableciéndolos de forma explícita, los conmutadores deberían ser false si fuera posible. Si desea configurar la seguridad a través de uno o ambos modificadores, no especifique un valor de protocolo de seguridad en el código; si lo hace, invalida los modificadores.

Los conmutadores tienen el mismo efecto si utiliza redes de HTTP (ServicePointManager) o redes de sockets de TCP (SslStream).

Switch.System.Net.DontEnableSchUseStrongCrypto

Un valor de false para Switch.System.Net.DontEnableSchUseStrongCrypto hace que la aplicación utilice una criptografía robusta. Un valor de false para DontEnableSchUseStrongCrypto utiliza protocolos de red más seguros (TLS 1.2 y TLS 1.1) y bloquea los protocolos que no son seguros. Para obtener más información, consulte el indicador SCH_USE_STRONG_CRYPTO. Un valor de true deshabilita la criptografía robusta para la aplicación. Este modificador afecta solo a las conexiones cliente (salientes) de la aplicación.

Si la aplicación tiene como destino .NET Framework 4.6.2 o versiones posteriores, el conmutador se establece de valor predeterminado en false. Este es un valor predeterminado seguro, así que lo recomendamos. Si la aplicación se ejecuta en .NET Framework 4.6.2 pero apunta a una versión anterior, el cambio se establece de manera predeterminada en true. En ese caso, debe establecerlo explícitamente en false.

DontEnableSchUseStrongCrypto solo debe tener un valor de true si necesita conectarse a servicios heredados que no son compatibles con la criptografía robusta y no se pueden actualizar.

Switch.System.Net.DontEnableSystemDefaultTlsVersions

Un valor de false para Switch.System.Net.DontEnableSystemDefaultTlsVersions hace que la aplicación permita que el sistema operativo elija el protocolo. Un valor de true hace que la aplicación utilice protocolos seleccionados por .NET Framework.

Si la aplicación tiene como destino .NET Framework 4.7 o versiones posteriores, el conmutador se establece de manera predeterminada en false. Este es un valor predeterminado seguro, así que lo recomendamos. Si la aplicación se ejecuta en .NET Framework 4.7 o versiones posteriores, pero tiene como destino una versión anterior, el conmutador se establece de manera predeterminada en true. En ese caso, debe establecerlo explícitamente en false.

Configuración de protocolos de Schannel en el Registro de Windows

Puede usar el Registro para un control específico sobre los protocolos que negocia la aplicación cliente o servidor. Las redes de la aplicación pasan a través de Schannel (que es otro nombre para Canal seguro). Mediante la configuración de Schannel, puede configurar el comportamiento de la aplicación.

Inicie con la clave del Registro HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols. Bajo esa clave, puede crear cualquier sub clave en el conjunto TLS 1.2, TLS 1.3. En cada una de esas subclaves, puede crear subclaves Client o Server. En Client y Server, puede crear valores DWORD DisabledByDefault (0 o 1) y Enabled (0 o 1).

Para obtener más información, consulte: Configuración del Registro TLS: Schannel

La bandera SCH_USE_STRONG_CRYPTO

Cuando está habilitado (de forma predeterminada o mediante un AppContext conmutador), .NET Framework usa la SCH_USE_STRONG_CRYPTO marca cuando la aplicación inicia una conexión TLS a un servidor. .NET Framework pasa la marca a Schannel para indicarle que deshabilite los algoritmos criptográficos, los conjuntos de cifrado y las versiones de protocolo TLS/SSL que se sabe que son débiles que, si no, podrían habilitarse para mejorar la interoperabilidad. Para obtener más información, consulte:

La marca SCH_USE_STRONG_CRYPTO también se pasa a Schannel para conexiones de cliente (salientes) cuando se utilizan explícitamente los valores enumerados Tls11 o Tls12 de SecurityProtocolType o SslProtocols. La marca SCH_USE_STRONG_CRYPTO solo se usa para las conexiones en las que la aplicación actúa como rol del cliente. Puede deshabilitar los protocolos y algoritmos débiles cuando sus aplicaciones desempeñan el papel de servidor mediante la configuración de los ajustes de registro Schannel a nivel de toda la máquina.