我们有一个功能,在用户选择有效证书后,我们使用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