2013-05-15 42 views
1

我必須查明智能卡是否有一個給定的證書。爲此,我首先使用CryptAcquireContext獲取HCRYPTPROV(CSP的句柄),然後使用它打開系統存儲(OpenSystemStore),然後枚舉證書。只能在智能卡上使用證書

它在Windows XP上完美運行。在Windows 7上,由於在商店中存儲了陳舊/舊證書,因此存在問題。 Windows從智能卡存儲/複製其存儲中的證書。這意味着如果我在智能卡上有兩個證書Cert1和Cert2,並且我已經使用智能卡登錄到Windows。那麼Windows將這些證書存儲在其商店中,我們可以看到,通過轉到IE-> Internet選項 - >內容 - >證書。然後,如果我從智能卡中刪除Cert2,那麼Cert2也會顯示在Windows Store中,並且這件事正在破壞我的代碼。

所以我需要枚舉這僅適用於智能卡不能在Windows應用商店的證書。

+1

尚未對Windows編程一段時間,但通常智能卡上的證書會附帶一個私鑰以進行實際簽名或解密。你可能會嘗試訪問或使用私鑰,看看會發生什麼? –

+0

謝謝貓頭鷹。它爲我工作。我已經使用CryptAcquireCertificatePrivateKey API檢查給定證書的相應私鑰。如果它在智能卡上可用,它將成功返回 – MLS

+0

很高興爲您提供一些幫助穆罕默德。 –

回答

1

假設你獲得HCRYPTPROV是智能卡,使用CryptGetProvParamPP_USER_CERTSTORE參數:

獲得一個智能卡的用戶證書存儲區。此證書存儲包含存儲在智能卡上的所有用戶證書。

例如,

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

然後,您可以枚舉從HCERTSTORE智能卡的證書與系統存儲。

的MSDN頁面狀態的 「Windows XP:不支持此參數。」但它在XP上使用最新的Service Pack可以正常工作。

的CNG當量是NCryptGetPropertyNCRYPT_USER_CERTSTORE_PROPERTY參數。

+0

謝謝伊恩的解決方案。但是,所有CSP都可能不支持PP_USER_CERTSTORE。我曾嘗試過與Alladin eToken。它不工作。 – MLS

相關問題