来自系统存储的证书上下文始终具有无效的pbCertEncoded指针

时间:2012-09-21 21:39:13

标签: c++ windows ssl-certificate cryptoapi

我正在尝试在CryptoAPI中使用CertEnumCertificatesInStore()来遍历所有根证书并将它们编码为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 个答案:

答案 0 :(得分:0)

在64位编译时,编码缓冲区不会被填充。用32位编译似乎可以解决这个问题。