Procedimientos recomendados sobre la seguridad de la capa de transporte (TLS) con .NET FrameworkTransport Layer Security (TLS) best practices with the .NET Framework

El protocolo de seguridad de capa de transporte (TLS) es un estándar del sector diseñado para ayudar a proteger la privacidad de la información que se comunica a través de Internet.The Transport Layer Security (TLS) protocol is an industry standard designed to help protect the privacy of information communicated over the Internet. TLS 1.2 es un estándar que proporciona mejoras de seguridad con respecto a versiones anteriores.TLS 1.2 is a standard that provides security improvements over previous versions. TLS 1.2, finalmente, se reemplazará por el estándar más reciente publicado TLS 1.3 que es más rápido y ha mejorado la seguridad.TLS 1.2 will eventually be replaced by the newest released standard TLS 1.3 which is faster and has improved security. En este artículo se presentan recomendaciones para proteger las aplicaciones de .NET Framework que utilizan el protocolo TLS.This article presents recommendations to secure .NET Framework applications that use the TLS protocol.

Para garantizar que las aplicaciones de .NET Framework permanezcan seguras, la versión de TLS no debe estar codificada de forma rígida.To ensure .NET Framework applications remain secure, the TLS version should not be hardcoded. Las aplicaciones de .NET Framework deben usar la versión TLS que admita el sistema operativo (SO)..NET Framework applications should use the TLS version the operating system (OS) supports.

Este documento está dirigido a los desarrolladores que:This document targets developers who are:

Le recomendamos lo siguiente:We recommend that you:

  • Tenga como destino .NET Framework 4.7 o versiones posteriores en sus aplicaciones.Target .NET Framework 4.7 or later versions on your apps. Tenga como destino .NET Framework 4.7.1 o versiones posteriores en sus aplicaciones de WCF.Target .NET Framework 4.7.1 or later versions on your WCF apps.
  • No especifique la versión de TLS.Do not specify the TLS version. Configure el código para permitir que el sistema operativo decida sobre la versión de TLS.Configure your code to let the OS decide on the TLS version.
  • Realice una exhaustiva revisión del código para comprobar que no está especificando una versión de TLS o SSL.Perform a thorough code audit to verify you're not specifying a TLS or SSL version.

Cuando la aplicación permite que el sistema operativo elija la versión de TLS:When your app lets the OS choose the TLS version:

  • Aprovecha automáticamente los nuevos protocolos que se agregarán en el futuro; por ejemplo, TLS 1.3.It automatically takes advantage of new protocols added in the future, such as TLS 1.3.
  • El sistema operativo bloquea los protocolos que se descubre que no son seguros.The OS blocks protocols that are discovered not to be secure.

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.The section Audit your code and make code changes covers auditing and updating your code.

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.This article explains how to enable the strongest security available for the version of the .NET Framework that your app targets and runs on. 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.When an app explicitly sets a security protocol and version, it opts out of any other alternative, and opts out of .NET Framework and OS default behavior. Si desea que la aplicación pueda negociar una conexión TLS 1.2, el establecimiento explícito de una versión de TLS anterior impide una conexión de TLS 1.2.If you want your app to be able to negotiate a TLS 1.2 connection, explicitly setting to a lower TLS version prevents a TLS 1.2 connection.

Si no puede evitar la codificación rígida de una versión del protocolo, le recomendamos encarecidamente que especifique TLS 1.2.If you can't avoid hardcoding a protocol version, we strongly recommend that you specify TLS 1.2. 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.For guidance on identifying and removing TLS 1.0 dependencies, download the Solving the TLS 1.0 Problem white paper.

WCF admite TLS 1.0, 1.1 y 1.2 como valor predeterminado en .NET Framework 4.7.WCF Supports TLS1.0, 1.1 and 1.2 as the default in .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.Starting with .NET Framework 4.7.1, WCF defaults to the operating system configured version. 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.If an application is explicitly configured with SslProtocols.None, WCF uses the operating system default setting when using the NetTcp transport.

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.You can ask questions about this document in the GitHub issue Transport Layer Security (TLS) best practices with the .NET Framework.

Revisión del código y aplicación de cambios en el códigoAudit your code and make code changes

Para las aplicaciones ASP.NET, inspeccione el elemento <system.web><httpRuntime targetFramework> de web.config para comprobar que está utilizando la versión deseada de .NET Framework.For ASP.NET applications, inspect the <system.web><httpRuntime targetFramework> element of web.config to verify you're using the intended version of the .NET Framework.

