06.08.2007 20:41:24Как запросить у пользователя имя контейнера закрытых ключей? Ответов: 6
Алексей П.
Есть контекст сертификата. Задача - связать его с закрытым ключом и установить в системе. Подзадача - вызвать стандартное окно(как из панели управления КриптоПро при установке личного сертификата) для выбора контейнера ключей и узнать имя контейнера.
Дальше что делать из форума я уже понял - вызвать CertSetCertificateContextProperty(ctx, CERT_KEY_PROV_INFO_PROP_ID...) и поместить в системное хранилище. Так, все же, как вызвать диалог для выбора контейнера?
 
Ответы:
06.08.2007 21:03:12maxdm
CryptGetProvParam(...PP_SELECT_CONTAINER...);
07.08.2007 12:46:56Алексей П.
Этот вариант специфичен для КриптоПро. А нет ли способа универсальней?
07.08.2007 13:09:53maxdm
PP_ENUMCONTAINERS и нарисовать свое окно
07.08.2007 15:07:07Алексей П.
Перебрать контейнеры удалось. Теперь как проверить подходят ли ключи в контейнере для данного контекста сертификата?
// Запрашиваем максимальную длину контейнера
DWORD dwDataLen;
if (!::CryptGetProvParam(prov.Handle(), PP_ENUMCONTAINERS, 0, &dwDataLen,
CRYPT_FIRST))
return HandleError(GetLastError(), ERR_BAD_PROV_PARAM);

// Перебираем контейнеры
byte_buffer container(dwDataLen);
for (DWORD dwErr = 0, dwFlags = CRYPT_FIRST; ; dwFlags &= !CRYPT_FIRST)
{
if (!::CryptGetProvParam(prov.Handle(), PP_ENUMCONTAINERS, container.c_ptr(),
&dwDataLen, dwFlags))
{
dwErr = GetLastError();
if (dwErr != ERROR_NO_MORE_ITEMS)
return HandleError(GetLastError(), ERR_BAD_PROV_PARAM);
::SetLastError(0);
break;
}
//!!! Здесь бы понять подходят ключи данного контейнера для сертификата
}
07.08.2007 15:08:15maxdm
http://www.cryptopro.ru/cryptopro/forum/view.asp?q=6161
07.08.2007 16:16:15Алексей П.
Не получается, ошибка при вызове CryptExportPublicKeyInfo. Видимо из-за того что сертификата нет в ключах