[ Главная ] [ Блог ] 💛 Поддержать проект
// Услуги
🖥 IT Техподдержка

// Проекты
📊 BeitBoard 📡 OwrtCloud 🌐 BeLaz 🛡 AWG Manager 🧅 TG-Tor-Proxy 📓 Synology Note Bot

// Инструменты
🛡 WireGuard Generator ⚡ VLESS Converter 🔍 VLESS Checker 🔀 MikroTik SNI Generator 🔧 Split Routing WG / AWG 🔗 WG Site-to-Site
~ / blog / rdp-cert-fix

RDP ошибка 0x904: пересоздание сертификата как быстрое решение

// 27.07.2026 · ~7 мин чтения · root@beit24
// содержание
  1. Симптом и причина
  2. Шаг 1 — Сброс MachineKeys
  3. Шаг 2 — Удаление старого сертификата
  4. Шаг 3 — Создание нового сертификата
  5. Шаг 4 — Назначение сертификата службе RDP
  6. Шаг 5 — Запуск и проверка
  7. Примечания
// 01 — симптом

Симптом и причина

// Подключение к удалённому рабочему столу
Код ошибки: 0x904
Расширенный код: 0x7
Не удаётся подключиться к удалённому компьютеру. Повторите попытку подключения.

Ошибка 0x904 при подключении по RDP — при том что служба termservice запущена и порт 3389 открыт — почти всегда указывает на проблему с TLS-сертификатом на стороне сервера.

Причины могут быть разные: истёкший сертификат, повреждённые ключи в MachineKeys, слетевшая привязка сертификата к службе RDP после обновления или переименования машины. Решение во всех случаях одно — пересоздать сертификат с нуля.

ℹ️
Все команды выполняются в PowerShell от имени администратора на проблемном сервере. Если RDP полностью недоступен — используй консоль через Hyper-V, iLO/iDRAC, KVM или физический доступ.
// 02 — шаг 1
1

Останавливаем службу RDP и сбрасываем MachineKeys

Сначала останавливаем службу — иначе файлы ключей будут заблокированы:

powershell
Stop-Service termservice -Force

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

powershell
Rename-Item "C:\ProgramData\Microsoft\Crypto\RSA\MachineKeys" "MachineKeys_bak"
⚠️
При переименовании Windows автоматически создаст новую пустую папку MachineKeys. Если этого не произошло — создай её вручную командой mkdir "C:\ProgramData\Microsoft\Crypto\RSA\MachineKeys".
// 03 — шаг 2
2

Удаляем старый RDP-сертификат

Чистим старый сертификат из реестра и хранилища, чтобы служба не пыталась использовать невалидный:

powershell
Remove-Item "HKLM:\SOFTWARE\Microsoft\SystemCertificates\Remote Desktop" -Recurse -Force
Remove-Item "Cert:\LocalMachine\Remote Desktop" -Recurse -Force -ErrorAction SilentlyContinue
ℹ️
Флаг -ErrorAction SilentlyContinue на второй команде нужен потому, что хранилище Remote Desktop может уже не существовать — это нормально, ошибку подавляем.
// 04 — шаг 3
3

Создаём новый самоподписанный сертификат

Служба RDP должна создать сертификат сама при старте. Но если этого не происходит — создаём вручную:

powershell
$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 — он понадобится на следующем шаге.

// 05 — шаг 4
4

Назначаем сертификат службе RDP

Привязываем новый сертификат к конфигурации RDP-tcp через WMI:

powershell
$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..."
// 06 — шаг 5
5

Запускаем службу и проверяем

powershell
Start-Service termservice
Get-Service termservice

Статус должен быть Running. После этого RDP-подключение работает.

При первом подключении клиент покажет предупреждение о новом сертификате — это нормально, просто подтверди. Папку MachineKeys_bak можно удалить после того, как убедишься что всё работает стабильно.
// 07 — примечания

Примечания

Предупреждение о сертификате при подключении

После пересоздания клиенты увидят диалог о новом, незнакомом сертификате. В рабочей среде это можно убрать: добавь сертификат в доверенные через GPO или экспортируй его и импортируй на клиентских машинах в хранилище Trusted Root Certification Authorities.

Если служба не запускается после шага 5

Проверь права на папку MachineKeys — служба RDP работает под учёткой NETWORK SERVICE и должна иметь доступ на запись:

powershell
$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

Откат

Если что-то пошло не так — верни старые ключи:

powershell
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
⚠️
Метод решает проблему именно с сертификатом RDP. Если порт 3389 заблокирован файрволом или служба не стартует по другой причине — это отдельная история.