Cómo inspeccionar sesiones TLS activas en Windows 11 desde powershell
🔍 WiseChecker

Cómo inspeccionar sesiones TLS activas en Windows 11 desde powershell

Cuando necesita verificar si una aplicación o servicio está usando TLS 1.2, TLS 1.3 o un protocolo anterior, inspeccionar las sesiones TLS activas directamente desde PowerShell le brinda un control preciso. Windows 11 no expone los detalles de las sesiones TLS en vivo en el Administrador de tareas ni en las herramientas estándar de supervisión de red. La causa raíz es que el sistema operativo maneja el cifrado a nivel del kernel a través del proveedor de seguridad SChannel, y las herramientas orientadas al usuario solo muestran conexiones TCP sin información de la versión del protocolo. Este artículo explica cómo usar los cmdlets integrados de PowerShell y las clases de .NET para enumerar las sesiones TLS activas, identificar la versión de protocolo negociada y filtrar los resultados por proceso o dirección remota.

Puntos clave: Inspeccionar sesiones TLS desde PowerShell

  • Get-NetTCPConnection con .NET SslStream: Enumera todas las conexiones TCP y luego verifica cada una para determinar la versión del protocolo TLS usando la clase SslStream.
  • Clase System.Net.Security.SslStream de .NET: Consulta la versión de TLS negociada en un socket activo sin interrumpir la sesión.
  • Filtrado por nombre de proceso o puerto remoto: Reduce los resultados a aplicaciones o servicios específicos, como navegadores web, clientes de correo o SQL Server.

ADVERTISEMENT

Cómo funcionan las sesiones TLS en Windows 11 y por qué las herramientas estándar son insuficientes

Las sesiones TLS en Windows 11 son administradas por el proveedor de servicios de seguridad SChannel a nivel del kernel. Cuando una aplicación inicia un protocolo de enlace TLS, SChannel negocia la versión de protocolo compatible más alta y establece una sesión cifrada. La conexión TCP en sí es visible en herramientas como netstat o Get-NetTCPConnection, pero la versión del protocolo TLS 1.2 frente a TLS 1.3 no se expone en esas salidas. El Administrador de tareas muestra el uso de red por proceso, pero no revela los detalles de cifrado. Para ver la versión real de TLS, debe inspeccionar el socket mediante programación después de que se complete el protocolo de enlace. PowerShell puede hacerlo aprovechando la clase SslStream de .NET, que lee la propiedad SslProtocols de una conexión activa.

Requisitos previos para inspeccionar sesiones TLS

Necesita Windows 11 compilación 22000 o posterior con PowerShell 5.1 o PowerShell 7. Ejecutar el script de inspección requiere privilegios administrativos si desea acceder a sockets que pertenecen a otros procesos. La aplicación de destino debe tener una conexión TLS activa en el momento de la inspección. El script no interfiere con la conexión; solo lee el protocolo negociado del socket existente.

Uso de Get-NetTCPConnection y .NET SslStream para enumerar sesiones TLS activas

El siguiente método usa Get-NetTCPConnection para recuperar todas las conexiones TCP con el estado Established. Para cada conexión, crea un objeto de cliente TCP temporal y recupera el socket subyacente. Luego llama a la clase SslStream de .NET para autenticar el punto de conexión remoto y lee la propiedad SslProtocol. El script genera la dirección local, la dirección remota, el identificador de proceso y la versión de TLS negociada.

  1. Abra PowerShell como administrador
    Presione la tecla Windows, escriba PowerShell, haga clic con el botón derecho en Windows PowerShell o PowerShell 7 y seleccione Ejecutar como administrador. Haga clic en Sí en el aviso de Control de cuentas de usuario.
  2. Ejecute el cmdlet Get-NetTCPConnection para enumerar las conexiones establecidas
    En la ventana de PowerShell, escriba el siguiente comando y presione Entrar: Get-NetTCPConnection -State Established | Select-Object LocalAddress, LocalPort, RemoteAddress, RemotePort, OwningProcess. Esto muestra todas las conexiones TCP activas con sus identificadores de proceso. Anote RemoteAddress y RemotePort de las sesiones TLS que desea inspeccionar.
  3. Cree un script de PowerShell para inspeccionar las versiones de TLS
    Abra el Bloc de notas o cualquier editor de texto. Pegue el siguiente script y guárdelo como Get-TlsSession.ps1 en el escritorio. El script toma una dirección remota y un puerto como parámetros y genera la versión de TLS para cada conexión coincidente.
param(
    [string]$RemoteAddress = "".ToLower(),
    [int]$RemotePort = 443
)

