Содержание

Установка TLS-сессии в Windows

TLS (Transport Layer Security) обеспечивает защищённое соединение между клиентом и сервером. Ниже описан процесс установки TLS-сессии в Windows и логика выбора версии протокола.

Этапы установки TLS-сессии

  1. Клиент отправляет сообщение ClientHello, в котором указывает:
    • Поддерживаемые версии TLS (например, TLS 1.2, 1.3)
    • Список шифров (cipher suites)
    • Дополнительные расширения (SNI, ALPN и др.)
  2. Сервер отвечает ServerHello, выбирая:
    • Совместимую версию TLS
    • Подходящий шифр
    • Отправляет сертификат и параметры ключей
  3. Происходит обмен ключами (например, через ECDHE)
  4. Стороны производят проверку и устанавливают симметричное шифрование
  5. Обе стороны отправляют сообщение Finished, после чего начинается защищённая передача данных

Логика выбора версии TLS

Windows действует как клиент, предлагающий серверу список поддерживаемых версий. Выбор осуществляется следующим образом:

Приоритет TLS-версий

По умолчанию Windows использует такой приоритет:

  1. TLS 1.3 (если поддерживается)
  2. TLS 1.2
  3. TLS 1.1 (устарел)
  4. TLS 1.0 (устарел)

Настройки в реестре 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.

Проверка и настройка через PowerShell

Просмотр текущих протоколов:

[Net.ServicePointManager]::SecurityProtocol

Установка конкретной версии:

[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12

Проверка через браузер

Для проверки используемой версии TLS:

Удалённая проверка версии TLS поддерживаемой сервером

NMAP

nmap --script ssl-enum-ciphers -p 443 host.itvideo.pro

OpenSSL

.\openssl.exe s_client -tls1 -connect 192.168.11.10:443 -msg

Curl

curl --tlsv1.0 --tls-max 1.2 "https://powershellpro.ru"

PowerShell

Test-ServerSSLSupport.ps1
  1. function Test-ServerSSLSupport {
  2. [CmdletBinding()]
  3. param(
  4. [Parameter(Mandatory = $true, ValueFromPipeline = $true)]
  5. [ValidateNotNullOrEmpty()]
  6. [string]$HostName,
  7. [UInt16]$Port = 443
  8. )
  9. process {
  10. $RetValue = New-Object psobject -Property @{
  11. Host = $HostName
  12. Port = $Port
  13. SSLv2 = $false
  14. SSLv3 = $false
  15. TLSv1_0 = $false
  16. TLSv1_1 = $false
  17. TLSv1_2 = $false
  18. TLSv1_3 = $false
  19. KeyExhange = $null
  20. HashAlgorithm = $null
  21. } | Select-Object Host, Port, SSLv2, SSLv3, TLSv1_0,TLSv1_1,TLSv1_2,TLSv1_3,KeyExhange,HashAlgorithm
  22.  
  23. "ssl2", "ssl3", "tls", "tls11", "tls12",, "tls13" | %{
  24. $TcpClient = New-Object Net.Sockets.TcpClient
  25. $TcpClient.Connect($RetValue.Host, $RetValue.Port)
  26. $SslStream = New-Object Net.Security.SslStream $TcpClient.GetStream(),
  27. $true,
  28. ([System.Net.Security.RemoteCertificateValidationCallback]{ $true })
  29. $SslStream.ReadTimeout = 15000
  30. $SslStream.WriteTimeout = 15000
  31. try {
  32. $SslStream.AuthenticateAsClient($RetValue.Host,$null,$_,$false)
  33. $RetValue.KeyExhange = $SslStream.KeyExchangeAlgorithm
  34. $RetValue.HashAlgorithm = $SslStream.HashAlgorithm
  35. $status = $true
  36. } catch {
  37. $status = $false
  38. }
  39. switch ($_) {
  40. "ssl2" {$RetValue.SSLv2 = $status}
  41. "ssl3" {$RetValue.SSLv3 = $status}
  42. "tls" {$RetValue.TLSv1_0 = $status}
  43. "tls11" {$RetValue.TLSv1_1 = $status}
  44. "tls12" {$RetValue.TLSv1_2 = $status}
  45. "tls13" {$RetValue.TLSv1_3 = $status}
  46. }
  47. # dispose objects to prevent memory leaks
  48. $TcpClient.Dispose()
  49. $SslStream.Dispose()
  50. }
  51. $RetValue
  52. }
  53. }
  54.  
  55. "itvideo.pro","powershellpro.ru" | Test-ServerSSLSupport

Проверка версии TLS клиентов на Windows-сервере

1. Включение журналирования Schannel

Windows использует Schannel для обработки TLS-сессий. Чтобы видеть, какие версии TLS используют подключающиеся клиенты, нужно включить расширенное логирование событий.

🛠 Настройка через реестр

Откройте редактор реестра regedit и добавьте/измените ключ:

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL]
"EventLogging"=dword:00000007

Значение 7 включает все типы логов: успешные и неуспешные подключения, параметры TLS и прочее.

После изменения необходимо перезагрузить сервер.

📋 Просмотр логов

Откройте Просмотр событийЖурналы WindowsСистема → фильтруйте по источнику:

Обратите внимание на следующие ID событий:


2. Трассировка с помощью netsh и PowerShell

Можно провести захват сетевого трафика, чтобы увидеть используемые протоколы TLS.

▶ Захват с помощью netsh

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

3. Анализ с помощью Wireshark

Если подключение не зашифровано IPsec и не происходит внутри туннеля:

🔍 Фильтры Wireshark

tls.handshake.version
ssl.record.version

Будет видно, какая версия TLS использовалась при рукопожатии (TLS 1.0, 1.2, 1.3 и т.д.)


4. Использование Sysmon (опционально)

Если на сервере установлен [https://learn.microsoft.com/en-us/sysinternals/downloads/sysmon Sysmon], и он настроен для аудита сетевых подключений, то можно собирать TLS-сессии через журнал событий Sysmon + анализ в SIEM.


Рекомендации