Проблема с RDP-подключением из политики сертификатов.
Общее описание
Зачем это нужно?
Microsoft изменила политику безопасности RDP. Теперь при каждом подключении к непроверенному серверу появляется предупреждение, в котором отключены чекбоксы для запоминания выбора. Это делает невозможным "запомнить" сервер.
Решение
Мы создаем собственные сертификаты и устанавливаем доверие к ним:
-
На сервере: создается сертификат для шифрования 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: Создайте папку и скопируйте скрипт
# Создаем папки 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: Запустите скрипт
cd C:\distr .\Create-And-Bind-RdpCert.ps1 -IpAddress 000.000.000.000 -Force
Где:
-
-IpAddress- ваш публичный IP-адрес сервера, заменяем 000.000.000.000 на правильный -
-Force- пересоздать сертификаты (если уже есть)
Шаг 3: Что произойдет?
Скрипт автоматически выполнит:
-
Очистку старых сертификатов
-
Создание серверного сертификата с уникальным именем
-
Создание сертификата подписи с уникальным именем
-
Экспорт PFX и CER файлов
-
Проверку текущей привязки RDP
-
Подпись всех RDP файлов в папке C:\distr\RDP
-
Привязку сертификата к RDP-слушателю
-
Перезапуск службы TermService (опционально)
-
Сохранение лога в 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: Проверьте результат
Скрипт автоматически вывел информацию о привязке и создал файл лога. Вы можете:
Просмотреть лог выполнения:
Get-Content C:\distr\certificate-setup.log
Настройка клиента
Шаг 1: Создайте папку и скопируйте файлы
# Создаем папки 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: Запустите клиентский скрипт
Вариант А: Установка для конкретного сервера
cd C:\distr .\Client-Setup.ps1 -ServerIp 000.000.000.000
Вариант Б: Установка всех найденных сертификатов
.\Client-Setup.ps1 -InstallAll
Вариант В: Интерактивный режим (выбор из списка)
.\Client-Setup.ps1
Вариант Г: Просмотр доступных сертификатов
.\Client-Setup.ps1 -ListCertificates
Шаг 3: Что произойдет?
Скрипт автоматически:
-
Найдет все CER-файлы в папке C:\distr\certs
-
Установит серверные сертификаты в
Cert:\LocalMachine\Root -
Установит сертификаты подписи в
Cert:\LocalMachine\RootиCert:\LocalMachine\TrustedPublisher -
Настроит политику
TrustedCertThumbprintsв реестре
Тестовое подключение
-
Закройте все открытые сессии mstsc/RemoteApp
-
Откройте подписанный RDP-файл из папки C:\distr\RDP
-
При подключении не должно быть предупреждения о сертификате
-
Если предупреждение появилось, нажмите "Подключиться", чекбоксы сохраняться.
Диагностика и проверка
Проверка на сервере
# 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
Проверка на клиенте
# 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 } }
Краткая памятка
Для сервера (один раз):
cd C:\distr .\Create-And-Bind-RdpCert.ps1 -IpAddress 000.000.000.000 -Force
Для клиента (один раз для каждого сервера):
# Копируем CER файлы с сервера в C:\distr\certs cd C:\distr .\Client-Setup.ps1 -InstallAll
Проверка (сервер):
$ts = Get-WmiObject -Namespace "root\cimv2\TerminalServices" -Class "Win32_TSGeneralSetting" -Filter "TerminalName='RDP-tcp'" Write-Host "RDP bound to: $($ts.SSLCertificateSHA1Hash)" -ForegroundColor Green
Проверка (клиент):
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г.


Нет комментариев