| ||||
| ||||
Можно ли программно удалить контейнер без окна запроса ПИН кода? CRYPT_SILENT для CryptAcquireContext не проходит. | ||||
Ответы: | ||||
| ||||
Аналогично, возник такой же вопрос. Для других операций существует возможность использования CryptSetProvParam() с флагом PP_SIGNATURE_PIN. А как действовать в случае удаления контейнера? | ||||
| ||||
Можно (для CSP 3.0 и выше). Последовательность вызовов: CryptAcquireContext с полным (FQCN) именем контейнера и флажком CRYPT_SILENT, но без добавления CRYPT_DELETEKEYSET CryptSetProvParam с параметром PP_KEYEXCHANGE_PIN (PP_SIGNATURE_PIN) - задание пина CryptSetProvParam с параметром PP_DELETE_KEYSET CryptReleaseContext | ||||
| ||||
Спасибо. Ещё вопрос. Как программно ввести пин-код в случае использования COM библиотеки: ICEnroll4 * pEnroll = NULL; ... hr = pEnroll->put_ProviderName(bstrConvert); hr = pEnroll->put_ProviderType(ProvType); ... ... hr = pEnroll->createPKCS10(bstrConvert, NULL, &bstrReq); При вызове createPKCS10 появляется окошко с просьбой ввести пин-код. Как этого можно избежать? | ||||
| ||||
Если использовать этот метод, то только так: делать другими средствами ключевой контейнер (далее три варианта - запомнить пин-код или загрузить контейнер в кеш службы хранения ключей или держать контейнер открытым в процессе от того же аккаунта, что и тот, в котором делается запрос на сертификат), а потом в CreatePKCS10 указывать существующий контейнер. | ||||
| ||||
спасибо, помогло: предварительно открываю при помощи CryptAcquireContext, задаю пин-код, контекст криптопровайдера не освобождаю, генерирую PKCS10, и потом закрываю контекст... | ||||
| ||||
ok. Как быть, если создаем новый контейнер (запрос) createPKCS10(...), но диалоговое окно с PIN видеть не хотелось бы? | ||||
| ||||
Попробуйте так: CryptAcquireContext(CRYPT_NEWKEYSET); CryptSetProvParam(PP_KEYEXCHANGE_PIN); ... createPKCS10(...); ... CryptReleaseContext(...); | ||||
| ||||
Нет, ну так получатся два независимых контейнера. Если изменить oEnroll.ContainerName на имя контейнера полученного CryptAcquireContext(...), то возникнет ошибка: "Объект уже существует" | ||||
| ||||
В таком случае, можно предварительно в другом месте сгенерировать ключевую пару через CryptGenKey(); А в этой функции/методе нужно добавить: hr = pEnroll->put_UseExistingKeySet( TRUE ); и в качестве ContainerName указать имя существующего контейнера, полученного CryptAcquireContext | ||||
| ||||
Свойство CEnroll::UseExistingKeySet установите в TRUE, оно FALSE по умолчанию | ||||
| ||||
ok. Спасибо | ||||