Para Windows Forms y otras aplicaciones, consulte Cómo: usar una versión de .NET Framework como destino.For Windows Forms and other applications, see How to: Target a Version of the .NET Framework.

Consulte las siguientes secciones para comprobar que no está utilizando una versión específica de TLS o SSL.Use the following sections to verify you're not using a specific TLS or SSL version.

Si la aplicación tiene como destino .NET Framework 4.7 o versiones posterioresIf your app targets .NET Framework 4.7 or later versions

En las siguientes secciones se muestra cómo comprobar que no está utilizando una versión específica de TLS o SSL.The following sections show how to verify you're not using a specific TLS or SSL version.

Para las redes de HTTPFor HTTP networking

ServicePointManager, con .NET Framework 4.7 y versiones posteriores, usará el protocolo de seguridad predeterminado configurado en el sistema operativo.ServicePointManager, using .NET Framework 4.7 and later versions, will use the default security protocol configured in the OS. 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.To get the default OS choice, if possible, don't set a value for the ServicePointManager.SecurityProtocol property, which defaults to 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.Because the SecurityProtocolType.SystemDefault setting causes the ServicePointManager to use the default security protocol configured by the operating system, your application may run differently based on the OS it's run on. Por ejemplo, Windows 7 SP1 usa TLS 1.0, mientras que Windows 8 y Windows 10 usan TLS 1.2.For example, Windows 7 SP1 uses TLS 1.0 while Windows 8 and Windows 10 use TLS 1.2.

El resto de este artículo no es pertinente si se toma como destino la versión .NET Framework 4.7 o una posterior para las redes de HTTP.The remainder of this article is not relevant when targeting .NET Framework 4.7 or later versions for HTTP networking.

Para las redes de sockets de TCPFor TCP sockets networking

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.SslStream, using .NET Framework 4.7 and later versions, defaults to the OS choosing the best security protocol and version. 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.To get the default OS best choice, if possible, don't use the method overloads of SslStream that take an explicit SslProtocols parameter. De lo contrario, pase SslProtocols.None.Otherwise, pass 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.We recommend that you don't use Default; setting SslProtocols.Default forces the use of SSL 3.0 /TLS 1.0 and prevents TLS 1.2.

No establezca un valor para la propiedad SecurityProtocol (para las redes de HTTP).Don't set a value for the SecurityProtocol property (for HTTP networking).

No use las sobrecargas del método de SslStream que toman un parámetro SslProtocols explícito (para redes de sockets TCP).Don't use the method overloads of SslStream that take an explicit SslProtocols parameter (for TCP sockets networking). 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.When you retarget your app to .NET Framework 4.7 or later versions, you'll be following the best practices recommendation.

El resto de este tema no es pertinente si se toma como destino la versión .NET Framework 4.7 o una posterior para las redes de sockets TCP.The remainder of this topic is not relevant when targeting .NET Framework 4.7 or later versions for TCP sockets networking.

Para transporte TCP de WCF que usa seguridad de transporte con credenciales de certificadoFor WCF TCP transport using transport security with certificate credentials

WCF usa la misma pila de redes que el resto de .NET Framework.WCF uses the same networking stack as the rest of the .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:If you are targeting 4.7.1, WCF is configured to allow the OS to choose the best security protocol by default unless explicitly configured:

  • En el archivo de configuración de aplicación.In your application configuration file.
  • O bien, en el código fuente de la aplicación.Or, in your application in the source code.

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.By default, .NET Framework 4.7 and later versions is configured to use TLS 1.2 and allows connections using TLS 1.1 or 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.Configure WCF to allow the OS to choose the best security protocol by configuring your binding to use SslProtocols.None. Se puede establecer en SslProtocols.This can be set on SslProtocols. Se puede tener acceso a SslProtocols.None desde Transport.SslProtocols.None can be accessed from Transport. Se puede tener acceso a NetTcpSecurity.Transport desde Security.NetTcpSecurity.Transport can be accessed from Security.

Si usa un enlace personalizado:If you're using a custom binding:

  • Configure WCF para permitir que el sistema operativo elija el mejor protocolo de seguridad configurando SslProtocols para que utilice SslProtocols.None.Configure WCF to allow the OS to choose the best security protocol by setting SslProtocols to use SslProtocols.None.
  • O bien configure el protocolo utilizado con la ruta de acceso de configuración system.serviceModel/bindings/customBinding/binding/sslStreamSecurity:sslProtocols.Or configure the protocol used with the configuration path 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.If you're not using a custom binding and you're setting your WCF binding using configuration, set the protocol used with the configuration path system.serviceModel/bindings/netTcpBinding/binding/security/transport:sslProtocols.