$connections = Get-NetTCPConnection -State Established | Where-Object {
    ($_.RemoteAddress -like $RemoteAddress) -and ($_.RemotePort -eq $RemotePort)
}

foreach ($conn in $connections) {
    $tcpClient = New-Object System.Net.Sockets.TcpClient
    try {
        $tcpClient.Client.DontFragment = $true
        $tcpClient.Client.SetSocketOption([System.Net.Sockets.SocketOptionLevel]::Tcp, [System.Net.Sockets.SocketOptionName]::NoDelay, $true)
        $tcpClient.Client.Connect($conn.RemoteAddress, $conn.RemotePort)
        $sslStream = New-Object System.Net.Security.SslStream($tcpClient.GetStream(), $false, { $true })
        $sslStream.AuthenticateAsClient($conn.RemoteAddress)
        $tlsVersion = $sslStream.SslProtocol.ToString()
        Write-Output "Process ID: $($conn.OwningProcess), Remote: $($conn.RemoteAddress):$($conn.RemotePort), TLS: $tlsVersion"
    }
    catch {
        Write-Output "Process ID: $($conn.OwningProcess), Remote: $($conn.RemoteAddress):$($conn.RemotePort), TLS: Error - $($_.Exception.Message)"
    }
    finally {
        $sslStream.Close()
        $tcpClient.Close()
    }
}
  1. Ejecute el script para inspeccionar las sesiones TLS
    En la ventana de PowerShell, navegue al escritorio: cd ~\Desktop. Ejecute el script: .\Get-TlsSession.ps1. Para filtrar por una dirección remota específica, use .\Get-TlsSession.ps1 -RemoteAddress "microsoft.com". Para filtrar por un puerto no predeterminado, use .\Get-TlsSession.ps1 -RemotePort 993 para IMAPS.
  2. Interprete la salida
    El script imprime cada conexión con el identificador de proceso, el punto de conexión remoto y la cadena de versión de TLS. Los valores posibles incluyen Ssl3, Tls, Tls11, Tls12, Tls13 o un mensaje de error si la conexión no es TLS. Un valor de Tls13 indica TLS 1.3. Tls12 indica TLS 1.2. Tls11 o Tls indican protocolos anteriores y menos seguros.

ADVERTISEMENT

Problemas comunes al inspeccionar sesiones TLS y cómo evitarlos

El script devuelve un error que indica que el socket ya está en uso

El script intenta conectarse al mismo punto de conexión remoto que ya está conectado. Esto puede fallar si el servidor remoto cierra la conexión durante el protocolo de enlace o si el firewall local bloquea las conexiones salientes. Para solucionarlo, asegúrese de que el servicio remoto sea accesible desde su equipo. Puede probar la conectividad con Test-NetConnection -ComputerName <remote> -Port <port> antes de ejecutar el script.

El script devuelve TLS: Error con System.UnauthorizedAccessException

Este error ocurre cuando PowerShell no tiene permiso para abrir un socket que pertenece a otro proceso. Ejecute PowerShell como administrador para resolverlo. Si el problema persiste, la conexión de destino podría pertenecer a la cuenta SYSTEM o a un proceso protegido. En ese caso, no puede inspeccionar la sesión TLS desde el modo de usuario.

La salida muestra solo mensajes de error para todas las conexiones

El script intenta autenticarse como cliente en el servidor remoto. Si el servidor remoto requiere un certificado de cliente específico o usa una configuración de TLS no estándar, la autenticación falla. Esto es lo esperado para los servicios que no aceptan conexiones de cliente arbitrarias. El script funciona mejor con servidores web públicos y servicios TLS estándar.

Get-NetTCPConnection frente a SslStream: Comparación de capacidades

Elemento Get-NetTCPConnection Clase SslStream de .NET
Muestra la versión del protocolo TLS No
Requiere derechos de administrador No para procesos propios Sí para otros procesos
Interrumpe la conexión No No, solo lee
Funciona con todas las conexiones TCP Solo conexiones TLS
Genera el nombre del proceso Por identificador de proceso Por identificador de proceso

Ahora puede inspeccionar las sesiones TLS activas en Windows 11 directamente desde PowerShell sin herramientas de terceros. El script usa Get-NetTCPConnection para enumerar las conexiones y la clase SslStream de .NET para leer la versión de TLS negociada. Para obtener una solución de supervisión más permanente, considere programar el script con el Programador de tareas y registrar la salida en un archivo CSV. Para ir más allá, modifique el script para comprobar la cadena de certificados leyendo la propiedad RemoteCertificate del objeto SslStream.

ADVERTISEMENT