Como Inspecionar Sessões TLS Ativas no Windows 11 pelo PowerShell
🔍 WiseChecker

Como Inspecionar Sessões TLS Ativas no Windows 11 pelo PowerShell

Quando você precisa verificar se um aplicativo ou serviço está usando TLS 1.2, TLS 1.3 ou um protocolo mais antigo, inspecionar sessões TLS ativas diretamente do PowerShell oferece controle preciso. O Windows 11 não expõe detalhes de sessão TLS ao vivo no Gerenciador de Tarefas ou nas ferramentas padrão de monitoramento de rede. A causa raiz é que o sistema operacional lida com a criptografia no nível do kernel através do provedor de segurança SChannel, e as ferramentas voltadas ao usuário mostram apenas conexões TCP brutas, sem informações de versão do protocolo. Este artigo explica como usar cmdlets nativos do PowerShell e classes .NET para listar sessões TLS ativas, identificar a versão do protocolo negociada e filtrar resultados por processo ou endereço remoto.

Principais conclusões: Inspecionar sessões TLS pelo PowerShell

  • Get-NetTCPConnection com .NET SslStream: Lista todas as conexões TCP e verifica cada uma quanto à versão do protocolo TLS usando a classe SslStream.
  • Classe .NET System.Net.Security.SslStream: Consulta a versão TLS negociada em um socket ativo sem interromper a sessão.
  • Filtragem por nome do processo ou porta remota: Restringe os resultados a aplicativos ou serviços específicos, como navegadores web, clientes de e-mail ou SQL Server.

ADVERTISEMENT

Como as Sessões TLS Funcionam no Windows 11 e Por Que as Ferramentas Padrão São Insuficientes

As sessões TLS no Windows 11 são gerenciadas pelo provedor de serviços de segurança SChannel no nível do kernel. Quando um aplicativo inicia um handshake TLS, o SChannel negocia a versão de protocolo mais alta suportada mutuamente e estabelece uma sessão criptografada. A conexão TCP em si é visível em ferramentas como netstat ou Get-NetTCPConnection, mas a versão do protocolo (TLS 1.2 versus TLS 1.3) não é exposta nessas saídas. O Gerenciador de Tarefas mostra o uso de rede por processo, mas não revela detalhes de criptografia. Para ver a versão real do TLS, você precisa inspecionar programaticamente o socket após a conclusão do handshake. O PowerShell pode fazer isso usando a classe .NET SslStream, que lê a propriedade SslProtocols de uma conexão ativa.

Pré-requisitos para Inspecionar Sessões TLS

Você precisa do Windows 11 build 22000 ou posterior com PowerShell 5.1 ou PowerShell 7. Executar o script de inspeção requer privilégios administrativos se você quiser acessar sockets de propriedade de outros processos. O aplicativo alvo deve ter uma conexão TLS ativa no momento da inspeção. O script não interfere na conexão; ele apenas lê o protocolo negociado do socket existente.

Usando Get-NetTCPConnection e .NET SslStream para Listar Sessões TLS Ativas

O método a seguir usa Get-NetTCPConnection para recuperar todas as conexões TCP com o estado Established. Para cada conexão, ele cria um objeto cliente TCP temporário e recupera o socket subjacente. Em seguida, chama a classe .NET SslStream para autenticar o endpoint remoto e lê a propriedade SslProtocol. O script gera o endereço local, endereço remoto, ID do processo e a versão TLS negociada.

  1. Abra o PowerShell como Administrador
    Pressione a tecla Windows, digite PowerShell, clique com o botão direito em Windows PowerShell ou PowerShell 7 e selecione Executar como administrador. Clique em Sim no prompt de Controle de Conta de Usuário.
  2. Execute o cmdlet Get-NetTCPConnection para listar conexões estabelecidas
    Na janela do PowerShell, digite o seguinte comando e pressione Enter: Get-NetTCPConnection -State Established | Select-Object LocalAddress, LocalPort, RemoteAddress, RemotePort, OwningProcess. Isso mostra todas as conexões TCP ativas com seus IDs de processo. Anote o RemoteAddress e RemotePort das sessões TLS que deseja inspecionar.
  3. Crie um script PowerShell para inspecionar versões TLS
    Abra o Bloco de Notas ou qualquer editor de texto. Cole o script a seguir e salve-o como Get-TlsSession.ps1 na sua área de trabalho. O script aceita um endereço remoto e uma porta como parâmetros e gera a versão TLS para cada conexão correspondente.
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. Execute o script para inspecionar sessões TLS
    Na janela do PowerShell, navegue até a área de trabalho: cd ~\Desktop. Execute o script: .\Get-TlsSession.ps1. Para filtrar por um endereço remoto específico, use .\Get-TlsSession.ps1 -RemoteAddress "microsoft.com". Para filtrar por uma porta não padrão, use .\Get-TlsSession.ps1 -RemotePort 993 para IMAPS.
  2. Interprete a saída
    O script imprime cada conexão com o ID do processo, endpoint remoto e a string da versão TLS. Os valores possíveis incluem Ssl3, Tls, Tls11, Tls12, Tls13 ou uma mensagem de erro se a conexão não for TLS. Um valor de Tls13 indica TLS 1.3. Tls12 indica TLS 1.2. Tls11 ou Tls indicam protocolos mais antigos e menos seguros.

ADVERTISEMENT

Problemas Comuns ao Inspecionar Sessões TLS e Como Evitá-los

O script retorna um erro informando que o socket já está em uso

O script tenta se conectar ao mesmo endpoint remoto que já está conectado. Isso pode falhar se o servidor remoto fechar a conexão durante o handshake ou se o firewall local bloquear conexões de saída. Para contornar isso, verifique se o serviço remoto está acessível a partir da sua máquina. Você pode testar a conectividade com Test-NetConnection -ComputerName <remoto> -Port <porta> antes de executar o script.

O script retorna TLS: Error com System.UnauthorizedAccessException

Esse erro ocorre quando o PowerShell não tem permissão para abrir um socket de propriedade de outro processo. Execute o PowerShell como Administrador para resolver isso. Se o problema persistir, a conexão alvo pode ser de propriedade da conta SYSTEM ou de um processo protegido. Nesse caso, você não pode inspecionar a sessão TLS do modo de usuário.

A saída mostra apenas mensagens de erro para todas as conexões

O script tenta autenticar como cliente no servidor remoto. Se o servidor remoto exigir um certificado de cliente específico ou usar uma configuração TLS não padrão, a autenticação falha. Isso é esperado para serviços que não aceitam conexões de cliente arbitrárias. O script funciona melhor com servidores web públicos e serviços TLS padrão.

Get-NetTCPConnection vs SslStream: Comparação de Capacidades

Item Get-NetTCPConnection Classe .NET SslStream
Mostra a versão do protocolo TLS Não Sim
Requer direitos de administrador Não para processos próprios Sim para outros processos
Interrompe a conexão Não Não, apenas lê
Funciona com todas as conexões TCP Sim Apenas conexões TLS
Gera o nome do processo Por ID do processo Por ID do processo

Agora você pode inspecionar sessões TLS ativas no Windows 11 diretamente do PowerShell, sem ferramentas de terceiros. O script usa Get-NetTCPConnection para listar conexões e a classe .NET SslStream para ler a versão TLS negociada. Para uma solução de monitoramento mais permanente, considere agendar o script com o Agendador de Tarefas e registrar a saída em um arquivo CSV. Para ir além, modifique o script para verificar a cadeia de certificados lendo a propriedade RemoteCertificate do objeto SslStream.

ADVERTISEMENT