正如标题所暗示的,我想知道是否有某种事件可以捕捉到证书存储何时发生变化。
目标是检测用户何时输入带有签名证书/令牌的特定类型的 USB 智能卡/记忆棒。证书在 Windows 证书存储中注册(“我的”,个人证书)。
我不喜欢检测 USB 事件的想法,因为在插入密钥的时刻和证书实际注册(并且可用)的时刻之间存在可变延迟。
当然,我总是可以设置一个计时器,每 10 秒左右检查一次存储,但我希望你会同意这是一个不优雅的解决方案。当然,如果没有其他好的选择,我猜我最终会这样做。
谢谢
正如标题所暗示的,我想知道是否有某种事件可以捕捉到证书存储何时发生变化。
目标是检测用户何时输入带有签名证书/令牌的特定类型的 USB 智能卡/记忆棒。证书在 Windows 证书存储中注册(“我的”,个人证书)。
我不喜欢检测 USB 事件的想法,因为在插入密钥的时刻和证书实际注册(并且可用)的时刻之间存在可变延迟。
当然,我总是可以设置一个计时器,每 10 秒左右检查一次存储,但我希望你会同意这是一个不优雅的解决方案。当然,如果没有其他好的选择,我猜我最终会这样做。
谢谢
混合方法怎么样?观察 USB 事件,然后当插入 USB 密钥时,每隔几秒钟开始轮询存储,直到您看到新证书。仍然不理想,但比每 10 秒 24/7/365 进行一次愚蠢的民意调查更接近它。
诀窍在于知道 USB 密钥何时属于最终注册证书的特定类型。如果你可以在 USB 事件处理程序中知道这一点,则检查它,如果用户插入普通闪存驱动器,则不要开始轮询。如果您不知道这一点,那么当您检测到新连接时,您可能只会在放弃之前轮询证书存储一分钟。
我也有同样的问题。
我通过等到智能卡不再与另一个进程(证书传播服务)共享来暂时解决了这个问题。不是很好,稳健性也值得怀疑,但它现在有效。
在 C# 中:
string selector = SmartCardReader.GetDeviceSelector();
DeviceInformationCollection devices = await DeviceInformation.FindAllAsync(selector);
foreach (DeviceInformation device in devices)
{
SmartCardReader reader = await SmartCardReader.FromIdAsync(device.Id);
reader.CardAdded += ReaderOnCardAdded;
}
private static void ReaderOnCardAdded(SmartCardReader sender, CardAddedEventArgs args)
{
Task t = ReaderOnCardAddedAsync(sender, args);
t.Wait();
}
private static async Task ReaderOnCardAddedAsync(SmartCardReader sender, CardAddedEventArgs args)
{
SmartCardProvisioning provisioning = await SmartCardProvisioning.FromSmartCardAsync(args.SmartCard);
SmartCardStatus status;
do
{
status = await provisioning.SmartCard.GetStatusAsync();
Thread.Sleep(100);
} while (status == SmartCardStatus.Shared);
PrintCertificatesOrDoSomethingElseUseful();
}
谁有更好的解决方案?