1

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

它在 Windows XP 上完美运行。在 Windows 7 上,由于存储在存储中的过时/旧证书而出现问题。Windows 从智能卡存储/复制其存储中的证书。这意味着如果我在智能卡上有两个证书 Cert1 和 Cert2,并且我已经使用智能卡登录到 Windows。然后 Windows 将这些证书存储在其存储中,我们可以通过转到 IE->Internet 选项->内容->证书来查看。然后,如果我从智能卡中删除 Cert2,那么 Cert2 也会显示在 Windows 应用商店中,这会破坏我的代码。

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

4

1 回答 1

2

假设您获取的 HCRYPTPROV 用于智能卡,请使用CryptGetProvParamPP_USER_CERTSTORE参数:

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

例如

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

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

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

CNG 等效项是带有参数的NCryptGetProperty 。NCRYPT_USER_CERTSTORE_PROPERTY

于 2013-05-21T21:28:23.630 回答