Гайд: Исправление ошибки 0x8009200b в rdpsign.exe: доступ к приватному ключу сертификата

Решение ошибки 0x8009200b при подписи .rdp утилитой rdpsign.exe. Экспортируйте сертификат с приватным ключом в хранилище текущего пользователя (CurrentUser\My).

2026.04.30                  


Гайд: Исправление ошибки 0x8009200b в rdpsign.exe: доступ к приватному ключу сертификатаГайд: Исправление ошибки 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, сделайте следующее:

  1. Откройте mmc → Файл → Добавить или удалить оснастку → Сертификаты → добавьте для Текущего пользователя и для Учетной записи компьютера.
  2. Найдите сертификат по thumbprint в Локальный компьютер → Личные → Сертификаты.
3. ПКМ → Все задачи → Экспорт.
  • Выберите Да, экспортировать личный ключ
  • Формат: PFX/PKCS #12
  • Отметьте Включить все сертификаты в цепочке и Экспортировать все расширенные свойства
  • Задайте пароль (запомните его)
    1. Перейдите в Текущий пользователь → Личные → Сертификаты → ПКМ → Все задачи → Импорт → укажите экспортированный .pfx и пароль.
    2. Проверьте снова через PowerShell, что HasPrivateKey: True.

Важно:

Если пункт Да, экспортировать личный ключ недоступен, значит ключ был создан с флагом "неэкспортируемый" (например, на аппаратном токене или HSM). В этом случае rdpsign.exe не сможет его использовать. Потребуется выпуск нового сертификата или использование другого инструмента подписи.


Шаг 3. Проверка назначения сертификата (Key Usage / EKU)

Для подписи .rdp сертификат должен поддерживать Цифровую подпись. Убедитесь, что в свойствах сертификата на вкладке Состав или Использование ключа есть:

  • Цифровая подпись (Digital Signature)
  • Желательно: Аутентификация клиента или Подпись кода

Если сертификат самоподписанный, это допустимо, но на клиентских машинах его нужно будет добавить в Доверенные корневые центры сертификации, иначе RDP-клиент будет выдавать предупреждение о неподписанном/непроверенном файле.


Шаг 4. Правильный запуск rdpsign.exe

  1. Убедитесь, что thumbprint без пробелов (ваш выглядит корректно: ac82610cacbac3e3739eb29c3fa4d9f331eb2099).
  2. Запускайте командную строку от имени того пользователя, в чьём хранилище лежит сертификат.
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 C3A1B2C3
Запуск от Administrator / SYSTEM Запускайте от имени ashurshov, так как ключи привязаны к профилю
Ключ на токене/смарт-карте rdpsign не работает с CSP-токенами. Используйте сертификат в реестре.

Важно после подписи

  1. Файл 1c.rdp будет изменён. В конец добавится блок signature:s:SHA256:...
  2. Если на клиентских ПК включена политика Требовать подпись RDP-файлов, сертификат должен быть доверенным на клиенте (добавлен в Доверенные корневые или Издатель).
  3. Для массовой раздачи используйте один корпоративный сертификат, а не самоподписанные на каждом хосте.

Если после переноса в CurrentUser\My ошибка сохраняется, выполните:

certutil -user -store my ac82610cacbac3e3739eb29c3fa4d9f331eb2099