| ||||
| ||||
Есть контекст сертификата. Задача - связать его с закрытым ключом и установить в системе. Подзадача - вызвать стандартное окно(как из панели управления КриптоПро при установке личного сертификата) для выбора контейнера ключей и узнать имя контейнера. Дальше что делать из форума я уже понял - вызвать CertSetCertificateContextProperty(ctx, CERT_KEY_PROV_INFO_PROP_ID...) и поместить в системное хранилище. Так, все же, как вызвать диалог для выбора контейнера? | ||||
Ответы: | ||||
| ||||
CryptGetProvParam(...PP_SELECT_CONTAINER...); | ||||
| ||||
Этот вариант специфичен для КриптоПро. А нет ли способа универсальней? | ||||
| ||||
PP_ENUMCONTAINERS и нарисовать свое окно | ||||
| ||||
Перебрать контейнеры удалось. Теперь как проверить подходят ли ключи в контейнере для данного контекста сертификата? // Запрашиваем максимальную длину контейнера 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; } //!!! Здесь бы понять подходят ключи данного контейнера для сертификата } | ||||
| ||||
http://www.cryptopro.ru/cryptopro/forum/view.asp?q=6161 | ||||
| ||||
Не получается, ошибка при вызове CryptExportPublicKeyInfo. Видимо из-за того что сертификата нет в ключах | ||||