Привет!
Столкнулся с проблемой при работе с Крипто-Про CSP на уровне CryptoAPI.
Пробовал несколько разных версии 4-x, сейчас поставил 5.0.10874KC1 - результат тот же самый.
Код пишется и компилируется в Visual Studio 2015 Update 3/Visual Studio 2017 15.4.1, язык C/C++
Код тестируется на Windows Server 2012 R2 Standard En (все обновления установлены)
В реестр импортирован контейнер ключа. Я пытаюсь с ним работать через CryptoAPI.
У меня все получается замечательно, но есть одна странность, которую я не могу никак понять.
Для подключения к контейнеру создаю контекст крипто-провайдера:
Код:
HCRYPTPROV hcpResult = NULL;
if (::CryptAcquireContext(&hcpResult, L"\\\\.\\REGISTRY\\MY_KEY", NULL, PROV_GOST_2012_256, CRYPTO_SILENT))
return 0UL;
// здесь могу выполнять что мне нужно с контейнером, например, загрузить в него сертификат
// или получить какие-то параметры, а могу вообще ничего не делать, просто тупо тут же вызвать
// CryptReleaseContext - это не имеет никакого значения
::CryptReleaseContext(hcpResult, 0UL); // <- возвращает TRUE
Как только я вызываю
CryptAcquireContext в моем приложении создается отдельный поток, а в него загружается Крипто-Про (cpcspi.dll),
также открывается несколько дескрипторов узлов реестра, где расположен контейнер ключа. Все ОК.
Я могу поработать с контейнером, а могу и просто сразу же закрыть полученный контекст вызовом
CryptReleaseContext.
Сам контекст между вызывами
Acquire и
Release никому не передавался, все выполняется в одном и том же потоке, но закрытие контекста
НЕ завершает работу потока Крипто-Про в моем приложении, ровно также, как не освобождаются дескрипторы открытых узлов реестра.
Это полбеды, потому что повторное открытие контекста не прибавляет очередных копий ни потока, ни дескрипторов,
НО сам поток безостановочно все время чем-то занят (?
CPVerifySignature ?) и дергает CPU.
Стэк данного потока следующий:
Открытые ключи реестра:
Я пробовал устанавливать Крипто-Про на другой сервер - картина абсолютно та же.
Я пробовал ждать несколько суток - поток как работал так и продолжает жрать CPU.
Можно поступить варварски и грохнуть поток и дескрипторы ключей, при этом моему приложению на это наплевать и оно продолжает работать,
как ни в чем не бывало. Более того, сразу после уничтожения я могу спокойно пересоздать контекст крипто-провайдера, НО никаких новых потоков или открытых ключей
в моем приложении
на постоянной основе уже не создается - все отработает также штатно, все процедуры и манипуляции с контейнером выполняются успешно!
То есть все начнет работать, как я и предполагаю должно работать. Ровно до тех пор, пока сам процесс не будет перезапущен.
После чего картина повторится: будет висеть дергающий CPU поток и открытые дескрипторы ключей, как только я первый раз обращусь к
CryptAcquireContext.
Так и должно быть что Крипто-Про не подчищает за собой после закрытия контекста?
Если я делаю что-то не так, намекните, что почитать или как сделать правильно, чтобы избавиться от постоянно работающего потока.
Заранее спасибо!
Отредактировано пользователем 2 ноября 2017 г. 23:43:35(UTC)
| Причина: опечатка в заголовке