КриптоПро CSP: «Невозможно открыть ключевой контейнер» — права, контейнеры и профили (2025)
Подпись не идёт, а КриптоПро пишет «Невозможно открыть ключевой контейнер» или приложение «не видит» ключ. Такое бывает после переустановки Windows, смены доменного профиля, переноса контейнеров или банальной нехватки прав. Пройдёмся по порядку: проверим контейнеры, права и сопоставление с сертификатом — без плясок с бубном.
Коротко: что проверить сразу
- Токен вставлен, ПИН вводится без ошибок, в «Диспетчере устройств» нет жёлтых значков по смарт‑картам/USB.
- Ключевой контейнер находится там же, где его ищет программа: пользовательский (USER) или компьютерный (MACHINE).
- У текущего пользователя есть права на контейнер, а профиль не «битый» и не заменён другим SID.
- Сертификат связан с контейнером (в certmgr возле сертификата написано «У Вас есть закрытый ключ, соответствующий этому сертификату»).
Как это устроено в Windows и КриптоПро
Ключевой контейнер хранит закрытый ключ. Он может жить на токене (Рутокен/еToken), в реестре профиля пользователя (USER) или в хранилище компьютера (MACHINE). Доступ завязан на права и SID профиля. Если профиль поменялся, переносили контейнер «вручную» или токен заблокирован — приложение не сможет открыть ключ и выдаст ошибку.
- USER — контейнер доступен только текущему пользователю. Удобно для рабочих мест.
- MACHINE — контейнер доступен службам/всем пользователям ПК (при наличии прав). Нужен для служб, IIS, планировщика.
- Токен — ключ внутри смарт‑карты/USB. Доступ по ПИН, права «привязаны» к устройству.
Токен и драйверы: сначала убедимся, что носитель живой
Если ключ на Рутокене/еToken — проверьте драйверы и ПИН. Это базис, иначе остальные шаги бессмысленны.
CMD — выполнять по одной:
certutil -scinfo
mode
Первая команда спросит ПИН и покажет считыватели/карты. Если ошибок нет — идём дальше. За драйверами идите на официальные сайты Рутокен и Thales (eToken).
Смотрим контейнеры и права
CMD — выполнять по одной:
certutil -user -store my
certutil -store my
certutil -repairstore -user my *
certutil -user -store my | findstr /i "PrivateKey"
В выводе сертификатов ищите «PrivateKey Link». Если (null) — сертификат не связан с ключом. Команда repairstore пробует «прикрепить» найденный подходящий ключевой контейнер.
PowerShell — выполнять по одной:
Get-ChildItem Cert:\CurrentUser\My | Select-Object Subject, Thumbprint, HasPrivateKey
Get-ChildItem Cert:\LocalMachine\My | Select-Object Subject, Thumbprint, HasPrivateKey
Связываем сертификат с контейнером (если ключ есть, а «замка» нет)
CMD — выполнять по одной:
rem Посмотреть отпечаток сертификата в личном хранилище пользователя
certutil -user -store my
rem Восстановить связь «сертификат ↔ ключ» по отпечатку (подставьте ваш)
certutil -user -repairstore my <THUMBPRINT>
rem Для системного хранилища (если ключ должен быть MACHINE)
certutil -repairstore my <THUMBPRINT>
После успешной привязки возле сертификата в оснастке появится значок ключа и подпись «У Вас есть закрытый ключ…».
Профили и права: когда всё ломается из-за SID
Частый сценарий: поменяли доменную учётку/профиль, SID другой — доступ к контейнеру пропал. Решений два:
- Перенести контейнер в MACHINE (доступен службам/всем) и раздать права нужным пользователям/службам.
- Пересоздать контейнер под новым профилем и привязать существующий сертификат.
Перенос удобнее делать через GUI КриптоПро: Пуск → КриптоПро CSP → Сервис → Ключи → Перенос. Если контейнер на токене — проще ничего не переносить, а проверить ПИН и политику доступа.
Если контейнера не видно вообще
- Проверьте, что компоненты КриптоПро установлены и лицензия активна.
- Откройте certmgr.msc (для пользователя) и mmc → Добавить оснастку → Сертификаты → Учетная запись компьютера (для MACHINE) — убедитесь, что сертификат в нужном хранилище.
- Если есть PFX с ключом — импортируйте его корректно.
CMD — выполнять по одной:
rem Импорт PFX в личное хранилище пользователя (запросит пароль)
certutil -user -f -importpfx my "D:\keys\mycert.pfx"
rem Импорт в хранилище компьютера
certutil -f -importpfx my "D:\keys\servercert.pfx"
Если импортируете .cer без ключа — «замка» не будет, это нормально. Привязываем через repairstore или устанавливаем PFX.
Диагностика: журнал и проверка подписи
PowerShell (Администратор) — выполнять по одной:
Get-WinEvent -LogName Application -MaxEvents 200 | Where-Object {$_.ProviderName -like "*Crypto*" -or $_.Message -match "ключ|контейнер|CSP"} | Select TimeCreated, ProviderName, Id, Message
Get-WinEvent -LogName System -MaxEvents 200 | Where-Object {$_.Message -match "SmartCard|смарт-карт|token"}
Для теста подписи используйте «КриптоПро CSP → Сервис → Проверка подписи» и любой файл. Если ключ открывается — проблема была в сопоставлении или правах.
FAQ
Нужно ли переносить контейнер в MACHINE для IIS/службы?
Да, либо дать службе доступ к USER-контейнеру под её аккаунтом. Проще — MACHINE и явная раздача прав.
Можно ли «скопировать» контейнер просто переносом папки?
Нет. Используйте импорт PFX или штатный перенос в КриптоПро. Иначе потеряете связь с сертификатом и права.
После привязки подпись в браузере всё равно не идёт.
Проверьте CryptoPro CAdES Browser Plug‑in/расширение и доверенные корневые УЦ. Также убедитесь, что сайт принимает нужные ГОСТ‑алгоритмы.