Para la seguridad de mensaje de WCF con credenciales de certificadoFor WCF Message Security with certificate credentials

.NET Framework 4.7, así como sus versiones posteriores, utiliza de forma predeterminada el protocolo especificado en la propiedad SecurityProtocol..NET Framework 4.7 and later versions by default uses the protocol specified in the SecurityProtocol property. Cuando Switch.System.ServiceModel.DisableUsingServicePointManagerSecurityProtocols de AppContextSwitch se establece en true, WCF elige el mejor protocolo hasta TLS 1.0.When the AppContextSwitch Switch.System.ServiceModel.DisableUsingServicePointManagerSecurityProtocols is set to true, WCF chooses the best protocol, up to TLS 1.0.

Si la aplicación tiene como destino una versión de .NET Framework anterior a 4.7If your app targets a .NET Framework version earlier than 4.7

Siga estas secciones para examinar el código a fin de comprobar que no está configurando una versión específica de TLS o SSL:Audit your code to verify you're not setting a specific TLS or SSL version using the following sections:

Para .NET Framework 4.6 - 4.6.2 y no WFCFor .NET Framework 4.6 - 4.6.2 and not WCF

Establezca el conmutador DontEnableSystemDefaultTlsVersions AppContext en false.Set the DontEnableSystemDefaultTlsVersions AppContext switch to false. Vea Configuring security via AppContext switches (Configuración de la seguridad mediante conmutadores AppContext).See Configuring security via AppContext switches.

Para WCF que usa .NET Framework 4.6 - 4.6.2 y seguridad de transporte TCP con credenciales de certificadoFor WCF using .NET Framework 4.6 - 4.6.2 using TCP transport security with Certificate Credentials

Debe instalar las revisiones más recientes del sistema operativo.You must install the latest OS patches. Consulte Actualizaciones de seguridad.See Security updates.

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.The WCF framework automatically chooses the highest protocol available up to TLS 1.2 unless you explicitly configure a protocol version. 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.For more information, see the preceding section For WCF TCP transport using transport security with certificate credentials.

Para .NET Framework 3.5 - 4.5.2 y no WCFFor .NET Framework 3.5 - 4.5.2 and not WCF

Se recomienda que actualice la aplicación a .NET Framework 4.7 o versiones posteriores.We recommend you upgrade your app to .NET Framework 4.7 or later versions. Si no puede actualizar, siga estos pasos.If you cannot upgrade, take the following steps.

Establezca las claves del Registro SchUseStrongCrypto y SystemDefaultTlsVersions en 1.Set the SchUseStrongCrypto and SystemDefaultTlsVersions registry keys to 1. Vea Configuración de seguridad mediante el Registro de Windows.See Configuring security via the Windows Registry. La versión 3.5 de .NET Framework admite la marca SchUseStrongCrypto solo cuando se pasa un valor explícito de TLS.The .NET Framework version 3.5 supports the SchUseStrongCrypto flag only when an explicit TLS value is passed.

Si está ejecutando en .NET Framework 3.5, debe instalar una revisión para que pueda especificarse TLS 1.2 por el programa:If you are running on .NET Framework 3.5, you need to install a hot patch so that TLS 1.2 can be specified by your program:

KB3154518KB3154518 Paquete acumulativo de actualizaciones de confiabilidad HR-1605: compatibilidad para versiones predeterminadas del sistema TLS incluidas en .NET Framework 3.5.1 en Windows 7 SP1 y Server 2008 R2 SP1Reliability Rollup HR-1605 - Support for TLS System Default Versions included in the .NET Framework 3.5.1 on Windows 7 SP1 and Server 2008 R2 SP1
KB3154519KB3154519 Paquete acumulativo de actualizaciones de confiabilidad HR-1605: compatibilidad para versiones predeterminadas del sistema TLS incluidas en .NET Framework 3.5 en Windows Server 2012Reliability Rollup HR-1605 - Support for TLS System Default Versions included in the .NET Framework 3.5 on Windows Server 2012
KB3154520KB3154520 Paquete acumulativo de actualizaciones de confiabilidad HR-1605: compatibilidad para versiones predeterminadas del sistema TLS incluidas en .NET Framework 3.5 en Windows 8.1 y Windows Server 2012 R2Reliability Rollup HR-1605 -Support for TLS System Default Versions included in the .NET Framework 3.5 on Windows 8.1 and Windows Server 2012 R2
KB3156421KB3156421 Paquete acumulativo de revisiones 1605 3154521 para .NET Framework 4.5.2 y 4.5.1 en Windows1605 Hotfix rollup 3154521 for the .NET Framework 4.5.2 and 4.5.1 on Windows

