КриптоПро CSP: сертификат «без приватного ключа» — привязываем к контейнеру и запускаем подпись (2025)
Классика: сертификат в личном хранилище есть, а «замка» рядом нет. Приложение пишет «Нет подходящего сертификата» или «Нет закрытого ключа». Покажу, как правильно связать сертификат с ключевым контейнером и что ещё проверить по пути.
Коротко: путь к «замочку»
- Поймите, где живёт закрытый ключ: токен, USER или MACHINE.
- Найдите сертификат и проверите, есть ли у него приватный ключ.
- Если ключ есть, а связи нет — восстановите её командой
certutil -repairstore. - Если ключа нет — импортируйте PFX или установите сертификат с токена правильно.
- Проверьте EKU (назначения) и цепочку УЦ — без них подпись может «не приниматься».
Находим сертификат и проверяем признак 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 и требования сайта к алгоритму ГОСТ. Возможно, нужен другой профиль сертификата.