Контекст сертификата из системного хранилища всегда имеет недопустимый указатель pbCertEncoded

Я пытаюсь использовать CertEnumCertificatesInStore () в CryptoAPI для перебора всех корневых сертификатов и кодирования их в файлы PEM для использования с OpenSSL. Я нашел несколько примеров этого, так что это кажется возможным, однако, PCCERT_CONTEXT, который я получаю для каждого сертификата, имеет недопустимый указатель для pbCertEncoded, а cbCertEncoded (размер буфера) всегда равен 0, но я не думаю, что это должно быть В качестве примера в качестве примера используется закодированный буфер для преобразования сертификата в другие форматы. Кто-нибудь еще сталкивался с этой проблемой получения пустого буфера или может видеть шаг, который я пропускаю?

Я подтвердил, что на самом деле получаю сертификаты с помощью функции CryptUIDlgViewContext (). Я чувствую, что упускаю что-то очень простое. Основной код ниже:

HCERTSTORE hStore = CertOpenSystemStore(NULL, L"ROOT");

for ( PCCERT_CONTEXT pCertContext = CertEnumCertificatesInStore(hStore, NULL); pCertContext != NULL; pCertContext = CertEnumCertificatesInStore(hStore, pCertContext) )
{

// This shows the certificates fine
CryptUIDlgViewContext(CERT_STORE_CERTIFICATE_CONTEXT,  pCertContext, NULL, NULL, 0, NULL)

// but
// pCertContext->pbCertEncoded is a Bad Ptr and
// pCertContext->cbCertEncoded is always 0

// If i try
TCHAR *OutString = NULL;
DWORD Size = 0;
DWORD lastError;
BOOL success = CryptBinaryToString(pCertContext->pbCertEncoded, pCertContext->cbCertEncoded, CRYPT_STRING_BASE64,OutString, &Size);

if( !success )
{
// I get a invalid parameter error here.
lastError = GetLastError();
}
}

1

Решение

Закодированный буфер не заполняется при компиляции в 64-битной версии. Компиляция в 32 бит, похоже, решает эту проблему.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]