Para WCF que usa .NET Framework 3.5 - 4.5.2 y seguridad de transporte TCP con credenciales de certificadoFor WCF using .NET Framework 3.5 - 4.5.2 using TCP transport security with Certificate Credentials

Estas versiones de la plataforma WCF se han codificado de forma rígida para usar los valores SSL 3.0 y TLS 1.0.These versions of the WCF framework are hardcoded to use values SSL 3.0 and TLS 1.0. Estos valores no pueden modificarse.These values cannot be changed. Debe actualizar y cambiar el destino a .NET Framework 4.6 o versiones posteriores para utilizar TLS 1.1 y 1.2.You must update and retarget to NET Framework 4.6 or later versions to use TLS 1.1 and 1.2.

Si la aplicación tiene como destino .NET Framework 3.5If your app targets .NET Framework 3.5

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, agregue las enumeraciones SecurityProtocolTypeExtensions y SslProtocolsExtension a su código.If you must explicitly set a security protocol instead of letting .NET or the OS pick the security protocol, add SecurityProtocolTypeExtensions and SslProtocolsExtension enumerations to your code. SecurityProtocolTypeExtensions y SslProtocolsExtension incluyen valores para el valor Tls12, Tls11 y SystemDefault.SecurityProtocolTypeExtensions and SslProtocolsExtension include values for Tls12, Tls11, and the SystemDefault value. 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.For more information, see Support for TLS System Default Versions included in .NET Framework 3.5 on Windows 8.1 and Windows Server 2012 R2.

Configuración de seguridad a través de conmutadores AppContext (para .NET Framework 4.6 o versiones posteriores)Configuring security via AppContext switches (for .NET Framework 4.6 or later versions)

Los conmutadores AppContext descritos en esta sección son pertinentes si su aplicación tiene como destino .NET Framework 4.6 o versiones posteriores o se ejecuta en estas plataformas.The AppContext switches described in this section are relevant if your app targets, or runs on, .NET Framework 4.6 or later versions. Ya sea de forma predeterminada, o estableciéndolos de forma explícita, los conmutadores deberían ser false si fuera posible.Whether by default, or by setting them explicitly, the switches should be false if possible. 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.If you want to configure security via one or both switches, then don't specify a security protocol value in your code; doing so would override the switch(es).

Los conmutadores tienen el mismo efecto si utiliza redes de HTTP (ServicePointManager) o redes de sockets de TCP (SslStream).The switches have the same effect whether you're doing HTTP networking (ServicePointManager) or TCP sockets networking (SslStream).

Switch.System.Net.DontEnableSchUseStrongCryptoSwitch.System.Net.DontEnableSchUseStrongCrypto

Un valor de false para Switch.System.Net.DontEnableSchUseStrongCrypto hace que la aplicación utilice una criptografía robusta.A value of false for Switch.System.Net.DontEnableSchUseStrongCrypto causes your app to use strong cryptography. Un valor de false para DontEnableSchUseStrongCrypto utiliza protocolos de red más seguros(TLS 1.2, TLS 1.1 y TLS 1.0) y bloquea los protocolos que no son seguros.A value of false for DontEnableSchUseStrongCrypto uses more secure network protocols (TLS 1.2, TLS 1.1, and TLS 1.0) and blocks protocols that are not secure. Para obtener más información, consulte La marca SCH_USE_STRONG_CRYPTO.For more info, see The SCH_USE_STRONG_CRYPTO flag. Un valor de true deshabilita la criptografía robusta para la aplicación.A value of true disables strong cryptography for your app.

Si la aplicación tiene como destino .NET Framework 4.6 o versiones posteriores, el conmutador se establece de manera predeterminada en false.If your app targets .NET Framework 4.6 or later versions, this switch defaults to false. Este es un valor predeterminado seguro, así que lo recomendamos.That's a secure default, which we recommend. Si la aplicación se ejecuta en .NET Framework 4.6, pero tiene como destino una versión anterior, el modificador se establece de manera predeterminada en true.If your app runs on .NET Framework 4.6, but targets an earlier version, the switch defaults to true. En ese caso, debe establecerlo explícitamente en false.In that case, you should explicitly set it to 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.DontEnableSchUseStrongCrypto should only have a value of true if you need to connect to legacy services that don't support strong cryptography and can't be upgraded.

