КриптоПро CSP: сертификат «без приватного ключа» — привязываем к контейнеру и запускаем подпись (2025)

Классика: сертификат в личном хранилище есть, а «замка» рядом нет. Приложение пишет «Нет подходящего сертификата» или «Нет закрытого ключа». Покажу, как правильно связать сертификат с ключевым контейнером и что ещё проверить по пути.

Коротко: путь к «замочку»

  • Поймите, где живёт закрытый ключ: токен, USER или MACHINE.
  • Найдите сертификат и проверите, есть ли у него приватный ключ.
  • Если ключ есть, а связи нет — восстановите её командой certutil -repairstore.
  • Если ключа нет — импортируйте PFX или установите сертификат с токена правильно.
  • Проверьте EKU (назначения) и цепочку УЦ — без них подпись может «не приниматься».
Нужен быстрый результат? За 1 сеанс свяжу сертификат с ключом, поправлю хранилища и проверю подпись в ваших системах.

Находим сертификат и проверяем признак HasPrivateKey

PowerShell — выполнять по одной:

Get-ChildItem Cert:\CurrentUser\My | Select-Object Subject, Thumbprint, HasPrivateKey, EnhancedKeyUsageList
Get-ChildItem Cert:\LocalMachine\My | Select-Object Subject, Thumbprint, HasPrivateKey, EnhancedKeyUsageList

CMD — выполнять по одной:

certutil -user -store my
certutil -store my

Если HasPrivateKey = False или в выводе PrivateKey Link: (null) — у сертификата нет связанного ключа.

Восстанавливаем связь «сертификат ↔ ключевой контейнер»

Работает, когда ключ где‑то есть (в контейнере/на токене), но «привязка» слетела.

CMD — выполнять по одной:

rem Скопируйте отпечаток сертификата из списка
certutil -user -store my

rem Восстанавливаем связь в хранилище пользователя
certutil -user -repairstore my <THUMBPRINT>

rem Восстанавливаем связь в хранилище компьютера (если требуется)
certutil -repairstore my <THUMBPRINT>

Проверьте, что после команды значок ключа появился.

Импортируем PFX (если ключа нет)

Чтобы появился приватный ключ, нужен контейнер с ключом. Проще всего — импорт PFX (связка «ключ+сертификат»).

CMD — выполнять по одной:

rem Импорт PFX в личное хранилище пользователя (попросит пароль PFX)
certutil -user -f -importpfx my "D:\keys\mycert.pfx"

rem Импорт PFX в хранилище компьютера (для служб/IIS)
certutil -f -importpfx my "D:\keys\server.pfx"

Если ключ должен лежать на токене — используйте утилиту производителя токена или мастер в «КриптоПро CSP → Сервис → Ключи».

EKU и цепочка УЦ: почему «есть ключ», но всё равно не подписывает

  • Проверьте Enhanced Key Usage. Для подписи документов нужен «Secure Email/Подпись» или профиль от вашего УЦ.
  • Установите корневой и промежуточные сертификаты УЦ в «Доверенные корневые» и «Промежуточные центры».
  • Обновите списки отзыва (CRL) или включите доступ к OCSP.

CMD — выполнять по одной:

certutil -user -store CA
certutil -store Root

Тест: проверяем подпись до боевой системы

Откройте «КриптоПро CSP → Сервис → Проверка подписи» и подпишите/проверьте любой файл. Так вы исключите проблемы сайта/программы.

Если в «Сервисе» всё ок, а сайт ругается — дело в браузерном плагине/расширении или в несовпадении алгоритмов/требований сайта.

FAQ

После импорта PFX ключ оказался в USER, а нужен для IIS.

Импортируйте заново в LocalMachine (без ключа «-user») и дайте права IIS AppPool’у на ключ.

Можно ли «вытащить» закрытый ключ из токена в PFX?

Чаще нельзя: политика токена и УЦ запрещает экспорт приватного ключа. Используйте контейнер на токене.

Сертификат виден, но сайт пишет «нет подходящих сертификатов».

Проверьте EKU и требования сайта к алгоритму ГОСТ. Возможно, нужен другой профиль сертификата.

Читайте также: