2017-05-30 57 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