我一直在尝试从PCCERT_CONTEXT获取提供者名称,因为在我当前的项目中,我必须将智能卡中的所有证书加载到我的程序中。并且在将来我必须处理那些证书与一些任务,如续订证书,删除证书。但我有问题,我必须用CryptAcquireContext将CSP名称和提供者名称映射到执行。我目前很困惑如何存档,任何人都可以有一些指导,以帮助我解决这个问题。 我尝试过CertWetCertificateContextProperty,dwPropId是CERT_KEY_PROV_INFO_PROP_ID,但是我无法获得CRYPT_KEY_PROV_INFO。
答案 0 :(得分:2)
如果我理解正确,则以下代码段显示如何从证书中提取密钥提供程序信息。
void trace(char* message, DWORD errorCode)
{
cout << message << errorCode;
}
std::wstring Test_CertGetCertificateContextProperty(PCCERT_CONTEXT pCertContext)
{
DWORD dwSize = 0;
BOOL bIsSuccess = CertGetCertificateContextProperty(pCertContext,
CERT_KEY_PROV_INFO_PROP_ID,
NULL,
&dwSize);
if (!bIsSuccess)
{
trace("CertGetCertificateContextProperty failed with error: ", GetLastError());
return L"";
}
PCRYPT_KEY_PROV_INFO pKeyProvInfo = (PCRYPT_KEY_PROV_INFO)LocalAlloc(LMEM_ZEROINIT, dwSize);
if (pKeyProvInfo == NULL)
{
trace("LocalAlloc failed with error:", GetLastError());
return L"";
}
bIsSuccess = CertGetCertificateContextProperty(pCertContext,
CERT_KEY_PROV_INFO_PROP_ID,
pKeyProvInfo,
&dwSize);
std::wstring provName;
if (bIsSuccess)
{
provName = pKeyProvInfo->pwszProvName;
}
LocalFree(pKeyProvInfo);
return provName;
}