2017-05-30 51 views
2

我們有一個功能,在用戶選擇有效證書後,我們使用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.RemovableHardwareDevice找到),但我們要確保它在會議期間隨時可以訪問。換句話說,當智能卡被移除時我們需要一個事件,所以我們可以自動註銷。

一個原始的方法是有一個計時器作業,每分鐘左右都可以訪問certificate.PrivateKey,但在提示用戶插入智能卡並且用戶按下Cancel之前不會發生。

該功能也支持Windows 7,因此使用UWP庫不是一個選項。任何方式來完成這個?

回答

3

您可以使用PC/SC檢查卡片是否被移除。在Windows中,它在WinSCard庫中實現。看到這個SO answer

還有一個C#實現pcsc-sharp

+0

圖書館似乎工作得很好。謝謝。然而,將X509Certificate2與智能卡讀卡器相關聯仍然是一個挑戰。如果連接的智能卡閱讀器不止一個,我需要確保正確的卡刪除觸發此操作。我查看了「X509Certificate2」和「SmartCardReader」屬性中的屬性,但找不到任何匹配的內容。只有'X509Certificate2'具有'CspKeyContainerInfo.KeyContainerName(UUID/string)',但不確定它甚至是真的。 – Natan

+0

@Natan是的,這是一個問題。在獨立CSP的舊時代,它可能與CSP的名稱相關,但即使如此,你也無法區分同一供應商的兩張卡片。現在,我們擁有Base SmartCard Crypto Provider及其小型驅動程序的概念,並且很苦惱。 – pepo

+0

@Natan你可以使用[Pkcs11Interop](https://www.pkcs11interop.net/)並在卡插入時自己做卡片搜索。實際上,許多供應商驅動程序與某種緩存相同,因此他們不必每次都讀取整個卡。但這意味着你必須知道要加載哪些pkcs#11庫和讀卡相對較慢。所以......你用純淨的.net開始,並以2個第三方庫結束:) – pepo