保存并加载智能卡证书

问题描述:

我需要从一个程序发送证书信息发送到另一个,并登录到Windows通过使用CredMarshalCredentialLogonUser这些信息帮助。我的程序当前使用常规用户名/密码组合传递凭证并成功登录。我只是增加了使用智能卡凭证的功能。保存并加载智能卡证书

我用这个example成功地与一个智能卡证书登录。

当你运行程序的用户的工作,但没有尝试运行的程序作为SYSTEM时。这是因为SYSTEM无法访问用户的“我的”商店。我试图解决这个问题,要么通过将证书或整个证书存储区作为以用户身份运行的应用程序作为SYSTEM运行的程序。

我已经试过许多方法来得到的东西,将序列化之后成功登录,但没有得到任何东西能够成功。似乎最好的方法是致电CertSaveStore并打开BLOB。我使用了这个Microsoft Example Page底部的最后一个例子。这将正确地从BLOB恢复证书存储,查找证书,甚至生成用户名。但生成的用户名与原始生成的用户名不同,并且无法以ERROR_LOGON_FAILURE(用户名或密码不正确)的错误登录。

我目前的测试应用程序保存证书,并再次加载它在同一个程序。现在我已经将系统方面排除在等式之外。我猜测恢复的证书商店缺少一些信息,但我不确定我错过了什么。任何洞察力将不胜感激。最后

一个说明,我本来试图将生成的用户名和密码只是传递到系统,并使其*,但它与同ERROR_LOGON_FAILURE错误而失败。我假设用户名必须重新生成,因为被不同的用户/程序调用,但是这种假设可能是错误的。

+0

(我不是Win32内部专家):你不能使用具有特定容器名称的CryptAcquireContext,如[这里]所述(https://blogs.msdn.microsoft.com/alejacma/2008/03/03/how-to-select-which-smart-card-reader-to-perform-actions-on /)来访问智能卡对象?然后使用证书登录。注意:您的“示例”链接指向“LogonUser”文档。 – vlp

+0

[This](https://technet.microsoft.com/en-us/library/ff404289(WS.10).aspx)描述也很有趣。 – vlp

+0

@vlp感谢您的评论。我修复了示例链接。我一直在研究CryptAcquireContext,我当然需要更好地理解它。我正在继续深入研究文档以尝试获得工作解决方案。 – Snowman6286

我已经得到了我的示例程序与CertSerializeCertificatesStoreElementCertAddCertificateContextToStore工作。我可以序列化证书,并在稍后将其添加到内存中的新商店。我曾经尝试过,但是不小心没有保存序列化项目的大小,我只是试图使用sizeof()返回不正确大小的项目。

如果有人正在寻找在同一用户空间中的程序之间发送证书凭证,这种方法将运行良好。

我把这个提前一步,并在我的用户空间/系统范例中实现它。逻辑工作正常,我能够生成一个用户名,但仍然无法通过LogonUser。再过一周或试验和错误之后,我发现了一个可在用户空间和SYSTEM之间工作的解决方案。我最终不得不使用LsaLogonUser而不是LogonUser

如果有人希望有一个用户空间程序将凭据发送给在SYSTEM中运行的守护程序,并让该程序下到用户,请使用此example。我最初尝试这个very similar example,但它继续失败。在工作示例中,您不需要传递域或用户名,只需输入PIN。系统将从阅读器读取智能卡,并通过传入的PIN进行验证。只有当智能卡位于远程计算机时,该解决方案才能在计算机上运行。我正在研究一种方法来实现它与主机中的智能卡一起工作,但它不属于这篇文章。

我希望这可以节省一些人为此所做的几周工作。