枚举仅在智能卡上可用的证书

时间:2013-05-15 16:13:27

标签: certificate smartcard

我必须找到智能卡是否有给定的证书。为此,我首先使用CryptAcquireContext获取HCRYPTPROV(CSP句柄),然后使用它打开系统存储(OpenSystemStore),然后枚举证书。

它在Windows XP上运行良好。在Windows 7上,由于存储在商店中的陈旧/旧证书,它会产生问题。 Windows通过智能卡在其商店中存储/复制证书。这意味着如果我在智能卡上有两个证书Cert1和Cert2,我已经使用智能卡登录到Windows。然后Windows将这些证书存储在其商店中,我们可以通过IE-> Internet Options-> Contents-> Certificates查看。然后,如果我从智能卡中删除Cert2,那么Cert2也会显示在Windows应用商店中,这会破坏我的代码。

因此,我需要枚举仅在智能卡上可用的证书,而不是在Windows商店中。

1 个答案:

答案 0 :(得分:1)

假设您获得的HCRYPTPROV用于智能卡,请将CryptGetProvParamPP_USER_CERTSTORE参数一起使用:

  

获取智能卡的用户证书存储区。此证书存储区包含存储在智能卡上的所有用户证书。

e.g。

HCERTSTORE hCertStore = NULL;
DWORD size = sizeof(hCertStore);
CryptGetProvParam(hProv, PP_USER_CERTSTORE, (PBYTE)&hCertStore, &size, 0);

然后,您可以从HCERTSTORE枚举智能卡的证书,与系统存储一样。

MSDN页面指出“Windows XP:不支持此参数”。但它在使用最新Service Pack的XP上运行良好。

CNG等效值为NCryptGetPropertyNCRYPT_USER_CERTSTORE_PROPERTY参数。