我們有一個功能,在用戶選擇有效證書後,我們使用Windows的個人證書存儲庫使用證書進行身份驗證。它只是簽署了挑戰,以下內容:刪除X509Certificate2對象的智能卡時的事件
public static byte[] SignDataSHA512RSA(X509Certificate2 certificate, byte[] data)
{
using (var rsa = certificate.PrivateKey as RSACryptoServiceProvider)
{
if (rsa == null)
{
return null;
}
return rsa.SignData(data, CryptoConfig.MapNameToOID("SHA512"));
}
}
它工作得很好用RSACryptoServiceProvider
類。該功能允許常規證書和智能卡證書。如果有智能卡並且需要PIN碼,則Windows會爲其提供一個對話框。
現在,此功能還有一個額外的安全要求,如果使用智能卡進行此操作(如果您要強制執行硬件,我們可以通過rsa.CspKeyContainerInfo.Removable
和HardwareDevice
找到),但我們要確保它在會議期間隨時可以訪問。換句話說,當智能卡被移除時我們需要一個事件,所以我們可以自動註銷。
一個原始的方法是有一個計時器作業,每分鐘左右都可以訪問certificate.PrivateKey
,但在提示用戶插入智能卡並且用戶按下Cancel
之前不會發生。
該功能也支持Windows 7,因此使用UWP庫不是一個選項。任何方式來完成這個?
圖書館似乎工作得很好。謝謝。然而,將X509Certificate2與智能卡讀卡器相關聯仍然是一個挑戰。如果連接的智能卡閱讀器不止一個,我需要確保正確的卡刪除觸發此操作。我查看了「X509Certificate2」和「SmartCardReader」屬性中的屬性,但找不到任何匹配的內容。只有'X509Certificate2'具有'CspKeyContainerInfo.KeyContainerName(UUID/string)',但不確定它甚至是真的。 – Natan
@Natan是的,這是一個問題。在獨立CSP的舊時代,它可能與CSP的名稱相關,但即使如此,你也無法區分同一供應商的兩張卡片。現在,我們擁有Base SmartCard Crypto Provider及其小型驅動程序的概念,並且很苦惱。 – pepo
@Natan你可以使用[Pkcs11Interop](https://www.pkcs11interop.net/)並在卡插入時自己做卡片搜索。實際上,許多供應商驅動程序與某種緩存相同,因此他們不必每次都讀取整個卡。但這意味着你必須知道要加載哪些pkcs#11庫和讀卡相對較慢。所以......你用純淨的.net開始,並以2個第三方庫結束:) – pepo