// DevOps
Windows Server 2019: RDP перестал подключаться, хотя порт 3389 открыт. Диагностика и лечение ошибки Event ID 1057
Опубликовано 08.07.2026
Вводная
Один из неприятных сценариев на Windows Server — когда Remote Desktop внезапно перестаёт работать, хотя снаружи всё выглядит «почти нормально»:
- порт
3389открыт; - служба Remote Desktop Services запущена;
- firewall не блокирует подключение;
qwinstaпоказывает, чтоrdp-tcpслушает;- но подключиться нельзя даже администратором;
- RemoteApp тоже не работает, потому что базовый RDP не поднимает сессию.
В моём случае проблема проявилась на Windows Server 2019 с RDS/RemoteApp. Сначала казалось, что сломался именно RemoteApp, но диагностика быстро показала: проблема ниже, на уровне RDP TLS / сертификата / SChannel.
Ключевой симптом в журнале событий:
Event ID: 1057
Provider: Microsoft-Windows-TerminalServices-RemoteConnectionManager
Серверу узла сеансов удаленных рабочих столов не удалось создать
новый самозаверяющий сертификат для использования при проверке
подлинности сервера узла сеансов удаленных рабочих столов при
подключениях SSL.
Код состояния: Указан неправильный алгоритм.В этой статье разберём:
- как правильно диагностировать такой отказ;
- как понять, что порт открыт, но RDP всё равно не работает;
- почему отключение TLS временно возвращает доступ;
- как восстановить нормальную работу RDP через корректный сертификат;
- почему нельзя оставлять
SecurityLayer = 0; - что проверить после восстановления;
- как вернуть RemoteApp/RDWeb после ремонта базового RDP.
1. Симптомы
Изначально проблема выглядела так:
- пользователи не могут запускать RemoteApp;
- обычное RDP-подключение тоже не работает;
- не входит даже администратор;
- порт
3389открыт; - службы RDP запущены.
Что видит пользователь на клиенте
Со стороны клиента mstsc эта поломка выглядит по-разному в зависимости от версии клиента и настроек подключения. Чаще всего это одно из двух сообщений.
Первый вариант — лаконичное:
Произошла внутренняя ошибка.В английской версии клиента:
An internal error has occurred.Второй вариант — с кодами:
Не удалось подключиться к удаленному сеансу, так как истекло время,
отведенное на установление соединения, или произошла ошибка.
Код ошибки: 0x904
Расширенный код ошибки: 0x7Оба сообщения — это одна и та же проблема, видимая с разных сторон. Клиент устанавливает TCP-соединение на 3389, начинает TLS handshake — и сервер обрывает соединение, потому что не может предъявить сертификат. Клиент не знает, почему сервер оборвал сессию, поэтому показывает обобщённую «внутреннюю ошибку» или код 0x904 с расширенным кодом 0x7.
Важный вывод для диагностики: если клиент показывает «Произошла внутренняя ошибка» или 0x904 / 0x7, коды на клиенте дальше можно не расшифровывать. Настоящая причина — на сервере, и искать её нужно в журнале событий сервера, а не на клиенте.
Состояние служб на сервере
На сервере службы выглядели так:
Get-Service TermService,SessionEnv,UmRdpService,W3SVC -ErrorAction SilentlyContinue |
Select-Object Name,DisplayName,Status,StartTypeПример вывода:
Name DisplayName Status StartType
---- ----------- ------ ---------
SessionEnv Настройка сервера удаленных рабочих столов Running Manual
TermService Службы удаленных рабочих столов Running Manual
UmRdpService Перенаправитель портов пользовательского режима служб удаленных рабочих столов Running Manual
W3SVC Служба веб-публикаций Stopped DisabledНа этом этапе важно не сделать ошибочный вывод.
W3SVC нужен для IIS и RD Web Access. Если он остановлен, веб-портал RemoteApp может быть недоступен. Но W3SVC сам по себе не должен ломать обычный mstsc на порт 3389.
Если не работает даже прямой RDP, нужно сначала чинить базовый RDP, а уже потом возвращаться к RemoteApp/RDWeb.
2. Важное разделение: открыт порт — не значит работает RDP
Очень частая ловушка: администратор проверяет порт 3389, видит, что он открыт, и считает, что RDP должен работать.
Например:
Test-NetConnection server.example.com -Port 3389Или с Linux/macOS:
nc -vz server.example.com 3389Если TCP-порт открыт, это доказывает только одно: до сервера можно установить TCP-соединение на 3389.
Это не доказывает, что дальше успешно работают:
- RDP listener;
- WinStation
RDP-Tcp; - TLS handshake;
- NLA;
- CredSSP;
- RDP certificate;
- права интерактивного входа;
- RDS licensing;
- RemoteApp collection.
В моём случае порт был открыт, но TLS-часть RDP не работала.
3. Первый слой диагностики: слушает ли RDP listener
На сервере нужно проверить состояние RDP-сессий:
qwinstaили:
query sessionВ моём случае вывод был таким:
СЕАНС ПОЛЬЗОВАТЕЛЬ ID СТАТУС ТИП УСТР-ВО
services 0 Диск
>console Администратор 1 Активно
rdp-tcp 65536 ПриемСтрока:
rdp-tcp 65536 Приемозначает, что RDP listener существует и находится в состоянии приёма подключений.
Также нужно проверить, не отключены ли новые входы:
change logon /queryНормальный вывод:
Вход из сеансов сейчас ВКЛЮЧЕНЕсли входы отключены, включаем:
change logon /enable4. Проверяем, не отключён ли RDP в registry
Базовая настройка RDP хранится здесь:
Get-ItemProperty 'HKLM:\SYSTEM\CurrentControlSet\Control\Terminal Server' |
Select-Object fDenyTSConnectionsНормальное значение:
fDenyTSConnections : 0Если там 1, RDP запрещён:
Set-ItemProperty `
-Path 'HKLM:\SYSTEM\CurrentControlSet\Control\Terminal Server' `
-Name fDenyTSConnections `
-Value 05. Проверяем параметры RDP-Tcp
Дальше смотрим настройки самого RDP listener:
$RdpTcp = 'HKLM:\SYSTEM\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp'
Get-ItemProperty $RdpTcp |
Select-Object `
PortNumber,
UserAuthentication,
SecurityLayer,
MinEncryptionLevel,
fEnableWinStation,
MaxInstanceCount,
SSLCertificateSHA1HashВ моём случае было:
PortNumber : 3389
UserAuthentication : 0
SecurityLayer : 2
MinEncryptionLevel : 2
fEnableWinStation : 1
MaxInstanceCount : 4294967295
SSLCertificateSHA1Hash :На первый взгляд всё почти нормально:
- порт
3389; - WinStation включён;
- максимальное число сессий не ограничено;
- NLA отключён для диагностики.
Но есть важная деталь:
SecurityLayer : 2
SSLCertificateSHA1Hash : пустоSecurityLayer = 2 означает, что RDP должен использовать SSL/TLS.
А пустой SSLCertificateSHA1Hash означает, что явной привязки сертификата нет.
Обычно Windows может сама создать self-signed сертификат для RDP. Но если создание сертификата ломается, TLS-подключение к RDP тоже ломается.
6. Что означают SecurityLayer и UserAuthentication
Для понимания диагностики важно знать, что означают основные параметры.
SecurityLayer
SecurityLayer = 0Используется старый RDP Security Layer. Это аварийный и менее безопасный режим. Его можно использовать только временно для восстановления доступа.
SecurityLayer = 1Negotiate. Клиент и сервер договариваются о доступном уровне безопасности. Обычно это практичный и безопасный вариант для восстановления.
SecurityLayer = 2SSL/TLS only. Сервер требует TLS. Если TLS-сертификат или SChannel сломан, RDP может перестать подключаться совсем.
UserAuthentication
UserAuthentication = 0NLA отключён.
UserAuthentication = 1NLA включён.
NLA желательно использовать в рабочем режиме, но на время диагностики его можно отключить, чтобы отделить проблему аутентификации от проблемы транспорта/TLS.
7. Ключевая проверка: отключаем TLS временно
Чтобы понять, действительно ли проблема в TLS, можно временно перевести RDP в аварийный режим:
$RdpTcp = 'HKLM:\SYSTEM\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp'
Set-ItemProperty -Path $RdpTcp -Name UserAuthentication -Value 0
Set-ItemProperty -Path $RdpTcp -Name SecurityLayer -Value 0
Set-ItemProperty -Path $RdpTcp -Name MinEncryptionLevel -Value 1
Restart-Service TermService -ForceУчтите: Restart-Service TermService -Force разрывает все активные RDP-сессии. В нашем сценарии подключиться всё равно никто не может, поэтому терять нечего, но на «полуживом» сервере это стоит помнить.
После этого проверяем подключение:
mstsc /admin /v:127.0.0.1Или с другой машины:
mstsc /admin /v:<server_ip>В моём случае после отключения TLS RDP заработал.
Это важнейший диагностический результат.
Он означает:
- порт
3389рабочий; TermServiceрабочий;- listener
rdp-tcpрабочий; - права администратора на вход есть;
- проблема не в firewall;
- проблема не в RemoteApp;
- проблема именно в RDP TLS / сертификате / SChannel.
8. Подтверждение через Event Viewer
После попыток подключения с TLS в журнале событий была ошибка:
Event ID: 1057
Provider: Microsoft-Windows-TerminalServices-RemoteConnectionManager
Level: Error
Серверу узла сеансов удаленных рабочих столов не удалось создать
новый самозаверяющий сертификат для использования при проверке
подлинности сервера узла сеансов удаленных рабочих столов при
подключениях SSL.
Код состояния: Указан неправильный алгоритм.«Указан неправильный алгоритм» — это текстовое описание ошибки NTE_BAD_ALGID (0x80090008) из криптографического API Windows. Именно она и приводит к тому, что клиент видит «Произошла внутренняя ошибка» или 0x904 / 0x7.
Посмотреть такие события можно командой:
Get-WinEvent `
-LogName System `
-MaxEvents 200 |
Where-Object {
$_.ProviderName -eq 'Microsoft-Windows-TerminalServices-RemoteConnectionManager' -and
$_.Id -eq 1057
} |
Select-Object TimeCreated, Id, ProviderName, LevelDisplayName, Message |
Format-ListТакже полезно проверить RDP-логи:
Get-WinEvent `
-LogName 'Microsoft-Windows-RemoteDesktopServices-RdpCoreTS/Admin' `
-MaxEvents 50 |
Select-Object TimeCreated, Id, LevelDisplayName, Message |
Format-ListGet-WinEvent `
-LogName 'Microsoft-Windows-RemoteDesktopServices-RdpCoreTS/Operational' `
-MaxEvents 50 |
Select-Object TimeCreated, Id, LevelDisplayName, Message |
Format-ListИ SChannel:
Get-WinEvent -LogName System -MaxEvents 200 |
Where-Object {
$_.ProviderName -eq 'Schannel' -or
$_.Message -match 'TLS|SSL|certificate|сертификат|handshake'
} |
Select-Object TimeCreated, Id, ProviderName, LevelDisplayName, Message |
Format-List9. Почему возникает Event ID 1057
В нормальной ситуации Windows Server может автоматически создать самозаверяющий сертификат для RDP. Этот сертификат используется для проверки подлинности сервера при TLS-подключении.
Ошибка 1057 говорит о том, что Windows не смогла создать такой сертификат.
Причины могут быть разные:
- повреждён или недоступен crypto provider;
- проблема с правами на
MachineKeys; - включены жёсткие crypto/FIPS-политики;
- отключены нужные TLS/SChannel алгоритмы;
- повреждена старая привязка RDP-сертификата;
- сертификат был удалён, но Windows не может создать новый;
- использован неподходящий алгоритм/провайдер;
- изменены настройки через hardening-инструменты вроде IIS Crypto или GPO;
- повреждены системные компоненты криптографии.
В моём случае самый быстрый и правильный recovery-путь — не ждать автогенерации от TermService, а создать сертификат вручную и явно привязать его к RDP-tcp.
10. Перед исправлением: делаем backup
Перед изменением RDP-настроек сохраняем текущую ветку registry:
mkdir C:\Temp 2>nul
reg export "HKLM\SYSTEM\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp" C:\Temp\RDP-Tcp-backup.reg /yТакже сохраняем текущие параметры:
$RdpTcp = 'HKLM:\SYSTEM\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp'
Get-ItemProperty $RdpTcp |
Select-Object `
PortNumber,
UserAuthentication,
SecurityLayer,
MinEncryptionLevel,
fEnableWinStation,
SSLCertificateSHA1Hash |
Out-File C:\Temp\RDP-Tcp-before.txt11. Проверяем FIPS-политику
Ошибка «Указан неправильный алгоритм» может быть связана с crypto policy. Проверяем FIPS:
Get-ItemProperty `
'HKLM:\SYSTEM\CurrentControlSet\Control\Lsa\FipsAlgorithmPolicy' `
-ErrorAction SilentlyContinue |
Select-Object EnabledЕсли:
Enabled : 1значит FIPS включён.
Также стоит проверить результат групповых политик:
gpresult /h C:\Temp\gpresult.htmlВ отчёте ищем:
System cryptography: Use FIPS compliant algorithms for encryption, hashing, and signingЕсли сервер в домене и FIPS включён через GPO, не стоит просто отключать его локально. Локальные изменения могут откатиться, а сама политика могла быть включена по требованиям безопасности.
12. Проверяем TLS 1.2 в SChannel
На Windows Server 2019 для RDP нормально использовать TLS 1.2.
Проверяем настройки TLS:
$paths = @(
'HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.2\Client',
'HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.2\Server',
'HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.0\Client',
'HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.0\Server',
'HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.1\Client',
'HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.1\Server'
)
foreach ($path in $paths) {
Write-Host "`n$path" -ForegroundColor Cyan
Get-ItemProperty $path -ErrorAction SilentlyContinue |
Select-Object Enabled, DisabledByDefault
}Если TLS 1.2\Server существует и там:
Enabled : 0или:
DisabledByDefault : 1TLS 1.2 на серверной стороне отключён.
Кстати, отключённый на сервере TLS 1.2 — сам по себе частая причина клиентской ошибки «Произошла внутренняя ошибка», даже когда сертификат в порядке: современный клиент просто не может согласовать протокол.
Включить TLS 1.2 можно так:
$Tls12Server = 'HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.2\Server'
$Tls12Client = 'HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.2\Client'
New-Item -Path $Tls12Server -Force | Out-Null
New-Item -Path $Tls12Client -Force | Out-Null
New-ItemProperty -Path $Tls12Server -Name Enabled -Value 1 -PropertyType DWord -Force | Out-Null
New-ItemProperty -Path $Tls12Server -Name DisabledByDefault -Value 0 -PropertyType DWord -Force | Out-Null
New-ItemProperty -Path $Tls12Client -Name Enabled -Value 1 -PropertyType DWord -Force | Out-Null
New-ItemProperty -Path $Tls12Client -Name DisabledByDefault -Value 0 -PropertyType DWord -Force | Out-NullПосле изменения SChannel-настроек часто нужна перезагрузка. Но сначала можно восстановить RDP-сертификат и проверить работу.
13. Проверяем права на MachineKeys
Windows хранит машинные приватные ключи здесь:
C:\ProgramData\Microsoft\Crypto\RSA\MachineKeysЕсли права на каталог сломаны, службы могут не создавать или не читать приватные ключи.
Сохраняем текущие ACL:
mkdir C:\Temp 2>nul
icacls C:\ProgramData\Microsoft\Crypto\RSA\MachineKeys /t /c > C:\Temp\MachineKeys-before.txtБазовое восстановление прав:
takeown /f "C:\ProgramData\Microsoft\Crypto\RSA\MachineKeys" /a /r
icacls "C:\ProgramData\Microsoft\Crypto\RSA\MachineKeys" /t /c /grant "NT AUTHORITY\SYSTEM:(F)"
icacls "C:\ProgramData\Microsoft\Crypto\RSA\MachineKeys" /t /c /grant "BUILTIN\Administrators:(F)"
icacls "C:\ProgramData\Microsoft\Crypto\RSA\MachineKeys" /t /c /grant "NT AUTHORITY\NETWORK SERVICE:(R)"
icacls "C:\ProgramData\Microsoft\Crypto\RSA\MachineKeys" /t /c > C:\Temp\MachineKeys-after.txtЭто recovery-шаг. В продакшене лучше сохранять исходные ACL и понимать, какие политики управляют правами.
14. Удаляем старую RDP TLS-привязку
Удаляем старый hash сертификата из RDP-Tcp:
$RdpTcp = 'HKLM:\SYSTEM\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp'
Remove-ItemProperty `
-Path $RdpTcp `
-Name SSLCertificateSHA1Hash `
-ErrorAction SilentlyContinueУдаляем старые RDP self-signed сертификаты из хранилища Remote Desktop:
Get-ChildItem 'Cert:\LocalMachine\Remote Desktop' -ErrorAction SilentlyContinue |
Remove-Item -ForceПроверяем, что осталось:
Get-ChildItem 'Cert:\LocalMachine\Remote Desktop' -ErrorAction SilentlyContinue |
Select-Object Subject, Thumbprint, NotAfter15. Создаём новый сертификат вручную
Ключевой момент: сертификат лучше создать явно с RSA/SHA256 и совместимым crypto provider.
В моём случае я использовал:
Microsoft RSA SChannel Cryptographic ProviderКоманда:
$ComputerSystem = Get-CimInstance Win32_ComputerSystem
$DnsNames = @($env:COMPUTERNAME)
if ($ComputerSystem.PartOfDomain) {
$DnsNames += "$env:COMPUTERNAME.$($ComputerSystem.Domain)"
}
$Cert = New-SelfSignedCertificate `
-DnsName $DnsNames `
-CertStoreLocation 'Cert:\LocalMachine\My' `
-Provider 'Microsoft RSA SChannel Cryptographic Provider' `
-KeyAlgorithm RSA `
-KeyLength 2048 `
-HashAlgorithm SHA256 `
-KeySpec KeyExchange `
-KeyUsage DigitalSignature, KeyEncipherment `
-NotAfter (Get-Date).AddYears(3) `
-TextExtension @('2.5.29.37={text}1.3.6.1.5.5.7.3.1')
$Cert |
Select-Object Subject, Thumbprint, NotAfter, HasPrivateKeyНужно убедиться, что:
HasPrivateKey : TrueБез приватного ключа такой сертификат для RDP бесполезен.
Даём TermService доступ к приватному ключу
TermService работает от имени NETWORK SERVICE. Если у этой учётной записи нет права читать приватный ключ, RDP не сможет использовать сертификат — и мы получим ту же клиентскую «внутреннюю ошибку», только с новым сертификатом.
Выдаём права на файл ключа:
$RsaKey = [System.Security.Cryptography.X509Certificates.RSACertificateExtensions]::GetRSAPrivateKey($Cert)
$KeyFile = $RsaKey.Key.UniqueName
$KeyPath = Join-Path 'C:\ProgramData\Microsoft\Crypto\RSA\MachineKeys' $KeyFile
icacls $KeyPath /grant 'NT AUTHORITY\NETWORK SERVICE:(R)'Проверяем:
icacls $KeyPathВ выводе должна быть строка с NT AUTHORITY\NETWORK SERVICE:(R).
16. Привязываем сертификат к RDP listener
Теперь назначаем сертификат на RDP-tcp.
$RdpSetting = Get-WmiObject `
-Namespace 'root\cimv2\TerminalServices' `
-Class 'Win32_TSGeneralSetting' `
-Filter "TerminalName='RDP-tcp'"
Set-WmiInstance `
-Path $RdpSetting.__PATH `
-Arguments @{ SSLCertificateSHA1Hash = $Cert.Thumbprint }Проверяем:
Get-WmiObject `
-Namespace 'root\cimv2\TerminalServices' `
-Class 'Win32_TSGeneralSetting' `
-Filter "TerminalName='RDP-tcp'" |
Select-Object TerminalName, SSLCertificateSHA1HashТакже проверяем registry:
Get-ItemProperty `
'HKLM:\SYSTEM\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp' |
Select-Object SSLCertificateSHA1HashЗначение должно быть не пустым.
17. Возвращаем RDP из аварийного режима
Не стоит сразу возвращать принудительный TLS SecurityLayer = 2.
Сначала ставим безопасный промежуточный вариант:
$RdpTcp = 'HKLM:\SYSTEM\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp'
Set-ItemProperty -Path $RdpTcp -Name SecurityLayer -Value 1
Set-ItemProperty -Path $RdpTcp -Name MinEncryptionLevel -Value 2
Set-ItemProperty -Path $RdpTcp -Name UserAuthentication -Value 0
Restart-Service TermService -ForceПроверяем локально:
mstsc /admin /v:127.0.0.1Проверяем снаружи:
mstsc /admin /v:<server_ip_or_fqdn>Если работает — возвращаем NLA:
Set-ItemProperty `
-Path 'HKLM:\SYSTEM\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp' `
-Name UserAuthentication `
-Value 1
Restart-Service TermService -ForceПроверяем ещё раз:
mstsc /admin /v:<server_ip_or_fqdn>18. Можно ли вернуть SecurityLayer = 2
Если хочется принудительно использовать TLS, после успешной проверки с SecurityLayer = 1 можно попробовать:
$RdpTcp = 'HKLM:\SYSTEM\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp'
Set-ItemProperty -Path $RdpTcp -Name SecurityLayer -Value 2
Set-ItemProperty -Path $RdpTcp -Name MinEncryptionLevel -Value 3
Set-ItemProperty -Path $RdpTcp -Name UserAuthentication -Value 1
Restart-Service TermService -ForceПроверяем:
mstsc /admin /v:<server_ip_or_fqdn>Если при SecurityLayer = 1 всё работает, а при SecurityLayer = 2 снова ломается, значит проблема с TLS/SChannel/certificate policy полностью не устранена.
В таком случае лучше временно оставить:
SecurityLayer = 1
UserAuthentication = 1
MinEncryptionLevel = 2 или 3Это значительно лучше, чем аварийный режим:
SecurityLayer = 019. Проверяем, исчезла ли ошибка 1057
После восстановления сертификата и перезапуска TermService проверяем журнал:
Get-WinEvent `
-LogName System `
-MaxEvents 100 |
Where-Object {
$_.ProviderName -eq 'Microsoft-Windows-TerminalServices-RemoteConnectionManager' -and
$_.Id -eq 1057
} |
Select-Object TimeCreated, Id, LevelDisplayName, Message |
Format-ListЕсли новых событий 1057 после перезапуска нет, это хороший признак.
Также можно посмотреть события рядом:
Get-WinEvent `
-LogName System `
-MaxEvents 100 |
Where-Object {
$_.ProviderName -eq 'Microsoft-Windows-TerminalServices-RemoteConnectionManager' -and
$_.Id -in 1056,1057,1058
} |
Select-Object TimeCreated, Id, LevelDisplayName, Message |
Format-List20. Проверяем политики RDP через GPO
Если сервер в домене, настройки могут приходить политиками.
Создаём отчёт:
gpresult /h C:\Temp\gpresult.htmlВ отчёте ищем:
Computer Configuration
Administrative Templates
Windows Components
Remote Desktop Services
Remote Desktop Session Host
SecurityОсобенно важны политики:
Require use of specific security layer for remote (RDP) connections
Require user authentication for remote connections by using Network Level Authentication
Set client connection encryption level
Server authentication certificate templateТакже проверяем registry-политику:
Get-ItemProperty `
'HKLM:\SOFTWARE\Policies\Microsoft\Windows NT\Terminal Services' `
-ErrorAction SilentlyContinue |
Select-Object SecurityLayer, UserAuthentication, MinEncryptionLevel, SSLCertificateSHA1HashЕсли там задано что-то вроде:
SecurityLayer : 2локальные изменения могут откатываться после gpupdate.
21. Что делать с RemoteApp и RDWeb после восстановления RDP
После того как обычный RDP заработал, можно возвращаться к RemoteApp.
В моём случае W3SVC был остановлен и отключён:
W3SVC Stopped DisabledДля RD Web Access это проблема.
Включаем IIS:
Set-Service W3SVC -StartupType Automatic
Start-Service W3SVCПроверяем:
Get-Service W3SVCПроверяем доступность RDWeb:
https://<server_fqdn>/RDWebЕсли используется RD Gateway, проверяем:
Get-Service TSGateway -ErrorAction SilentlyContinueИ логи:
Get-WinEvent `
-LogName 'Microsoft-Windows-TerminalServices-Gateway/Operational' `
-MaxEvents 50 |
Select-Object TimeCreated, Id, LevelDisplayName, Message |
Format-ListПроверяем RDS deployment:
Import-Module RemoteDesktop
Get-RDServer
Get-RDSessionCollection
Get-RDRemoteAppПроверяем права на коллекцию:
Get-RDSessionCollection | ForEach-Object {
Write-Host "`nCollection: $($_.CollectionName)" -ForegroundColor Cyan
Get-RDSessionCollectionConfiguration `
-CollectionName $_.CollectionName `
-UserGroup
}22. Минимальный recovery-чеклист
Если нужно быстро восстановить доступ, порядок такой.
1. Проверить listener
qwinsta
change logon /queryДолжно быть:
rdp-tcp Прием
Вход из сеансов сейчас ВКЛЮЧЕН2. Проверить параметры RDP
$RdpTcp = 'HKLM:\SYSTEM\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp'
Get-ItemProperty $RdpTcp |
Select-Object PortNumber, UserAuthentication, SecurityLayer, MinEncryptionLevel, fEnableWinStation, SSLCertificateSHA1Hash3. Если нужно срочно войти — временно отключить TLS
Set-ItemProperty -Path $RdpTcp -Name UserAuthentication -Value 0
Set-ItemProperty -Path $RdpTcp -Name SecurityLayer -Value 0
Set-ItemProperty -Path $RdpTcp -Name MinEncryptionLevel -Value 1
Restart-Service TermService -ForceПроверить:
mstsc /admin /v:<server_ip>4. Проверить Event ID 1057
Get-WinEvent `
-LogName System `
-MaxEvents 200 |
Where-Object {
$_.ProviderName -eq 'Microsoft-Windows-TerminalServices-RemoteConnectionManager' -and
$_.Id -eq 1057
} |
Select-Object TimeCreated, Id, ProviderName, LevelDisplayName, Message |
Format-List5. Создать и привязать новый RSA/SHA256 сертификат
$RdpTcp = 'HKLM:\SYSTEM\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp'
Remove-ItemProperty `
-Path $RdpTcp `
-Name SSLCertificateSHA1Hash `
-ErrorAction SilentlyContinue
Get-ChildItem 'Cert:\LocalMachine\Remote Desktop' -ErrorAction SilentlyContinue |
Remove-Item -Force
$ComputerSystem = Get-CimInstance Win32_ComputerSystem
$DnsNames = @($env:COMPUTERNAME)
if ($ComputerSystem.PartOfDomain) {
$DnsNames += "$env:COMPUTERNAME.$($ComputerSystem.Domain)"
}
$Cert = New-SelfSignedCertificate `
-DnsName $DnsNames `
-CertStoreLocation 'Cert:\LocalMachine\My' `
-Provider 'Microsoft RSA SChannel Cryptographic Provider' `
-KeyAlgorithm RSA `
-KeyLength 2048 `
-HashAlgorithm SHA256 `
-KeySpec KeyExchange `
-KeyUsage DigitalSignature, KeyEncipherment `
-NotAfter (Get-Date).AddYears(3) `
-TextExtension @('2.5.29.37={text}1.3.6.1.5.5.7.3.1')
$RsaKey = [System.Security.Cryptography.X509Certificates.RSACertificateExtensions]::GetRSAPrivateKey($Cert)
$KeyPath = Join-Path 'C:\ProgramData\Microsoft\Crypto\RSA\MachineKeys' $RsaKey.Key.UniqueName
icacls $KeyPath /grant 'NT AUTHORITY\NETWORK SERVICE:(R)'
$RdpSetting = Get-WmiObject `
-Namespace 'root\cimv2\TerminalServices' `
-Class 'Win32_TSGeneralSetting' `
-Filter "TerminalName='RDP-tcp'"
Set-WmiInstance `
-Path $RdpSetting.__PATH `
-Arguments @{ SSLCertificateSHA1Hash = $Cert.Thumbprint }6. Вернуть нормальный режим
Set-ItemProperty -Path $RdpTcp -Name SecurityLayer -Value 1
Set-ItemProperty -Path $RdpTcp -Name MinEncryptionLevel -Value 2
Set-ItemProperty -Path $RdpTcp -Name UserAuthentication -Value 0
Restart-Service TermService -ForceПроверить:
mstsc /admin /v:<server_ip>Если работает — вернуть NLA:
Set-ItemProperty -Path $RdpTcp -Name UserAuthentication -Value 1
Restart-Service TermService -Force23. Что нельзя делать
Нельзя оставлять SecurityLayer = 0
Это аварийный режим. Он помог доказать, что проблема в TLS, но для постоянной эксплуатации не подходит.
Нельзя начинать с переустановки RDS
Если rdp-tcp слушает и RDP оживает без TLS, переустановка RDS почти наверняка избыточна.
Нельзя чинить RemoteApp, пока не работает обычный mstsc
RemoteApp зависит от RDP. Если базовый RDP не работает, диагностика RemoteApp будет шумной и малоэффективной.
Нельзя игнорировать GPO
Если настройки безопасности приходят из доменной политики, локальные исправления могут откатываться.
Нельзя удалять сертификаты вслепую без понимания
Удаление RDP self-signed сертификата обычно допустимо, но если был назначен корпоративный сертификат, его нужно будет назначить заново.
24. Почему это решение сработало
Диагностика показала:
Порт 3389 открыт
TermService запущен
rdp-tcp слушает
Входы разрешены
RDP без TLS работает
RDP с TLS не работает
Event ID 1057: TermService не может создать self-signed certificateЗначит проблема была не в сети, не в firewall и не в правах администратора.
Корневая проблема находилась в цепочке:
TermService → RDP TLS certificate → SChannel / crypto provider → TLS handshakeРучное создание RSA/SHA256 сертификата и явная привязка к RDP-tcp убирают зависимость от сломанной автогенерации сертификата.
После этого можно вернуть нормальные параметры безопасности:
SecurityLayer = 1
UserAuthentication = 1И уже после этого заниматься RemoteApp, RDWeb, RD Gateway и коллекциями RDS.
25. Итог
Если на Windows Server 2019 перестал работать RDP, но порт 3389 открыт, нельзя ограничиваться проверкой firewall. Открытый TCP-порт не означает, что RDP успешно проходит TLS/NLA/CredSSP.
Со стороны клиента такая поломка выглядит как «Произошла внутренняя ошибка» (An internal error has occurred) или как код ошибки 0x904 с расширенным кодом 0x7. Расшифровывать эти клиентские коды бесполезно — причина на сервере.
В моём случае ключом к диагностике стало сравнение:
SecurityLayer = 2 → RDP не работает
SecurityLayer = 0 → RDP работаетИ подтверждение в Event Viewer:
Event ID 1057
Не удалось создать новый самозаверяющий сертификат
Код состояния: Указан неправильный алгоритмПравильное лечение:
- временно восстановить доступ через
SecurityLayer = 0; - не оставлять этот режим постоянно;
- удалить старую RDP TLS-привязку;
- создать новый RSA/SHA256 сертификат;
- дать
NETWORK SERVICEдоступ к его приватному ключу; - явно назначить сертификат на
RDP-tcp; - вернуть
SecurityLayer = 1; - вернуть NLA;
- проверить GPO и SChannel;
- после восстановления базового RDP чинить RDWeb/RemoteApp.
Главная мысль: RemoteApp нельзя диагностировать, пока не работает обычный RDP. Сначала нужно поднять базовый RDP listener с нормальным TLS, и только потом разбирать верхние роли RDS.
// Reviews
Отзывы по теме
Пришел с дорогим запросом по настройке VPS-сервера, но в процессе консультации Михаил предложил гораздо более простое и экономичное решение. В итоге сэкономил бюджет и время. Михаил — настоящий эксперт, который работает на результат клиента, а не на чек. Рекомендую!
Пришел с дорогим запросом по настройке VPS-сервера, но в процессе консультации Михаил предложил гораздо более простое и экономичное решение. В итоге сэкономил бюджет и время. Михаил — настоящий эксперт, который работает …
Настройка vps, настройка сервера
12.05.2026 · ★ 5/5
Отличная работа! Очень быстро настроил сервер, установил панель, прописал IP. Однозначно могу порекомендовать!
Отличная работа ! Очень быстро настроил сервер, установил панель прописал IP Однозначно могу по рекомендовать !
Всё отлично, помог оперативно и профессионально, спасибо, рекомендую сообществу
Всё отлично, помог оперативно и профессионально, спасибо, рекомендую сообществу
Настройка vps, настройка сервера
16.04.2026 · ★ 5/5
Было несколько проблем касаясь как технической части так и понимания в целом. Михаил быстро ответил на запрос, помог разобраться и решил проблеммы технические и помог разобраться в понимании, за что отдельное спасибо. Результатом доволен.
Было несколько проблем касаясь как технической части так и понимания в целом. Михаил быстро ответил на запрос, помог разобраться и решил проблеммы технические и помог разобраться в понимании, за что отдельное спасибо. …
Настройка vps, настройка сервера
18.02.2026 · ★ 5/5
Все было сделано быстро и четко. Рекомендую
Все было сделано быстро и четко. Рекомендую
Настройка vps, настройка сервера
17.01.2026 · ★ 5/5
Всё прошло хорошо, исполнитель быстро реагировал на вопросы и помог решить проблему. Спасибо!
Всё прошло хорошо, исполнитель быстро реагировал на вопросы и помог решить проблему. Спасибо!
Настройка vps, настройка сервера
16.12.2025 · ★ 5/5
// Contact
Нужна помощь?
Свяжись со мной и я помогу решить проблему
Написать в TelegramОтвечаю в течение рабочего дня (03:00–13:00 GMT)
Или оставьте заявку здесь:
// Related