0

正如标题所暗示的,我想知道是否有某种事件可以捕捉到证书存储何时发生变化。

目标是检测用户何时输入带有签名证书/令牌的特定类型的 USB 智能卡/记忆棒。证书在 Windows 证书存储中注册(“我的”,个人证书)。

我不喜欢检测 USB 事件的想法,因为在插入密钥的时刻和证书实际注册(并且可用)的时刻之间存在可变延迟。

当然,我总是可以设置一个计时器,每 10 秒左右检查一次存储,但我希望你会同意这是一个不优雅的解决方案。当然,如果没有其他好的选择,我猜我最终会这样做。

谢谢

4

2 回答 2

1

混合方法怎么样?观察 USB 事件,然后当插入 USB 密钥时,每隔几秒钟开始轮询存储,直到您看到新证书。仍然不理想,但比每 10 秒 24/7/365 进行一次愚蠢的民意调查更接近它。

诀窍在于知道 USB 密钥何时属于最终注册证书的特定类型。如果你可以在 USB 事件处理程序中知道这一点,则检查它,如果用户插入普通闪存驱动器,则不要开始轮询。如果您不知道这一点,那么当您检测到新连接时,您可能只会在放弃之前轮询证书存储一分钟。

于 2014-10-24T15:14:19.400 回答
0

我也有同样的问题。

我通过等到智能卡不再与另一个进程(证书传播服务)共享来暂时解决了这个问题。不是很好,稳健性也值得怀疑,但它现在有效。

在 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();
}

谁有更好的解决方案?

于 2015-03-12T13:51:50.313 回答