Контекст сертификата из системного хранилища всегда имеет недопустимый указатель 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();
        }        
    }

person Sid Brown    schedule 21.09.2012    source источник
comment
Я думал, что это просто базовая настройка/использование CryptoApi, но вы правы. Всегда добавляйте код!   -  person Sid Brown    schedule 24.09.2012
comment
Кроме того, это в основном то, что я пытаюсь сделать в долгосрочной перспективе. stackoverflow .com/questions/9507184/   -  person Sid Brown    schedule 24.09.2012


Ответы (1)


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

person Sid Brown    schedule 25.09.2012