需要 UWP 应用程序 PIV 示例

UWP Application PIV Example Needed

我们正在使用 Visual Studio 2019 开发 C# UWP 应用程序。我已经成功地从 USB 端口设置了对 YubiKey FIPS(4.4.5 固件)的监控 inserted/removed。我们将 YubiKey 设置为使用 PIV,并将证书加载到插槽 9c(使用 YubiKey PIV Manager,我没有安装迷你驱动程序)。我确实注意到,当 YubiKey 插入 USB 时,它会使用插槽 9c 中的证书自动加载我的个人证书存储。我们从服务器收到质询,我需要用它来验证 YubiKey。从插槽 9c 获取证书的下一步是什么(如果该密钥上有多个证书怎么办)? Yubico 没有显示如何将密钥与应用程序集成的示例(我不相信 Windows Hello 在这里适用,不是吗?)。我们正在尝试使用 Windows.Devices.SmartCards 命名空间。这个命名空间好像没有槽的概念。这是正确的方向还是我们需要使用 Yubico 库(迷你驱动程序)我不知道。文档是有限的。

var yubiKeys = Readers.Where(r => r.Value.Name.Contains("Yubi", StringComparison.OrdinalIgnoreCase));

foreach (KeyValuePair<string, SmartCardReader> item in yubiKeys)
{
    IReadOnlyList<SmartCard> cards = await item.Value.FindAllCardsAsync();

    foreach(SmartCard card in cards)
    {
       SmartCardProvisioning prov = await SmartCardProvisioning.FromSmartCardAsync(card);

       using (SmartCardChallengeContext context = await prov.GetChallengeContextAsync())
       {
            IBuffer yubiKeyChallenge = context.Challenge;  // IS THIS THE CARDS ADMIN PIN?

            // Challenge to acquire cert here perhaps?
            // the card object has no concept of slots, would each slot be a card in the reader?
            // if so, how would I use the Challenge for that card?
       }
    }
}

要直接访问智能卡或 USB 令牌内容(如插槽、其中的密钥),您可能需要使用 PKCS#11。

但是由于您说智能卡内容正在由智能卡驱动程序 (CSP) 加载到 Windows 证书存储区,您可以使用 Windows.Security、X509 证书和 RSA 提供程序(我不记得了。 NET 命名空间...)使用 RSAProvider 提供签名请求,CSP 会依次将该请求发送到智能卡。许多人不需要直接访问智能卡进行签名。

基于浏览器的用户认证,请参考so answer

Windows 智能卡组件(包括 Windows Inbox Smart Card Minidriver and the Yubico minidriver)不直接实现支持的 PIV 概念,如槽或对象。相反,微型驱动程序扫描 PIV 槽并将任何现有密钥转换为 "key containers",这就是 Windows 处理私钥和证书的方式。 Certificate Store 中的每个证书都有一个关联的密钥容器,但由于它没有 PIV 的概念,所以像密钥引用槽这样的细节已被抽象掉。

与大多数内置 Windows 组件一样,应用程序不直接与智能卡通信,而是使用证书传播服务提供的证书添加到个人商店。

如果您使用证书管理器 (certmgr.msc) 检查用户的个人存储,证书属性应该有一个注释,表明您有一个与该证书关联的私钥。

To sign or encrypt with the private key, the app acquires the certificate from the personal store and uses the appropriate .NET CSP with that certificate.

一般来说,UWP 应用的本机互操作能力有限,并且依赖于使用智能卡密钥存储提供程序 (KSP) 的基本 API,稍后通过 CNG 接口调用。

这里是 example 使用 UserCertificateStore 与用户个人证书库中的证书进行交互。

然后您可以将该证书与您最喜欢的 CSP 软件库一起使用来签名或加密。几个例子 here.