Ошибка 0x904 при подключении по RDP — при том что служба termservice запущена и порт 3389 открыт — почти всегда указывает на проблему с TLS-сертификатом на стороне сервера.
Причины могут быть разные: истёкший сертификат, повреждённые ключи в MachineKeys, слетевшая привязка сертификата к службе RDP после обновления или переименования машины. Решение во всех случаях одно — пересоздать сертификат с нуля.
Сначала останавливаем службу — иначе файлы ключей будут заблокированы:
Stop-Service termservice -Force
Переименовываем папку с ключами — это сброс без удаления, чтобы можно было откатиться:
Rename-Item "C:\ProgramData\Microsoft\Crypto\RSA\MachineKeys" "MachineKeys_bak"
MachineKeys. Если этого не произошло — создай её вручную командой mkdir "C:\ProgramData\Microsoft\Crypto\RSA\MachineKeys".Чистим старый сертификат из реестра и хранилища, чтобы служба не пыталась использовать невалидный:
Remove-Item "HKLM:\SOFTWARE\Microsoft\SystemCertificates\Remote Desktop" -Recurse -Force Remove-Item "Cert:\LocalMachine\Remote Desktop" -Recurse -Force -ErrorAction SilentlyContinue
-ErrorAction SilentlyContinue на второй команде нужен потому, что хранилище Remote Desktop может уже не существовать — это нормально, ошибку подавляем.Служба RDP должна создать сертификат сама при старте. Но если этого не происходит — создаём вручную:
$cert = New-SelfSignedCertificate ` -DnsName $env:COMPUTERNAME ` -CertStoreLocation "Cert:\LocalMachine\My" ` -KeyUsage DigitalSignature,KeyEncipherment ` -KeyAlgorithm RSA ` -KeyLength 2048 ` -HashAlgorithm SHA256 ` -NotAfter (Get-Date).AddYears(2) $thumbprint = $cert.Thumbprint Write-Host "Thumbprint: $thumbprint"
Сохрани выведенный Thumbprint — он понадобится на следующем шаге.
Привязываем новый сертификат к конфигурации RDP-tcp через WMI:
$path = (Get-WmiObject ` -Class Win32_TSGeneralSetting ` -Namespace root\cimv2\TerminalServices ` -Filter "TerminalName='RDP-tcp'").__PATH Set-WmiInstance -Path $path -Argument @{ SSLCertificateSHA1Hash = $thumbprint }
$thumbprint должна быть в той же сессии PowerShell, где запускался шаг 3. Если сессия новая — подставь значение вручную: $thumbprint = "ABCD1234..."Start-Service termservice Get-Service termservice
Статус должен быть Running. После этого RDP-подключение работает.
MachineKeys_bak можно удалить после того, как убедишься что всё работает стабильно.После пересоздания клиенты увидят диалог о новом, незнакомом сертификате. В рабочей среде это можно убрать: добавь сертификат в доверенные через GPO или экспортируй его и импортируй на клиентских машинах в хранилище Trusted Root Certification Authorities.
Проверь права на папку MachineKeys — служба RDP работает под учёткой NETWORK SERVICE и должна иметь доступ на запись:
$acl = Get-Acl "C:\ProgramData\Microsoft\Crypto\RSA\MachineKeys" $rule = New-Object System.Security.AccessControl.FileSystemAccessRule("NETWORK SERVICE", "FullControl", "Allow") $acl.SetAccessRule($rule) Set-Acl "C:\ProgramData\Microsoft\Crypto\RSA\MachineKeys" $acl
Если что-то пошло не так — верни старые ключи:
Stop-Service termservice -Force Remove-Item "C:\ProgramData\Microsoft\Crypto\RSA\MachineKeys" -Recurse -Force Rename-Item "C:\ProgramData\Microsoft\Crypto\RSA\MachineKeys_bak" "MachineKeys" Start-Service termservice
3389 заблокирован файрволом или служба не стартует по другой причине — это отдельная история.