TLS (Transport Layer Security) обеспечивает защищённое соединение между клиентом и сервером. Ниже описан процесс установки TLS-сессии в Windows и логика выбора версии протокола.
Windows действует как клиент, предлагающий серверу список поддерживаемых версий. Выбор осуществляется следующим образом:
По умолчанию Windows использует такой приоритет:
Путь в реестре:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols
Пример включения TLS 1.2:
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.2\Client] "Enabled"=dword:00000001 "DisabledByDefault"=dword:00000000
Значения:
Путь:
''Computer Configuration'' → ''Administrative Templates'' → ''Network'' → ''SSL Configuration Settings''
Поле:
''SSL Cipher Suite Order'' — задаёт приоритет шифров и версий TLS.
Просмотр текущих протоколов:
[Net.ServicePointManager]::SecurityProtocol
Установка конкретной версии:
[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12
Для проверки используемой версии TLS:
nmap --script ssl-enum-ciphers -p 443 host.itvideo.pro
.\openssl.exe s_client -tls1 -connect 192.168.11.10:443 -msg
curl --tlsv1.0 --tls-max 1.2 "https://powershellpro.ru"
function Test-ServerSSLSupport { [CmdletBinding()] param( [Parameter(Mandatory = $true, ValueFromPipeline = $true)] [ValidateNotNullOrEmpty()] [string]$HostName, [UInt16]$Port = 443 ) process { $RetValue = New-Object psobject -Property @{ Host = $HostName Port = $Port SSLv2 = $false SSLv3 = $false TLSv1_0 = $false TLSv1_1 = $false TLSv1_2 = $false TLSv1_3 = $false KeyExhange = $null HashAlgorithm = $null } | Select-Object Host, Port, SSLv2, SSLv3, TLSv1_0,TLSv1_1,TLSv1_2,TLSv1_3,KeyExhange,HashAlgorithm "ssl2", "ssl3", "tls", "tls11", "tls12",, "tls13" | %{ $TcpClient = New-Object Net.Sockets.TcpClient $TcpClient.Connect($RetValue.Host, $RetValue.Port) $SslStream = New-Object Net.Security.SslStream $TcpClient.GetStream(), $true, ([System.Net.Security.RemoteCertificateValidationCallback]{ $true }) $SslStream.ReadTimeout = 15000 $SslStream.WriteTimeout = 15000 try { $RetValue.KeyExhange = $SslStream.KeyExchangeAlgorithm $RetValue.HashAlgorithm = $SslStream.HashAlgorithm $status = $true } catch { $status = $false } "ssl2" {$RetValue.SSLv2 = $status} "ssl3" {$RetValue.SSLv3 = $status} "tls" {$RetValue.TLSv1_0 = $status} "tls11" {$RetValue.TLSv1_1 = $status} "tls12" {$RetValue.TLSv1_2 = $status} "tls13" {$RetValue.TLSv1_3 = $status} } # dispose objects to prevent memory leaks $TcpClient.Dispose() $SslStream.Dispose() } $RetValue } } "itvideo.pro","powershellpro.ru" | Test-ServerSSLSupport
Windows использует Schannel для обработки TLS-сессий. Чтобы видеть, какие версии TLS используют подключающиеся клиенты, нужно включить расширенное логирование событий.
Откройте редактор реестра regedit
и добавьте/измените ключ:
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL] "EventLogging"=dword:00000007
Значение 7
включает все типы логов: успешные и неуспешные подключения, параметры TLS и прочее.
После изменения необходимо перезагрузить сервер.
Откройте Просмотр событий
→ Журналы Windows
→ Система
→ фильтруйте по источнику:
Schannel
Обратите внимание на следующие ID событий:
Можно провести захват сетевого трафика, чтобы увидеть используемые протоколы TLS.
netsh trace start capture=yes report=yes persistent=yes tracefile=c:\tls_trace.etl
После запуска трассировки попросите клиента подключиться, затем остановите трассировку:
netsh trace stop
Полученный файл tls_trace.etl
можно анализировать:
etl2pcapng.exe tls_trace.etl tls_trace.pcapng
Если подключение не зашифровано IPsec и не происходит внутри туннеля:
tls.handshake.version
ssl.record.version
Будет видно, какая версия TLS использовалась при рукопожатии (TLS 1.0, 1.2, 1.3 и т.д.)
Если на сервере установлен [https://learn.microsoft.com/en-us/sysinternals/downloads/sysmon Sysmon], и он настроен для аудита сетевых подключений, то можно собирать TLS-сессии через журнал событий Sysmon + анализ в SIEM.