Switch.System.Net.DontEnableSystemDefaultTlsVersionsSwitch.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.A value of false for Switch.System.Net.DontEnableSystemDefaultTlsVersions causes your app to allow the operating system to choose the protocol. Un valor de true hace que la aplicación utilice protocolos seleccionados por .NET Framework.A value of true causes your app to use protocols picked by the .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.If your app targets .NET Framework 4.7 or later versions, this switch defaults to false. Este es un valor predeterminado seguro, así que lo recomendamos.That's a secure default that we recommend. 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.If your app runs on .NET Framework 4.7 or later versions, but targets an earlier version, the switch defaults to true. En ese caso, debe establecerlo explícitamente en false.In that case, you should explicitly set it to false.

Switch.System.ServiceModel.DisableUsingServicePointManagerSecurityProtocolsSwitch.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.A value of false for Switch.System.ServiceModel.DisableUsingServicePointManagerSecurityProtocols causes your application to use the value defined in ServicePointManager.SecurityProtocols for message security using certificate credentials. Un valor de true usa el protocolo más alto disponible, hasta TLS 1.0.A value of true uses the highest protocol available, up to TLS1.0

Para aplicaciones que tienen como destino .NET Framework 4.7 y versiones posteriores, este valor se establece de manera predeterminada en false.For applications targeting .NET Framework 4.7 and later versions, this value defaults to false. Para aplicaciones que tienen como destino .NET Framework 4.6.2 y versiones anteriores, este valor se establece de manera predeterminada en true.For applications targeting .NET Framework 4.6.2 and earlier, this value defaults to true.

Switch.System.ServiceModel.DontEnableSystemDefaultTlsVersionsSwitch.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.A value of false for Switch.System.ServiceModel.DontEnableSystemDefaultTlsVersions sets the default configuration to allow the operating system to choose the protocol. Un valor de true establece como valor predeterminado el protocolo más alto disponible, hasta TLS 1.2.A value of true sets the default to the highest protocol available, up to TLS1.2.

Para aplicaciones que tienen como destino .NET Framework 4.7.1 y versiones posteriores, este valor se establece de manera predeterminada en false.For applications targeting .NET Framework 4.7.1 and later versions, this value defaults to false. Para aplicaciones que tienen como destino .NET Framework 4.7 y versiones anteriores, este valor se establece de manera predeterminada en true.For applications targeting .NET Framework 4.7 and earlier, this value defaults to true.

Para obtener más información sobre protocolos TLS, consulte Mitigación: protocolos TLS.For more information about TLS protocols, see Mitigation: TLS Protocols. Para obtener más información acerca de los conmutadores de AppContext, vea <AppContextSwitchOverrides> Element.For more information about AppContext switches, see <AppContextSwitchOverrides> Element.

Configuración de seguridad mediante el Registro de WindowsConfiguring security via the Windows Registry

Advertencia

La configuración de las claves del Registro afecta a todas las aplicaciones del sistema.Setting registry keys affects all applications on the system. Use esta opción solo si tiene el control total de la máquina y puede controlar los cambios realizados en el registro.Use this option only if you are in full control of the machine and can control changes to the registry.

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.If setting one or both AppContext switches isn't an option, you can control the security protocols that your app uses with the Windows Registry keys described in this section. Quizá no pueda utilizar uno de los conmutadores de AppContext, o los dos, si la aplicación se ejecuta en .NET Framework 4.5.2 o en versiones anteriores, o no puede editar el archivo de configuración.You might not be able to use one or both the AppContext switches if your app runs on .NET Framework 4.5.2 or earlier versions, or if you can't edit the configuration file. 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.If you want to configure security with the registry, don't specify a security protocol value in your code; doing so overrides the registry setting.

Los nombres de las claves del Registro son similares a los nombres de los conmutadores de AppContext correspondientes, pero sin DontEnable antepuesto al nombre.The names of the registry keys are similar to the names of the corresponding AppContext switches but without a DontEnable prepended to the name. Por ejemplo, el conmutador de AppContext``DontEnableSchUseStrongCrypto es la clave del Registro llamada SchUseStrongCrypto.For example, the AppContext switch DontEnableSchUseStrongCrypto is the registry key called SchUseStrongCrypto.

