保存和加载智能卡证书

Save and load Smart Card Certificate

我需要帮助将证书信息从一个程序发送到另一个程序,并通过使用 CredMarshalCredential and LogonUser 使用该信息登录 Windows。我的程序目前通过凭据并使用常规 username/password 组合成功登录。我只是添加了使用智能卡凭据执行此操作的功能。

我已经使用此 example 成功地使用智能卡证书登录。

当您以用户身份 运行 程序时,此方法有效,但当尝试以 SYSTEM 身份 运行 程序时无效。这是因为 SYSTEM 无法访问用户的 "MY" 商店。我正在尝试解决此问题,方法是将证书或整个证书存储区作为系统从应用程序 运行ning 作为用户传递给程序 运行ning。

我已经尝试了很多方法来获得在序列化后可以成功登录的东西,但是还没有任何东西可以成功工作。似乎最有效的方法是调用 CertSaveStore and Open the BLOB. I've used the last example at the bottom of this Microsoft Example Page。这会正确地从 BLOB 恢复证书存储,找到证书,甚至生成用户名。但是生成的用户名与原来生成的用户名不同,登录失败,报错ERROR_LOGON_FAILURE(用户名或密码不正确)。

我当前的测试应用程序保存证书并在同一程序中再次加载它。我现在已经将 SYSTEM 方面排除在等式之外。我猜恢复的证书存储缺少一些信息,但我不确定我缺少什么。任何见解将不胜感激。

最后一点,我最初尝试将生成的用户名和 PIN 传递给 SYSTEM 并让它退出,但它失败并出现相同的 ERROR_LOGON_FAILURE 错误。我假设用户名必须重新生成,因为被另一个 user/program 调用,但这个假设可能是错误的。

我的示例程序已与 CertSerializeCertificatesStoreElementCertAddCertificateContextToStore 一起使用。我能够序列化证书,稍后将其添加到内存中的新存储区。我之前试过这个,但不小心没有保存序列化项目的大小,我只是尝试使用 sizeof() 返回错误大小的项目。

如果有人希望在同一用户空间中的程序之间发送证书凭据,则此方法会很有效。

我进一步向前迈进了一步,并在我的 userspace/SYSTEM 范例中实施了它。逻辑工作正常,我能够生成用户名,但仍然无法 LogonUser。再过一周或反复试验后,我找到了一个在用户空间和 SYSTEM 之间工作的解决方案。我最终不得不使用 LsaLogonUser 而不是 LogonUser

如果有人希望用户空间程序将凭据发送到 SYSTEM 中的守护进程 运行 并让该程序降级到用户,请使用此 example. I initially tried this very similar example,但它仍然失败。在工作示例中,您不需要传入域或用户名,只需传入 PIN。系统将从 reader 中读取智能卡并使用传入的 PIN 码进行验证。仅当智能卡位于远程计算机上时,该解决方案才能跨计算机工作。我正在寻找一种方法来让它与主机中的智能卡一起工作,但它不在这个范围内 post。

我希望这可以节省我为达到这一点而付出的数周工作时间。