系统存储中的证书上下文总是有一个无效的pbCertEncoded指针

Certificate context from system store always has an invalid pbCertEncoded pointer

本文关键字:无效 有一个 pbCertEncoded 指针 上下文 存储 证书 系统      更新时间:2023-10-16

我正试图在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();
}        
}

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

相关文章: