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.
  • No especifique explícitamente la versión de TLS. Configure el código para permitir que el sistema operativo decida sobre la versión de TLS.
  • Realice una exhaustiva revisión del código para comprobar que no está especificando una versión explícitamente de TLS o SSL.
  • No use SslProtocols.Default. (SslProtocols.Default especifica la versión SSL3 y TLS1.0 que está obsoleta.)

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

  • Aprovecha automáticamente los nuevos protocolos que se agregarán en el futuro.
  • El sistema operativo bloquea los protocolos que se descubre que no son seguros.

La sección Revisión del código y aplicación de cambios en el código trata la auditoría y la actualización de código.

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 TLS1.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.

Si debe establecer explícitamente 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)

Si la aplicación tiene como destino .NET Framework 4.7 o versiones posteriores

En las secciones siguientes se muestra cómo configurar la aplicación para que use currently considered secure versions de TLS. (TLS 1.2, TLS 1.3)

Para HttpClient y HttpWebRequest

ServicePointManager, con .NET Framework 4.7 y versiones posteriores, usará 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 el valor SecurityProtocolType.SystemDefault hace que ServicePointManager use el protocolo de seguridad predeterminado configurado por el sistema operativo, la aplicación puede 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, que usa .NET Framework 4.7 y versiones posteriores, elige el sistema operativo predeterminado teniendo en cuenta la mejor opción en cuanto a protocolo de seguridad y versión. 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 cambiar el destino de la aplicación a .NET Framework 4.7 o versiones posteriores, estará siguiendo la recomendación de los procedimientos recomendados.

Para aplicaciones WCF

Si la aplicación tiene como destino .NET Framework 4.7 o versiones posteriores

En las secciones siguientes se muestra cómo configurar la aplicación para que use currently considered secure versions de TLS. (TLS 1.2, TLS 1.3)

Uso del transporte TCP mediante la seguridad de transporte con 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 bien, 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. Configure WCF para permitir que el sistema operativo elija el mejor protocolo de seguridad mediante la configuración de su enlace para usar SslProtocols.None. Se puede establecer en SslProtocols. Se puede tener acceso a SslProtocols.None desde Transport. Se puede tener acceso a NetTcpSecurity.Transport desde Security.

Si usa un enlace personalizado:

  • Configure WCF para permitir que el sistema operativo elija el mejor protocolo de seguridad configurando SslProtocols para que utilice 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á estableciendo los ajustes del enlace de WCF con la configuración, determine 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 AppContextSwitchSwitch.System.ServiceModel.DisableUsingServicePointManagerSecurityProtocols se establece en true, WCF elige el mejor protocolo hasta TLS 1.0.

Si la aplicación tiene como destino una versión de .NET Framework anterior a 4.7

En las secciones siguientes se muestra cómo configurar la aplicación para que use currently considered secure versions de TLS. (TLS 1.2, TLS 1.3)

Uso de .NET Framework 4.6.2 mediante la seguridad de transporte TCP con credenciales de certificado

La plataforma de WCF elige automáticamente el protocolo más alto disponible hasta TLS 1.2, a menos que configure explícitamente una versión de protocolo. Para obtener más información, consulte la sección anterior Para transporte TCP de WCF que usa seguridad de transporte con credenciales de certificado.

Uso de .NET Framework 3.5 mediante la seguridad de transporte TCP con credenciales de certificado

Estas versiones del marco WCF se especifican explícitamente para usar valores SSL 3.0 y TLS 1.0. Estos valores no pueden modificarse. Debe actualizar y cambiar el destino a .NET Framework 4.6.2 o versiones posteriores para utilizar TLS 1.2.

Configuración de seguridad a través de conmutadores AppContext (para .NET Framework 4.6.2 o versiones posteriores)

Los conmutadores AppContext descritos en esta sección son pertinentes si su aplicación tiene como destino .NET Framework 4.6.2 o versiones posteriores o se ejecuta en estas plataformas. 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 los dos conmutadores, no especifique un valor de protocolo de seguridad en el código; de hacerlo, se reemplazarían los conmutadores.

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

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 La marca 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 tiene como destino una versión anterior, el modificador 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 modificador se establece de manera predeterminada en true. En ese caso, debe establecerlo explícitamente en false.

Para aplicaciones WCF

Switch.System.ServiceModel.DisableUsingServicePointManagerSecurityProtocols

Un valor de false para Switch.System.ServiceModel.DisableUsingServicePointManagerSecurityProtocols hace que la aplicación utilice el valor definido en ServicePointManager.SecurityProtocols para la seguridad de los mensajes mediante credenciales de certificado. Un valor de true usa el protocolo más alto disponible, hasta TLS 1.0.

Para aplicaciones que tienen como destino .NET Framework 4.7 y versiones posteriores, este valor se establece de manera predeterminada en false. Para aplicaciones que tienen como destino .NET Framework 4.6.2 y versiones anteriores, este valor se establece de manera predeterminada en true.

Switch.System.ServiceModel.DontEnableSystemDefaultTlsVersions

