Тема: Работа с библиотекой cpki1.dll :: VCERT_FindCert
Здравствуйте!
Пишу программу с использованием SDK для упрощенного интерфейса cpki1, и возникла необходимость определения параметров собственного сертификата. А именно, интересуют поля "альтернативного" имени владельца. Использую следующий код (выдержки) :
error_status_t error_code = VCERT_OK;
context_t hCtx = NULL;
find_param_t FindParam = {0};
find_result_t FindResult = {0};
// ...
error_code = CryptoFunctions.VCERT_Initialize((string_t)"My", FLAG_INIT_NOCRLUPDATE | FLAG_INIT_NOLDAP, &hCtx);
memset(&FindParam, 0, sizeof(find_param_t));
FindParam.flag = FLAG_FIND_MY;
FindParam.info = FIELD_SUBJECTALTNAME;
error_code = CryptoFunctions.VCERT_FindCert(hCtx, &FindParam, &FindResult);
if (error_code != VCERT_OK)
{
errorMsg(NULL, "Ошибка! %s (%08X)", CryptoFunctions.VCERT_GetErrorText(error_code, szError, sizeof(szError)), error_code);
return false;
}
if ((FindResult.certs[0].subjectAltName.surname == NULL) ||
(FindResult.certs[0].subjectAltName.businessCategory == NULL) ||
(FindResult.certs[0].subjectAltName.registredAddress == NULL) ||
(FindResult.certs[0].subjectAltName.telephoneNumber == NULL) ||
(FindResult.certs[0].subjectAltName.DNS == NULL))
{
errorMsg(NULL, "%s", "Ошибка получения параметров личного сертификата");
return false;
}
// ...
Несмотря на то, что find_result_t::num я получаю 1 (намек на то, что 1 сертификат все-таки найден, и он, по идее, должен быть личным), в find_result_t::certs[0], (по моему впечатлению) находится "мусор". Например, в поле fields находится некоторое число, у меня на домашней машине это 147680, на рабочей - другое число, заполнены 2 поля - notBefore, notAfter (возможно, это тоже "мусор"), во всех остальных полях NULL.
Самое интересное, что иногда (приблизительно в 1 случае из 5) я все же получаю правильный результат, т.е., иногда работает, но чаще нет. При этом find_result_t::num = 1 всегда, вне зависимости, удалось получить поля или нет.
Использую CCERT PKI сборки 3.1.160.0 и Крипто Про 2.0 сборки 2083.
Подскажите, пожалуйста, что можно сделать в данной ситуации?
С уважением,
Дмитрий