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