我必须找到智能卡是否有给定的证书。为此,我首先使用CryptAcquireContext获取HCRYPTPROV(CSP句柄),然后使用它打开系统存储(OpenSystemStore),然后枚举证书。
它在Windows XP上运行良好。在Windows 7上,由于存储在商店中的陈旧/旧证书,它会产生问题。 Windows通过智能卡在其商店中存储/复制证书。这意味着如果我在智能卡上有两个证书Cert1和Cert2,我已经使用智能卡登录到Windows。然后Windows将这些证书存储在其商店中,我们可以通过IE-> Internet Options-> Contents-> Certificates查看。然后,如果我从智能卡中删除Cert2,那么Cert2也会显示在Windows应用商店中,这会破坏我的代码。
因此,我需要枚举仅在智能卡上可用的证书,而不是在Windows商店中。
答案 0 :(得分:1)
假设您获得的HCRYPTPROV用于智能卡,请将CryptGetProvParam与PP_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等效值为NCryptGetProperty且NCRYPT_USER_CERTSTORE_PROPERTY
参数。