Проблема с RDP-подключением из политики сертификатов.

Общее описание

Зачем это нужно?

Microsoft изменила политику безопасности RDP. Теперь при каждом подключении к непроверенному серверу появляется предупреждение, в котором отключены чекбоксы для запоминания выбора. Это делает невозможным "запомнить" сервер.

2026-04-16_18-00-22.png

Решение

Мы создаем собственные сертификаты и устанавливаем доверие к ним:

  • На сервере: создается сертификат для шифрования RDP-сессии и подписываются RDP-файлы

  • На клиенте: сертификаты устанавливаются в доверенные хранилища

Всё это делаем через скрипты PowerShell. Скрипты лежать на FTP по пути 0:/JINS/RDP/script/. 

Create-And-Bind-RdpCert.ps1

Client-Setup.ps1

Принцип работы

Сервер:
  1. Создает сертификат для шифрования (RDP-Server-IP.pfx + .cer)
  2. Создает сертификат для подписи RDP-файлов (RDP-Sign-IP.cer)
  3. Подписывает RDP-файлы
  4. Привязывает сертификат к RDP-слушателю

Клиент:
  1. Получает CER-файлы с сервера
  2. Устанавливает их в доверенные хранилища
  3. Использует подписанные RDP-файлы

 

Структура файлов

На сервере (C:\distr)

C:\distr\
├── Create-And-Bind-RdpCert.ps1          # ГЛАВНЫЙ СКРИПТ (все в одном)
├── certificate-setup.log                # Лог выполнения (создается автоматически)
├── certs\                               # Папка с сертификатами
│   ├── RDP-Server-IPSERVER.pfx    # С закрытым ключом (НЕ РАЗДАВАТЬ!)
│   ├── RDP-Server-IPSERVER.cer    # Публичный (раздавать клиентам)
│   └── RDP-Sign-IPSERVER.cer      # Публичный (раздавать клиентам)
└── RDP\                                 # Папка с RDP файлами
    ├── server1.rdp                      # Подписанные файлы
    ├── server2.rdp
    └── ...

 

На клиенте (C:\distr)

C:\distr\
├── Client-Setup.ps1                     # Клиентский скрипт
└── certs\                               # Папка с сертификатами (с сервера)
    ├── RDP-Server-IPSERVER.cer    # С сервера 1
    ├── RDP-Sign-IPSERVER.cer      # С сервера 1
    ├── RDP-Server-IPSERVER2.cer    # С сервера 2
    ├── RDP-Sign-IPSERVER2.cer      # С сервера 2
    └── ...                              # И т.д.

 

Настройка сервера

Шаг 1: Создайте папку и скопируйте скрипт

powershell
# Создаем папки
New-Item -Path "C:\distr" -ItemType Directory -Force
New-Item -Path "C:\distr\certs" -ItemType Directory -Force
New-Item -Path "C:\distr\RDP" -ItemType Directory -Force

# Скопируйте скрипт Create-And-Bind-RdpCert.ps1 в C:\distr

Шаг 2: Запустите скрипт

powershell
cd C:\distr
.\Create-And-Bind-RdpCert.ps1 -IpAddress 000.000.000.000 -Force

Где:

  • -IpAddress - ваш публичный IP-адрес сервера, заменяем 000.000.000.000 на правильный 

  • -Force - пересоздать сертификаты (если уже есть)

Шаг 3: Что произойдет?

Скрипт автоматически выполнит:

  1. Очистку старых сертификатов

  2. Создание серверного сертификата с уникальным именем

  3. Создание сертификата подписи с уникальным именем

  4. Экспорт PFX и CER файлов

  5. Проверку текущей привязки RDP

  6. Подпись всех RDP файлов в папке C:\distr\RDP

  7. Привязку сертификата к RDP-слушателю

  8. Перезапуск службы TermService (опционально)

  9. Сохранение лога в certificate-setup.log

Шаг 4: Подготовьте файлы для клиентов

Скопируйте эти файлы для раздачи клиентам:

  • C:\distr\certs\RDP-Server-000.000.000.000.cer

  • C:\distr\certs\RDP-Sign-000.000.000.000.cer

  • Подписанные .rdp файлы из папки C:\distr\RDP\

Шаг 5: Проверьте результат

Скрипт автоматически вывел информацию о привязке и создал файл лога. Вы можете:

Просмотреть лог выполнения:

powershell
Get-Content C:\distr\certificate-setup.log

 

Настройка клиента

Шаг 1: Создайте папку и скопируйте файлы

powershell
# Создаем папки
New-Item -Path "C:\distr" -ItemType Directory -Force
New-Item -Path "C:\distr\certs" -ItemType Directory -Force

# Копируйте с сервера в C:\distr\certs:
# - RDP-Server-000.000.000.000.cer
# - RDP-Sign-000.000.000.000.cer

# Скопируйте скрипт Client-Setup.ps1 в C:\distr

Шаг 2: Запустите клиентский скрипт

Вариант А: Установка для конкретного сервера

powershell
cd C:\distr
.\Client-Setup.ps1 -ServerIp 000.000.000.000

Вариант Б: Установка всех найденных сертификатов

powershell
.\Client-Setup.ps1 -InstallAll

