14.03.2007 18:48:22Можно ли программно удалить контейнер без окна запроса ПИН кода?  Ответов: 11
Алексей
Можно ли программно удалить контейнер без окна запроса ПИН кода? CRYPT_SILENT для CryptAcquireContext не проходит.
 
Ответы:
02.08.2007 19:25:46jar
Аналогично, возник такой же вопрос.

Для других операций существует возможность использования CryptSetProvParam() с флагом PP_SIGNATURE_PIN.

А как действовать в случае удаления контейнера?
03.08.2007 12:08:38Василий
Можно (для CSP 3.0 и выше).

Последовательность вызовов:

CryptAcquireContext с полным (FQCN) именем контейнера и флажком CRYPT_SILENT, но без добавления CRYPT_DELETEKEYSET

CryptSetProvParam с параметром PP_KEYEXCHANGE_PIN (PP_SIGNATURE_PIN) - задание пина

CryptSetProvParam с параметром PP_DELETE_KEYSET

CryptReleaseContext
06.08.2007 10:09:52jar
Спасибо.

Ещё вопрос.
Как программно ввести пин-код в случае использования COM библиотеки:

ICEnroll4 * pEnroll = NULL;
...
hr = pEnroll->put_ProviderName(bstrConvert);
hr = pEnroll->put_ProviderType(ProvType);
...
...
hr = pEnroll->createPKCS10(bstrConvert, NULL, &bstrReq);

При вызове createPKCS10 появляется окошко с просьбой ввести пин-код. Как этого можно избежать?
06.08.2007 11:06:49Василий
Если использовать этот метод, то только так: делать другими средствами ключевой контейнер (далее три варианта - запомнить пин-код или загрузить контейнер в кеш службы хранения ключей или держать контейнер открытым в процессе от того же аккаунта, что и тот, в котором делается запрос на сертификат), а потом в CreatePKCS10 указывать существующий контейнер.
06.08.2007 13:34:02jar
спасибо, помогло:
предварительно открываю при помощи CryptAcquireContext, задаю пин-код, контекст криптопровайдера не освобождаю, генерирую PKCS10, и потом закрываю контекст...
06.08.2007 14:06:19Александр
ok. Как быть, если создаем новый контейнер (запрос)
createPKCS10(...),
но диалоговое окно с PIN видеть не хотелось бы?
06.08.2007 14:31:11jar
Попробуйте так:

CryptAcquireContext(CRYPT_NEWKEYSET);
CryptSetProvParam(PP_KEYEXCHANGE_PIN);
...
createPKCS10(...);
...
CryptReleaseContext(...);
06.08.2007 14:57:34Александр
Нет, ну так получатся два независимых контейнера.
Если изменить oEnroll.ContainerName на имя контейнера полученного CryptAcquireContext(...), то возникнет ошибка:
"Объект уже существует"
06.08.2007 15:24:14jar
В таком случае, можно предварительно в другом месте сгенерировать ключевую пару через CryptGenKey();

А в этой функции/методе нужно добавить:
hr = pEnroll->put_UseExistingKeySet( TRUE );
и в качестве ContainerName указать имя существующего контейнера, полученного CryptAcquireContext
06.08.2007 15:24:27Kirill Sobolev
Свойство CEnroll::UseExistingKeySet установите в TRUE, оно FALSE по умолчанию
06.08.2007 16:00:19Александр
ok. Спасибо