Estas claves están disponibles en todas las versiones de .NET Framework para las que existe una revisión de seguridad reciente.These keys are available in all .NET Framework versions for which there's a recent security patch. Consulte Actualizaciones de seguridad.See Security updates.

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).All of the registry keys described below have the same effect whether you're doing HTTP networking (ServicePointManager) or TCP sockets networking (SslStream).

SchUseStrongCryptoSchUseStrongCrypto

La clave del Registro HKEY_LOCAL_MACHINE\SOFTWARE\[Wow6432Node\]Microsoft\.NETFramework\<VERSION>: SchUseStrongCrypto tiene un valor de tipo DWORD.The HKEY_LOCAL_MACHINE\SOFTWARE\[Wow6432Node\]Microsoft\.NETFramework\<VERSION>: SchUseStrongCrypto registry key has a value of type DWORD. Un valor de 1 hace que la aplicación utilice una criptografía robusta.A value of 1 causes your app to use strong cryptography. La criptografía robusta utiliza protocolos de red más seguros(TLS 1.2, TLS 1.1 y TLS 1.0) y bloquea los protocolos que no son seguros.The strong cryptography uses more secure network protocols (TLS 1.2, TLS 1.1, and TLS 1.0) and blocks protocols that are not secure. Un valor de 0 deshabilita la criptografía robusta.A value of 0 disables strong cryptography. Para obtener más información, consulte La marca SCH_USE_STRONG_CRYPTO.For more information, see The SCH_USE_STRONG_CRYPTO flag.

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.If your app targets .NET Framework 4.6 or later versions, this key defaults to a value of 1. Este es un valor predeterminado seguro, así que lo recomendamos.That's a secure default that we recommend. Si su aplicación tiene como destino .NET Framework 4.5.2 o versiones anteriores, el valor predeterminado de la clave es 0.If your app targets .NET Framework 4.5.2 or earlier versions, the key defaults to 0. En ese caso, debe establecer su valor explícitamente en 1.In that case, you should explicitly set its value to 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.This key should only have a value of 0 if you need to connect to legacy services that don't support strong cryptography and can't be upgraded.

SystemDefaultTlsVersionsSystemDefaultTlsVersions

La clave del Registro HKEY_LOCAL_MACHINE\SOFTWARE\[Wow6432Node\]Microsoft\.NETFramework\<VERSION>: SystemDefaultTlsVersions tiene un valor de tipo DWORD.The HKEY_LOCAL_MACHINE\SOFTWARE\[Wow6432Node\]Microsoft\.NETFramework\<VERSION>: SystemDefaultTlsVersions registry key has a value of type DWORD. Un valor de 1 hace que la aplicación permita que el sistema operativo elija el protocolo.A value of 1 causes your app to allow the operating system to choose the protocol. Un valor de 0 hace que la aplicación utilice protocolos seleccionados por .NET Framework.A value of 0 causes your app to use protocols picked by the .NET Framework.

