Ключевое слово в защите информации
КЛЮЧЕВОЕ СЛОВО
в защите информации
Получить ГОСТ TLS-сертификат для домена (SSL-сертификат)
Добро пожаловать, Гость! Чтобы использовать все возможности Вход или Регистрация.

Уведомление

Icon
Error

Опции
К последнему сообщению К первому непрочитанному
Offline CryptoProStudy  
#1 Оставлено : 2 ноября 2017 г. 23:42:36(UTC)
CryptoProStudy

Статус: Новичок

Группы: Участники
Зарегистрирован: 02.11.2017(UTC)
Сообщений: 2

Сказал(а) «Спасибо»: 1 раз
Привет!

Столкнулся с проблемой при работе с Крипто-Про 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.

Стэк данного потока следующий:

callstack

Открытые ключи реестра:

registry

Я пробовал устанавливать Крипто-Про на другой сервер - картина абсолютно та же.
Я пробовал ждать несколько суток - поток как работал так и продолжает жрать CPU.
Можно поступить варварски и грохнуть поток и дескрипторы ключей, при этом моему приложению на это наплевать и оно продолжает работать,
как ни в чем не бывало. Более того, сразу после уничтожения я могу спокойно пересоздать контекст крипто-провайдера, НО никаких новых потоков или открытых ключей
в моем приложении на постоянной основе уже не создается - все отработает также штатно, все процедуры и манипуляции с контейнером выполняются успешно!
То есть все начнет работать, как я и предполагаю должно работать. Ровно до тех пор, пока сам процесс не будет перезапущен.
После чего картина повторится: будет висеть дергающий CPU поток и открытые дескрипторы ключей, как только я первый раз обращусь к CryptAcquireContext.

Так и должно быть что Крипто-Про не подчищает за собой после закрытия контекста?
Если я делаю что-то не так, намекните, что почитать или как сделать правильно, чтобы избавиться от постоянно работающего потока.

Заранее спасибо!

Отредактировано пользователем 2 ноября 2017 г. 23:43:35(UTC)  | Причина: опечатка в заголовке

Offline Максим Коллегин  
#2 Оставлено : 3 ноября 2017 г. 16:29:10(UTC)
Максим Коллегин

Статус: Сотрудник

Группы: Администраторы
Зарегистрирован: 12.12.2007(UTC)
Сообщений: 6,374
Мужчина
Откуда: КРИПТО-ПРО

Сказал «Спасибо»: 32 раз
Поблагодарили: 704 раз в 613 постах
Это поток самотестирования математических операций криптопровайдера - требование сертификации ФСБ. По-умолчанию, он запускается раз в 10 минут. Можно отодвинуть до 900 секунд - в \Parameters\TesterPeriod
Если за два периода тестирования поток не отработает - будет ошибка при криптографической операции.
Для завершения этого потока можно использовать открытие провайдера с фиктивным именем $reboot$ и флаг CRYPT_REBOOT, но в продашене так делать я бы не рекомендовал.
Знания в базе знаний, поддержка в техподдержке
thanks 1 пользователь поблагодарил Максим Коллегин за этот пост.
CryptoProStudy оставлено 03.11.2017(UTC)
Offline CryptoProStudy  
#3 Оставлено : 3 ноября 2017 г. 23:13:24(UTC)
CryptoProStudy

Статус: Новичок

Группы: Участники
Зарегистрирован: 02.11.2017(UTC)
Сообщений: 2

Сказал(а) «Спасибо»: 1 раз
Благодарю. Действительно ваш совет помог завершить этот поток.

Если бы поток выполнял проверку 1 раз в 10 минут (ну скажем в течение даже 20 секунд), то я б наверное и внимания не обратил,
однако ж он работает постоянно. Да его влияние не слишком уж сильно сказывается на системе в целом, но в моем случае,
когда пишется высоконагруженная служба, которая и без этого потока заполнена своими задачами по самое не балуйся приходится
следить за всеми сторонними потоками, открытыми дескрипторами и прочими ресурсами, чтобы побочные задачи без особой необходимости
не отбирали процессорное у тех, ради кого все это и затевалось. Ну и сам не упустил что-то в своем коде, начав разливать ресурсы.

Кстати, я заметил аналогичные потоки и в других системных процессах, таких как lsass.exe, certsvr.exe, svchost.exe (Cryptographic Services).
Наверняка есть и другие процессы, которые также молотят без остановки, так что об 1 раз в 10 минут речи пока не идет.
Если все же есть какая-то неправильность в таком длительном диагностировании и это можно как-то исправить, то я бы с удовольствием сделал это.
Если же это поведения by design, то тогда поэкспериментирую с отключением "лишнего" потока, посмотрю насколько критичными окажутся последствия.

Еще раз спасибо за ответ.
RSS Лента  Atom Лента
Пользователи, просматривающие эту тему
Быстрый переход  
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.