Вариант В: Интерактивный режим (выбор из списка)

powershell
.\Client-Setup.ps1

Вариант Г: Просмотр доступных сертификатов

powershell
.\Client-Setup.ps1 -ListCertificates

Шаг 3: Что произойдет?

Скрипт автоматически:

  1. Найдет все CER-файлы в папке C:\distr\certs

  2. Установит серверные сертификаты в Cert:\LocalMachine\Root

  3. Установит сертификаты подписи в Cert:\LocalMachine\Root и Cert:\LocalMachine\TrustedPublisher

  4. Настроит политику TrustedCertThumbprints в реестре

Тестовое подключение

  1. Закройте все открытые сессии mstsc/RemoteApp

  2. Откройте подписанный RDP-файл из папки C:\distr\RDP

  3. При подключении не должно быть предупреждения о сертификате

  4. Если предупреждение появилось, нажмите "Подключиться", чекбоксы сохраняться. 

2026-04-17_02-33-03.png

Диагностика и проверка

Проверка на сервере

powershell
# 1. Проверка привязанного сертификата
$ts = Get-WmiObject -Namespace "root\cimv2\TerminalServices" -Class "Win32_TSGeneralSetting" -Filter "TerminalName='RDP-tcp'"
Write-Host "Current RDP certificate: $($ts.SSLCertificateSHA1Hash)" -ForegroundColor Cyan

# 2. Информация о сертификате по отпечатку
$thumb = $ts.SSLCertificateSHA1Hash
Get-ChildItem "Cert:\LocalMachine\My" | Where-Object { $_.Thumbprint -eq $thumb } | Select-Object Subject, NotAfter, Thumbprint

# 3. Перезапуск RDP службы
Restart-Service -Name TermService -Force

# 4. Просмотр лога
Get-Content C:\distr\certificate-setup.log -Tail 50

Проверка на клиенте

powershell
# 1. Проверка доверия к серверу
$ip = "000.000.000.000"
$cert = Get-ChildItem "Cert:\LocalMachine\Root" | Where-Object { $_.Subject -like "*$ip*" }
if ($cert) {
    Write-Host "Certificate for $ip is trusted" -ForegroundColor Green
    Write-Host "  Thumbprint: $($cert.Thumbprint)" -ForegroundColor Gray
    Write-Host "  Expires: $($cert.NotAfter)" -ForegroundColor Gray
} else {
    Write-Host "Certificate for $ip is NOT trusted" -ForegroundColor Red
}

# 2. Проверка сертификата подписи
$signCert = Get-ChildItem "Cert:\LocalMachine\TrustedPublisher" | Where-Object { $_.Subject -like "*RDP-Sign-$ip*" }
if ($signCert) {
    Write-Host "Signing certificate for $ip is trusted" -ForegroundColor Green
} else {
    Write-Host "Signing certificate for $ip is NOT trusted" -ForegroundColor Red
}

# 3. Проверка политики TrustedPublisher
$regPath = "HKLM:\SOFTWARE\Policies\Microsoft\Windows NT\Terminal Services"
$thumbprints = (Get-ItemProperty -Path $regPath -Name "TrustedCertThumbprints" -ErrorAction SilentlyContinue).TrustedCertThumbprints
if ($thumbprints) {
    Write-Host "Trusted thumbprints:" -ForegroundColor Cyan
    $thumbprints | ForEach-Object { Write-Host "  $_" -ForegroundColor Gray }
}

Краткая памятка

Для сервера (один раз):

powershell
cd C:\distr
.\Create-And-Bind-RdpCert.ps1 -IpAddress 000.000.000.000 -Force

Для клиента (один раз для каждого сервера):

powershell
# Копируем CER файлы с сервера в C:\distr\certs
cd C:\distr
.\Client-Setup.ps1 -InstallAll

Проверка (сервер):

powershell
$ts = Get-WmiObject -Namespace "root\cimv2\TerminalServices" -Class "Win32_TSGeneralSetting" -Filter "TerminalName='RDP-tcp'"
Write-Host "RDP bound to: $($ts.SSLCertificateSHA1Hash)" -ForegroundColor Green

Проверка (клиент):

powershell
Get-ChildItem "Cert:\LocalMachine\Root" | Where-Object { $_.Subject -like "*RDP*" }

Файлы скриптов

Create-And-Bind-RdpCert.ps1

Серверный скрипт (все в одном). Создает сертификаты, подписывает RDP файлы, привязывает к RDP.

Client-Setup.ps1

Клиентский скрипт. Устанавливает CER файлы в доверенные хранилища.

 

    Вариант №2 - возврат к старому окошку:

    Вариант временный и сколько проживет неизвестно

    На компьютере клиента:

    Открываем редактор реестра. Меняем или создаем значение параметра RedirectionWarningDialogVersion на 1 в разделе:
    HKLM\Software\Policies\Microsoft\Windows NT\Terminal Services\Client

    При создании значения, если оно отсутствует, надо использовать "Параметр DWORD (32 бита)".

    Файл (rdp.reg), который создает необходимую запись, приложен к этой инструкции.


    Система JUPITER                                 www.jupiter.systems                                 (с) 2024г.