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

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

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

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

  • Клиент предлагает — сервер выбирает
    1. TLS 1.2 включён (в Windows 10/11, Server 2016+)
    2. Более старые версии могут поддерживать только TLS 1.0 и TLS 1.1
    3. TLS 1.3 поддерживается начиная с Windows 11 и Windows Server 2022. Включение TLS 1.3 в более ранних версиях Windows не является безопасной системной конфигурацией.
    4. TLS 1.0 и 1.1 рекомендуется отключать

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

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

Путь в реестре:

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

Значения:

  • "Enabled" = 1 — протокол включён
  • "DisabledByDefault" = 0 — включён по умолчанию

Путь:

Computer Configuration → Administrative Templates → Network → SSL Configuration Settings

Поле:

SSL Cipher Suite Order — задаёт приоритет шифров и версий TLS.

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

[Net.ServicePointManager]::SecurityProtocol

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

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

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

  • Перейдите на сайт: https://www.ssllabs.com/ssltest/
  • Введите адрес интересующего сервера
  • Посмотрите, какая версия TLS и шифр были согласованы

Удалённая проверка версии 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"
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-сервере

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

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

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

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

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

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

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

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

  • Источник: Schannel

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

  • 36874 — ошибка TLS handshake.
  • 36880 / 36881 / 36882 — информация о сертификатах и протоколах.
  • 36886 / 36887 — информация о версии TLS, выбранной при соединении.

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

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

netsh trace start capture=yes report=yes persistent=yes tracefile=c:\tls_trace.etl

После запуска трассировки попросите клиента подключиться, затем остановите трассировку:

netsh trace stop

📎 Анализ

Полученный файл tls_trace.etl можно анализировать:

  • В Microsoft Message Analyzer (устаревший)
  • Или преобразовать в pcapng и открыть в Wireshark:
etl2pcapng.exe tls_trace.etl tls_trace.pcapng

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

🔍 Фильтры Wireshark

  • Просмотр TLS-версий:
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.


  • Включение событий Schannel — самый простой способ.
  • Для продвинутого анализа можно использовать трассировку ETW и Wireshark.
  • При запрете TLS 1.0/1.1 — ошибки будут фиксироваться в журналах Schannel.