Un valor de false para Switch.System.ServiceModel.DontEnableSystemDefaultTlsVersions establece la configuración predeterminada para permitir que el sistema operativo elija el protocolo. Un valor de true establece como valor predeterminado el protocolo más alto disponible, hasta TLS 1.2.

Para aplicaciones que tienen como destino .NET Framework 4.7.1 y versiones posteriores, este valor se establece de manera predeterminada en false. Para aplicaciones que tienen como destino .NET Framework 4.7 y versiones anteriores, este valor se establece de manera predeterminada en true.

Para obtener más información sobre protocolos TLS, consulte Mitigación: protocolos TLS. Para obtener más información acerca de los conmutadores de AppContext, vea <AppContextSwitchOverrides> Element.

Configuración de seguridad mediante el Registro de Windows

Advertencia

La configuración de las claves del Registro afecta a todas las aplicaciones del sistema. Use esta opción solo si tiene el control total de la máquina y puede controlar los cambios realizados en el registro.

Si la configuración de uno o los dos conmutadores de AppContext no es una opción, puede controlar los protocolos de seguridad que usa su aplicación con las claves del Registro de Windows que se describen en esta sección. Es posible que no pueda usar uno o ambos modificadores de AppContext si la aplicación se ejecuta en .NET Framework 3.5 o si no puede editar el archivo de configuración. Si desea configurar la seguridad con el Registro, no especifique un valor de protocolo de seguridad en el código; de hacerlo, se reemplazará la configuración del Registro.

Los nombres de las claves del Registro son similares a los nombres de los conmutadores de AppContext correspondientes, pero sin DontEnable antepuesto al nombre. Por ejemplo, el conmutador de AppContextDontEnableSchUseStrongCrypto es la clave del Registro llamada SchUseStrongCrypto.

Estas claves están disponibles en todas las versiones de .NET Framework.

Todas las claves del Registro descritas a continuación tienen el mismo efecto si utiliza redes de HTTP (ServicePointManager) o redes de sockets de TCP (SslStream).

SchUseStrongCrypto

La entrada del Registro HKEY_LOCAL_MACHINE\SOFTWARE\[Wow6432Node\]Microsoft\.NETFramework\<VERSION>: SchUseStrongCrypto tiene un valor de tipo DWORD. Un valor de 1 hace que la aplicación utilice una criptografía robusta. La criptografía robusta utiliza protocolos de red más seguros (TLS 1.2 y TLS 1.1) y bloquea los protocolos que no son seguros. Un valor de 0 deshabilita la criptografía robusta. Para obtener más información, consulte La marca SCH_USE_STRONG_CRYPTO. Esta opción del registro afecta solo a las conexiones cliente (salientes) de la aplicación.

Si la aplicación tiene como destino .NET Framework 4.6 o versiones posteriores, la clave se establece de manera predeterminada en un valor de 1. Este es un valor predeterminado seguro, así que lo recomendamos. Si su aplicación tiene como destino .NET Framework 4.5.2 o versiones anteriores, el valor predeterminado de la clave es 0. En ese caso, debe establecer su valor explícitamente en 1.

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

SystemDefaultTlsVersions

La entrada del Registro HKEY_LOCAL_MACHINE\SOFTWARE\[Wow6432Node\]Microsoft\.NETFramework\<VERSION>: SystemDefaultTlsVersions tiene un valor de tipo DWORD. Un valor de 1 hace que la aplicación permita que el sistema operativo elija el protocolo. Un valor de 0 hace que la aplicación utilice protocolos seleccionados por .NET Framework.

<VERSION> debe ser v4.0.30319 (para .NET Framework 4 y versiones posteriores) o v2.0.50727 (para .NET Framework 3.5).

Si la aplicación tiene como destino .NET Framework 4.7 o versiones posteriores, la clave se establece de manera predeterminada en un valor de 1. Este es un valor predeterminado seguro, así que lo recomendamos. Si su aplicación tiene como destino .NET Framework 4.6.1 o versiones anteriores, el valor predeterminado de la clave es 0. En ese caso, debe establecer su valor explícitamente en 1.

Para obtener más información, consulte Actualización acumulativa para Windows 10 versión 1511 y Windows Server 2016 Technical Preview 4: 10 de mayo de 2016.

Para obtener más información con .NET Framework 3.5.1, consulte Compatibilidad para las versiones predeterminadas del sistema TLS incluidas en .NET Framework 3.5.1 en Windows 7 SP1 y Windows Server 2008 R2 SP1.

El siguiente archivo . REG establece las entradas del Registro y sus variantes en sus valores más seguros:

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

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

Puede utilizar el registro para un control más preciso sobre los protocolos que negocia la aplicación servidor o cliente. 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 marca SCH_USE_STRONG_CRYPTO

Cuando está habilitada (de forma predeterminada, por un modificador AppContext o por el Registro de Windows), .NET Framework usa la marca SCH_USE_STRONG_CRYPTO 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 las conexiones cliente (salientes) cuando se usa explícitamente los valores Tls11 o Tls12 valores enumerados 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 las aplicaciones actúan como rol del servidor mediante la configuración de opciones de registro Schannel de toda la máquina.