<VERSION> debe ser v4.0.30319 (para .NET Framework 4 y versiones posteriores) o v2.0.50727 (para .NET Framework 3.5).<VERSION> must be v4.0.30319 (for .NET Framework 4 and above) or v2.0.50727 (for .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.If your app targets .NET Framework 4.7 or later versions, this key defaults to a value of 1. Este es un valor predeterminado seguro, así que lo recomendamos.That's a secure default that we recommend. Si su aplicación tiene como destino .NET Framework 4.6.1 o versiones anteriores, el valor predeterminado de la clave es 0.If your app targets .NET Framework 4.6.1 or earlier versions, the key defaults to 0. En ese caso, debe establecer su valor explícitamente en 1.In that case, you should explicitly set its value to 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.For more info, see Cumulative Update for Windows 10 Version 1511 and Windows Server 2016 Technical Preview 4: May 10, 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.For more information with .NET Framework 3.5.1, see Support for TLS System Default Versions included in .NET Framework 3.5.1 on Windows 7 SP1 and Server 2008 R2 SP1.

El siguiente archivo . REG establece las claves del Registro y sus variantes en sus valores más seguros:The following .REG file sets the registry keys and their variants to their most safe values:

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 WindowsConfiguring Schannel protocols in the Windows Registry

Puede utilizar el registro para un control más preciso sobre los protocolos que negocia la aplicación servidor o cliente.You can use the registry for fine-grained control over the protocols that your client and/or server app negotiates. Las redes de la aplicación pasan a través de Schannel (que es otro nombre para canal seguro).Your app's networking goes through Schannel (which is another name for Secure Channel. Mediante la configuración de Schannel, puede configurar el comportamiento de la aplicación.By configuring Schannel, you can configure your app's behavior.

Inicie con la clave del Registro HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols.Start with the HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols registry key. Bajo esa clave, puede crear cualquier subclave en el conjunto SSL 2.0, SSL 3.0, TLS 1.0, TLS 1.1 y TLS 1.2.Under that key you can create any subkeys in the set SSL 2.0, SSL 3.0, TLS 1.0, TLS 1.1, and TLS 1.2. En cada una de esas subclaves, puede crear subclaves Client o Server.Under each of those subkeys, you can create subkeys Client and/or Server. En Client y Server, puede crear valores DWORD DisabledByDefault (0 o 1) y Enabled (0 o 1).Under Client and Server, you can create DWORD values DisabledByDefault (0 or 1) and Enabled (0 or 1).

La marca SCH_USE_STRONG_CRYPTOThe SCH_USE_STRONG_CRYPTO flag

Cuando está habilitada (de forma predeterminada, por un conmutador AppContext o por el Registro de Windows), .NET Framework usa la marca SCH_USE_STRONG_CRYPTO cuando la aplicación solicita un protocolo de seguridad TLS.When it's enabled (by default, by an AppContext switch, or by the Windows Registry), the .NET Framework uses the SCH_USE_STRONG_CRYPTO flag when your app requests a TLS security protocol. La marca SCH_USE_STRONG_CRYPTO puede estar habilitada de forma predeterminada, con el conmutador AppContext o con el Registro.The SCH_USE_STRONG_CRYPTO flag can be enabled by default, with the AppContext switch, or with the Registry. El sistema operativo pasa la marca a Schannel para indicarle que deshabilite algoritmos criptográficos que se sabe que no son robustos, conjuntos de cifrado y versiones de protocolo TLS/SSL que pueden habilitarse en caso contrario para mejorar la interoperabilidad.The OS passes the flag to Schannelto instruct it to disable known weak cryptographic algorithms, cipher suites, and TLS/SSL protocol versions that may be otherwise enabled for better interoperability. Para obtener más información, consulte:For more information, see:

La marca SCH_USE_STRONG_CRYPTO también se pasa a Schannel cuando se utiliza explícitamente Tls (TLS 1.0), Tls11 o valores enumerados Tls12 de SecurityProtocolType y SslProtocols.The SCH_USE_STRONG_CRYPTO flag is also passed to Schannel when you explicitly use the Tls (TLS 1.0), Tls11, or Tls12 enumerated values of SecurityProtocolType or SslProtocols.

Actualizaciones de seguridadSecurity updates

Los procedimientos recomendados en este artículo dependen de las actualizaciones de seguridad recientes que se están instalando.The best practices in this article depend on recent security updates being installed. Estas actualizaciones incluyen la posibilidad de utilizar las características avanzadas de .NET Framework 4.7 y versiones posteriores.These updates include the ability to use advanced .NET Framework 4.7 and later features. Las actualizaciones de seguridad recientes son importantes si la aplicación se ejecuta en .NET Framework 4.7 y versiones posteriores (incluso si tienen como destino una versión anterior).Recent security updates are important if your app runs on .NET Framework 4.7 and later versions (even if it targets an earlier version).

Para actualizar .NET Framework a fin de permitir que el sistema operativo elija la mejor versión de TLS para usar, debe instalar al menos:To update the .NET Framework to allow the operating system to choose the best version of TLS to use, you must install at least:

Vea también:See also:

Compatibilidad con TLS 1.2Support for TLS 1.2

Para que la aplicación pueda negociar con TLS 1.2, el sistema operativo y la versión de .NET Framework requieren compatibilidad con TLS 1.2.For your app to negotiate TLS 1.2, the OS and the .NET Framework version both need to support TLS 1.2.

Requisitos del sistema operativo para admitir TLS 1.2Operating system requirements to support TLS 1.2

Para habilitar o volver a habilitar TLS 1.2 o TLS 1.1 en un sistema que los admita, consulte Configuración del registro de seguridad de la capa (TLS) de transporte.To enable or re-enable TLS 1.2 and/or TLS 1.1 on a system that supports them, see Transport Layer Security (TLS) registry settings.

SOOS Compatibilidad con TLS 1.2TLS 1.2 support
Windows 10Windows 10
Windows Server 2016Windows Server 2016
Compatible, y habilitado de manera predeterminada.Supported, and enabled by default.
Windows 8.1Windows 8.1
Windows Server 2012 R2Windows Server 2012 R2
Compatible, y habilitado de manera predeterminada.Supported, and enabled by default.
Windows 8.0Windows 8.0
Windows Server 2012Windows Server 2012
Compatible, y habilitado de manera predeterminada.Supported, and enabled by default.
Windows 7 SP1Windows 7 SP1
Windows Server 2008 R2 SP1Windows Server 2008 R2 SP1
Compatible, pero no habilitado de manera predeterminada.Supported, but not enabled by default. Consulte la página web Configuración del registro de seguridad de la capa (TLS) de transporte para obtener más información sobre cómo habilitar TLS 1.2.See the Transport Layer Security (TLS) registry settings web page for details on how to enable TLS 1.2.
Windows Server 2008Windows Server 2008 La compatibilidad con TLS 1.2 y TLS 1.1 requiere una actualización.Support for TLS 1.2 and TLS 1.1 requires an update. Vea Actualización para agregar compatibilidad con TLS 1.1 y TLS 1.2 en Windows Server 2008 SP2.See Update to add support for TLS 1.1 and TLS 1.2 in Windows Server 2008 SP2.
Windows VistaWindows Vista No se admite.Not supported.

Para obtener información acerca de qué protocolos TLS/SSL protocolos están habilitados de forma predeterminada en cada versión de Windows, vea Protocols in TLS/SSL (Schannel SSP) (Protocolos en TLS/SSL [SSP de Schannel]).For information about which TLS/SSL protocols are enabled by default on each version of Windows, see Protocols in TLS/SSL (Schannel SSP).

Requisitos para admitir TLS 1.2 con .NET Framework 3.5Requirements to support TLS 1.2 with .NET Framework 3.5

En esta tabla se muestra la actualización del sistema operativo que necesitará para admitir TLS 1.2 con .NET Framework 3.5.This table shows the OS update you'll need to support TLS 1.2 with .NET Framework 3.5. Es recomendable que aplique todas las actualizaciones del sistema operativo.We recommend you apply all OS updates.

SOOS Actualización mínima necesaria para admitir TLS 1.2 con .NET Framework 3.5Minimum update needed to support TLS 1.2 with .NET Framework 3.5
Windows 10Windows 10
Windows Server 2016Windows Server 2016
Actualización acumulativa para Windows 10 versión 1511 y Windows Server 2016 Technical Preview 4: 10 de mayo de 2016Cumulative Update for Windows 10 Version 1511 and Windows Server 2016 Technical Preview 4: May 10, 2016
Windows 8.1Windows 8.1
Windows Server 2012 R2Windows Server 2012 R2
Support for TLS System Default Versions included in .NET Framework 3.5 on Windows 8.1 and Windows Server 2012 R2 (Compatibilidad para las versiones predeterminadas del sistema TLS incluidas en .NET Framework 3.5 en Windows 8.1 y Windows Server 2012 R2)Support for TLS System Default Versions included in the .NET Framework 3.5 on Windows 8.1 and Windows Server 2012 R2
Windows 8.0Windows 8.0
Windows Server 2012Windows Server 2012
Support for TLS System Default Versions included in .NET Framework 3.5 on Windows 8.1 and Windows Server 2012 R2 (Compatibilidad para las versiones predeterminadas del sistema TLS incluidas en .NET Framework 3.5 en Windows 8.1 y Windows Server 2012 R2)Support for TLS System Default Versions included in the .NET Framework 3.5 on Windows Server 2012
Windows 7 SP1Windows 7 SP1
Windows Server 2008 R2 SP1Windows Server 2008 R2 SP1
Support for TLS System Default Versions included in the .NET Framework 3.5.1 on Windows 7 SP1 and Server 2008 R2 SP1 (Compatibilidad para versiones predeterminadas del sistema TLS incluidas en .NET Framework 3.5.1 en Windows 7 SP1 y Server 2008 R2 SP1)Support for TLS System Default Versions included in the .NET Framework 3.5.1 on Windows 7 SP1 and Server 2008 R2 SP1
Windows Server 2008Windows Server 2008 Support for TLS System Default Versions included in the .NET Framework 2.0 SP2 on Windows Vista SP2 and Server 2008 SP2 (Compatibilidad para las versiones predeterminadas del sistema TLS incluidas en .NET Framework 2.0 SP2 en Windows Vista SP2 y Server 2008 SP2)Support for TLS System Default Versions included in the .NET Framework 2.0 SP2 on Windows Vista SP2 and Server 2008 SP2
Windows VistaWindows Vista No compatiblesNot supported