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

Posted

技术标签:

【中文标题】枚举仅在智能卡上可用的证书【英文标题】:Enumertating Certificates available only on the Smart Card 【发布时间】:2013-05-15 16:13:27 【问题描述】:

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

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

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

【问题讨论】:

已经有一段时间没有对 Windows 进行编程了,但通常智能卡上的证书会附带一个私钥来进行实际的签名或解密。你能不能尝试访问或使用私钥,看看会发生什么? 感谢 owlstead。它对我有用。我已经使用 CryptAcquireCertificatePrivateKey API 来检查给定证书的相应私钥。如果在智能卡上可用,它将成功返回 很高兴能为您 Mohammed 提供帮助。 【参考方案1】:

假设您获取的 HCRYPTPROV 用于智能卡,请使用 CryptGetProvParam 和 PP_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 参数。

【讨论】:

感谢伊恩的解决方案。但是 PP_USER_CERTSTORE 可能并非所有 CSP 都支持。我尝试过使用 Alladin eToken。它不工作。

以上是关于枚举仅在智能卡上可用的证书的主要内容,如果未能解决你的问题,请参考以下文章

CredMartialCredentials 用户名提示(智能卡)

读取智能卡上的证书

在当前阅读器上的智能卡上查找证书

Cordova InAppBrowser 访问虚拟智能卡上的证书

使用 Javascript 读取智能卡证书

将证书从智能卡复制到计算机