Endurecimiento de TLS y Schannel en Windows
Deshabilita SSL, TLS 1.0/1.1 y los cifrados débiles en Schannel, fija el orden de los conjuntos de cifrado por GPO y haz que .NET use criptografía fuerte.
La mayoría de los componentes de Windows que hablan TLS lo hacen a través de Schannel, la implementación de SSL y TLS de Windows. IIS, Escritorio remoto, LDAPS en los controladores de dominio, WinRM sobre HTTPS, AD FS, SQL Server y toda aplicación de .NET Framework que llame a HttpClient heredan sus elecciones de protocolo y de cifrado. Los valores por defecto antiguos mantenían disponibles SSL 3.0, TLS 1.0 y TLS 1.1 y permitían cifrados como 3DES y RC4, lo que habilita ataques de degradación y descifrado con nombres como POODLE, BEAST y SWEET32.
Esta guía pertenece al área de protocolos heredados. La guía pilar trata la resolución de nombres, SMB y NTLM; aquí el foco es el cifrado del transporte.
Dónde está Windows hoy
Microsoft ha ido deshabilitando TLS 1.0 y 1.1 por defecto en las versiones recientes de Windows, empezando por las versiones preliminares de Windows 11 en 2023. Windows 11 24H2 y 25H2 y Windows Server 2025 están mucho más cerca de un estado endurecido por defecto que Windows Server 2016 o 2019, pero los valores por defecto varían según la compilación y algunos los controlan las actualizaciones, así que consulta la documentación actual de Microsoft para tus versiones y, sobre todo, mide lo que negocian realmente tus servidores.
| Protocolo | Estado | Acción |
|---|---|---|
| SSL 2.0, SSL 3.0 | Roto | Deshabilitar en todas partes |
| TLS 1.0, TLS 1.1 | Obsoleto (RFC 8996) | Deshabilitar tras el inventario |
| TLS 1.2 | Vigente | Habilitar, con un orden de conjuntos de cifrado sólido |
| TLS 1.3 | Vigente (Windows 11, Server 2022+) | Dejar habilitado |
Paso 1: averiguar quién sigue usando TLS 1.0 y 1.1
Apagar a ciegas los protocolos antiguos rompe cosas que habías olvidado que existían: un escáner que envía correo por SMTP con STARTTLS, una aplicación Java antigua que habla con LDAPS, un agente de supervisión, una biblioteca cliente de SQL de 2012.
- Registro de eventos de Schannel. Aumenta el registro en
HKLM\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNELconEventLogging(DWORD). El valor por defecto1registra solo errores;7registra errores, advertencias y eventos informativos, incluidos los protocolos de enlace correctos (el evento 36880 del registro System muestra el protocolo y el conjunto de cifrado). Genera mucho ruido; actívalo en una muestra de servidores durante unos días, no de forma permanente. - Registro de IIS. IIS 10 puede registrar el protocolo y el cifrado negociados mediante campos de registro personalizados basados en variables de servidor como
CRYPT_PROTOCOLyCRYPT_CIPHER_ALG_ID. Añádelos en los servidores web y busca los valores de protocolo de TLS 1.0 y 1.1. - Controladores de dominio. Los clientes LDAPS que usan TLS antiguo aparecen en los eventos de Schannel de los DC. Prueba un DC en laboratorio antes de producción: algunos dispositivos de red solo hablan TLS 1.0 con LDAPS.
- Análisis externo. Herramientas como el script
ssl-enum-ciphersde Nmap o testssl.sh, ejecutadas desde una estación de administración contra cada servicio a la escucha, te dan una imagen del antes y el después.
Paso 2: deshabilitar los protocolos antiguos
La configuración de protocolos reside en HKLM\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\<Protocol>\Server y ...\Client. Dos valores DWORD controlan cada uno: Enabled y DisabledByDefault.
$base = "HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols"
foreach ($p in "SSL 2.0","SSL 3.0","TLS 1.0","TLS 1.1") {
foreach ($side in "Server","Client") {
$key = "$base\$p\$side"
New-Item -Path $key -Force | Out-Null
Set-ItemProperty -Path $key -Name Enabled -Value 0 -Type DWord
Set-ItemProperty -Path $key -Name DisabledByDefault -Value 1 -Type DWord
}
}
foreach ($side in "Server","Client") {
$key = "$base\TLS 1.2\$side"
New-Item -Path $key -Force | Out-Null
Set-ItemProperty -Path $key -Name Enabled -Value 1 -Type DWord
Set-ItemProperty -Path $key -Name DisabledByDefault -Value 0 -Type DWord
}A escala, despliega los mismos valores con elementos de Registro de las preferencias de directiva de grupo o con una corrección de Intune, y reinicia. Deshabilita primero el lado Server en los servidores que hayas inventariado; deshabilita el lado Client cuando sepas que el equipo no se conecta a servicios heredados. Las líneas base de seguridad de Microsoft no gestionan estas claves, así que es una de las opciones que tienes que añadir tú.
Paso 3: eliminar los cifrados y el intercambio de claves débiles
Los conmutadores de cifrado están en ...\SCHANNEL\Ciphers\<Cipher> con Enabled = 0:
| Clave | Por qué |
|---|---|
NULL | Sin cifrado |
DES 56/56 | Trivial por fuerza bruta |
RC2 40/128, RC2 56/128, RC2 128/128 | Obsoleto |
RC4 40/128, RC4 56/128, RC4 64/128, RC4 128/128 | Flujo de clave sesgado |
Triple DES 168 | Bloque de 64 bits, SWEET32 |
Para Diffie-Hellman, establece ServerMinKeyBitLength = 2048 (DWORD, valor 0x800) en ...\SCHANNEL\KeyExchangeAlgorithms\Diffie-Hellman. La mayoría de los conjuntos modernos usan ECDHE de todos modos, pero esto impide una degradación a grupos DH débiles.
Varios nombres de clave contienen una barra, algo que el proveedor del Registro de PowerShell maneja mal. Créalas con un archivo .reg, con las preferencias de directiva de grupo o con la API del Registro de .NET en lugar de New-Item.
Paso 4: establecer el orden de los conjuntos de cifrado
El orden de los conjuntos de cifrado decide qué conjuntos ofrece Schannel y con qué prioridad. Configúralo con directiva de grupo: Computer Configuration > Policies > Administrative Templates > Network > SSL Configuration Settings > SSL Cipher Suite Order. El valor es una única lista separada por comas; el cuadro de texto de la directiva está limitado a 1023 caracteres, así que enumera solo lo que quieras, del más fuerte al más débil. Una lista razonable de TLS 1.2 para servidores:
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_SHA256Introdúcela sin saltos de línea. En Windows 11 y Server 2022 y posteriores, añade los conjuntos de TLS 1.3 (TLS_AES_256_GCM_SHA384, TLS_AES_128_GCM_SHA256) al principio si gestionas el orden por directiva, o podrían quedar fuera. La opción complementaria ECC Curve Order de la misma carpeta define la preferencia de curvas.
El módulo TLS de PowerShell muestra y modifica la lista efectiva localmente:
Get-TlsCipherSuite | Format-Table Name, Protocols
Disable-TlsCipherSuite -Name "TLS_RSA_WITH_3DES_EDE_CBC_SHA"
Get-TlsEccCurveCuando existe la opción de directiva de grupo, prevalece sobre los cambios locales hechos con estos cmdlets. Gestiona el orden en un solo sitio.
Ten en cuenta la compatibilidad: si eliminas todos los conjuntos que no son ECDHE, se rompen algunos clientes y dispositivos antiguos que solo usan TLS_RSA_WITH_AES_*. Decide de forma consciente, basándote en el inventario del paso 1.
Paso 5: hacer que .NET Framework use criptografía fuerte
Las aplicaciones de .NET Framework compiladas para destinos antiguos pueden quedarse fijadas en TLS 1.0 independientemente de Schannel. Dos valores lo corrigen para los runtimes de 64 y 32 bits:
$paths = "HKLM:\SOFTWARE\Microsoft\.NETFramework\v4.0.30319",
"HKLM:\SOFTWARE\WOW6432Node\Microsoft\.NETFramework\v4.0.30319",
"HKLM:\SOFTWARE\Microsoft\.NETFramework\v2.0.50727",
"HKLM:\SOFTWARE\WOW6432Node\Microsoft\.NETFramework\v2.0.50727"
foreach ($p in $paths) {
if (Test-Path $p) {
Set-ItemProperty $p -Name SchUseStrongCrypto -Value 1 -Type DWord
Set-ItemProperty $p -Name SystemDefaultTlsVersions -Value 1 -Type DWord
}
}SystemDefaultTlsVersions deja que el sistema operativo elija el protocolo, y SchUseStrongCrypto elimina los protocolos y cifrados débiles de los valores por defecto propios de .NET. Las aplicaciones que fijan en el código SecurityProtocolType.Tls siguen necesitando un cambio de código. El .NET moderno (5 y posteriores) ya usa los valores por defecto del sistema operativo.
Paso 6: desplegar por anillos
Los cambios de Schannel afectan a todo el equipo y requieren reinicio, así que un cambio fallido tumba a la vez todos los servicios TLS de ese equipo. Despliega según el riesgo, no según la comodidad:
| Anillo | Ámbito | Qué cambiar |
|---|---|---|
| 1 | Estaciones de administración, servidores de prueba de TI | Todo: protocolos, cifrados, orden, .NET |
| 2 | Puestos de trabajo | SSL y cifrados débiles desactivados; TLS 1.0/1.1 desactivados en el lado cliente; criptografía fuerte en .NET |
| 3 | Servidores web y de aplicaciones inventariados | TLS 1.0/1.1 desactivados en el lado servidor, orden de cifrado |
| 4 | Controladores de dominio, AD FS, Exchange, SQL Server | Lo mismo, de servidor en servidor, tras las comprobaciones con fabricantes y aplicaciones |
| 5 | Excepciones | Aisladas, documentadas, con fecha de fin |
En cada anillo, recoge el resultado del análisis y el recuento de errores de Schannel antes y después. Ten preparada una reversión: una GPO o un script que vuelva a poner Enabled en 1 para el protocolo concreto, no una restauración completa de la clave SCHANNEL.
Las excepciones son normales. Un dispositivo antiguo que solo habla TLS 1.0 se gestiona mejor aislándolo en su propio segmento de red detrás de un proxy que termine TLS moderno que manteniendo TLS 1.0 habilitado en los servidores con los que habla.
Qué se rompe
- Compilaciones antiguas de SQL Server y controladores cliente anteriores a la compatibilidad con TLS 1.2. Aplica primero las revisiones de SQL Server y actualiza los controladores (ODBC, OLE DB).
- Impresoras, escáneres y dispositivos que envían correo o consultan LDAPS.
- Clientes RDP antiguos en sistemas sin parches, cuando TLS 1.0 está desactivado en los hosts RDP.
- Software de terceros con Java u OpenSSL integrados que fija TLS 1.0 en el código.
- Herramientas de administración que se conectan a WinRM sobre HTTPS o a WSUS desde versiones antiguas del sistema operativo.
Verificarlo
- Desde fuera: repite el análisis del paso 1. Los protocolos de enlace TLS 1.0 y 1.1 deben fallar; solo se ofrecen los conjuntos que has elegido.
- En el equipo:
Get-TlsCipherSuitedevuelve solo los conjuntos esperados; las claves del Registro coinciden con la tabla anterior. - Registros: mantén
EventLoggingde Schannel en1en producción y genera alertas ante picos de eventos de error de Schannel después de cada anillo de cambios. - Aplicaciones: ejecuta las pruebas de humo de tu lista de inventario, no solo una comprobación con el navegador; los navegadores no usan esta configuración.
Lista de comprobación
- Usuarios de TLS 1.0/1.1 inventariados mediante eventos de Schannel, registros de IIS y análisis
- SSL 2.0/3.0 deshabilitados en todas partes; TLS 1.0/1.1 deshabilitados en el lado servidor y después en el lado cliente
- NULL, DES, RC2, RC4 y 3DES deshabilitados; DH con un mínimo de 2048 bits
- Orden de conjuntos de cifrado establecido una sola vez, por GPO, con ECDHE y AES-GCM primero
-
SchUseStrongCryptoySystemDefaultTlsVersionsde .NET establecidos en las claves de 32 y 64 bits - Servidores reiniciados y analizados de nuevo después de cada anillo
- Excepciones documentadas con un responsable y una fecha de fin
Un TLS sólido protege los canales de los que dependen otros controles, como WinRM sobre HTTPS y el Escritorio remoto. Vuelve a comprobarlo después de cada actualización de las líneas base descrita en la guía de líneas base de seguridad.
Preguntas frecuentes
¿Afecta a los navegadores deshabilitar TLS 1.0 y 1.1 en Schannel?
En general, no. Chrome, Edge y Firefox usan sus propias pilas TLS y ya rechazan TLS 1.0 y 1.1 por defecto. La configuración de Schannel afecta a los componentes de Windows y a las aplicaciones que usan la pila TLS de Windows: IIS, RDP, LDAPS, SMTP en Exchange, SQL Server, clientes WinHTTP, PowerShell y la mayoría de las aplicaciones de .NET Framework. Esos son los sistemas que hay que inventariar y probar.
¿Hace falta reiniciar después de cambiar la configuración de Schannel?
Sí. Los valores del Registro de protocolos y cifrados bajo la clave SCHANNEL se leen cuando se inicia el subsistema de seguridad, así que planifica un reinicio en cada servidor que modifiques. El orden de los conjuntos de cifrado definido por directiva de grupo también se aplica tras un reinicio. Programa los cambios en ventanas de mantenimiento y verifica desde fuera después de cada reinicio en lugar de fiarte solo del Registro.
¿Debo habilitar TLS 1.3 en Windows Server?
TLS 1.3 es compatible y está habilitado por defecto para Schannel en Windows Server 2022 y posteriores y en Windows 11. Déjalo activado. Elimina por completo las opciones débiles y completa los protocolos de enlace más rápido. Los servidores más antiguos, como Windows Server 2019, no admiten TLS 1.3 en Schannel, así que TLS 1.2 con un orden de conjuntos de cifrado sólido sigue siendo su techo.
Endurecimiento de TLS y Schannel en Windows