Гайд: Исправление ошибки 0x8009200b в rdpsign.exe: доступ к приватному ключу сертификата
Ошибка 0x8009200b (CRYPT_E_NO_KEY_PROPERTY) означает, что утилита rdpsign.exe не может найти или получить доступ к частному ключу сертификата, чей thumbprint вы указали. Утилита работает только с сертификатами, у которых есть доступный приватный ключ и которые находятся в правильном хранилище.
Ниже подробный гайд по диагностике и устранению проблемы.
Шаг 1. Проверка, в каком хранилище находится сертификат
rdpsign.exeвсегда ищет сертификат в хранилище текущего пользователя:Cert:\CurrentUser\My(Личное → Текущий пользователь). Если сертификат установлен вLocalMachine(Локальный компьютер), утилита не увидит приватный ключ и вернёт0x8009200b.
Как проверить через PowerShell (запустите от имени текущего пользователя):
Get-ChildItem Cert:\CurrentUser\My | Where-Object Thumbprint -eq "ac82610cacbac3e3739eb29c3fa4d9f331eb2099" | Select-Object Subject, HasPrivateKey, NotAfter, Issuer
- Если команда ничего не вернула → сертификат находится не в
CurrentUser\My. - Если вернула строку, но
HasPrivateKey: False→ у сертификата нет приватного ключа или он недоступен.
Шаг 2. Перенос сертификата в правильное хранилище
Если сертификат в LocalMachine или HasPrivateKey = False, сделайте следующее:
- Откройте
mmc→ Файл → Добавить или удалить оснастку → Сертификаты → добавьте для Текущего пользователя и для Учетной записи компьютера. - Найдите сертификат по thumbprint в
Локальный компьютер → Личные → Сертификаты.
3. ПКМ → Все задачи → Экспорт.
- Выберите
Да, экспортировать личный ключ - Формат:
PFX/PKCS #12 - Отметьте
Включить все сертификаты в цепочкеиЭкспортировать все расширенные свойства - Задайте пароль (запомните его)
- Перейдите в
Текущий пользователь → Личные → Сертификаты→ ПКМ → Все задачи → Импорт → укажите экспортированный.pfxи пароль. - Проверьте снова через PowerShell, что
HasPrivateKey: True.
- Перейдите в
Важно:
Если пункт Да, экспортировать личный ключ недоступен, значит ключ был создан с флагом "неэкспортируемый" (например, на аппаратном токене или HSM). В этом случае rdpsign.exe не сможет его использовать. Потребуется выпуск нового сертификата или использование другого инструмента подписи.
Шаг 3. Проверка назначения сертификата (Key Usage / EKU)
Для подписи .rdp сертификат должен поддерживать Цифровую подпись. Убедитесь, что в свойствах сертификата на вкладке Состав или Использование ключа есть:
Цифровая подпись(Digital Signature)- Желательно:
Аутентификация клиентаилиПодпись кода
Если сертификат самоподписанный, это допустимо, но на клиентских машинах его нужно будет добавить в Доверенные корневые центры сертификации, иначе RDP-клиент будет выдавать предупреждение о неподписанном/непроверенном файле.
Шаг 4. Правильный запуск rdpsign.exe
- Убедитесь, что thumbprint без пробелов (ваш выглядит корректно:
ac82610cacbac3e3739eb29c3fa4d9f331eb2099). - Запускайте командную строку от имени того пользователя, в чьём хранилище лежит сертификат.
3. Выполните команду:
rdpsign.exe /sha256 ac82610cacbac3e3739eb29c3fa4d9f331eb2099 "C:\Users\ashurshov\Desktop\1c.rdp"
Если всё успешно, утилита выведет: Файл успешно подписан. без дополнительных кодов ошибок.
Альтернатива: подписание через PowerShell (если rdpsign продолжает капризничать)
Иногда удобнее использовать встроенный криптографический интерфейс:
$Cert = Get-ChildItem Cert:\CurrentUser\My | Where-Object Thumbprint -eq "ac82610cacbac3e3739eb29c3fa4d9f331eb2099"
$RdpPath = "C:\Users\ashurshov\Desktop\1c.rdp"
# Читаем RDP как текст
$Content = Get-Content $RdpPath -Raw
# Подписываем (требует .NET Crypto, работает на Win 10/11/Server 2016+)
Add-Type -AssemblyName System.Security
$SignedContent = [System.Security.Cryptography.Pkcs.SignedCms]::new()
# Примечание: полноценная подпись .rdp через PS сложнее, rdpsign.exe предпочтительнее.
# Данный блок приведён для диагностики доступа к ключу:
try {
$Cert.PrivateKey
Write-Host "Приватный ключ доступен. rdpsign должен работать."
} catch {
Write-Host "Ошибка доступа к ключу: $_"
}
Чек-лист быстрого исправления
| Симптом | Решение |
|---|---|
0x8009200b + сертификат в LocalMachine |
Экспортируйте с ключом → импортируйте в CurrentUser\My |
HasPrivateKey: False |
Сертификат без ключа или ключ заблокирован. Выпустите новый. |
| Thumbprint с пробелами | Уберите все пробелы: A1 B2 C3 → A1B2C3 |
Запуск от Administrator / SYSTEM |
Запускайте от имени ashurshov, так как ключи привязаны к профилю |
| Ключ на токене/смарт-карте | rdpsign не работает с CSP-токенами. Используйте сертификат в реестре. |
Важно после подписи
- Файл
1c.rdpбудет изменён. В конец добавится блокsignature:s:SHA256:... - Если на клиентских ПК включена политика
Требовать подпись RDP-файлов, сертификат должен быть доверенным на клиенте (добавлен вДоверенные корневыеилиИздатель). - Для массовой раздачи используйте один корпоративный сертификат, а не самоподписанные на каждом хосте.
Если после переноса в CurrentUser\My ошибка сохраняется, выполните:
certutil -user -store my ac82610cacbac3e3739eb29c3fa4d9f331eb2099