保存并加载智能卡证书

时间:2016-03-07 20:07:09

标签: c certificate smartcard cryptoapi

我需要帮助才能将证书信息从一个程序发送到另一个程序,并通过CredMarshalCredentialLogonUser使用该信息登录Windows。我的程序目前通过凭据并使用常规用户名/密码组合成功登录。我只是添加了使用智能卡凭证进行操作的功能。

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

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

我尝试了很多方法来获得在序列化后成功登录的东西,但是没有任何成功的工作。看起来效果最好的方法是调用CertSaveStore并打开BLOB。我已经使用了Microsoft Example Page底部的最后一个示例。这将正确地从BLOB恢复证书存储,查找证书,甚至生成用户名。但生成的用户名与原始生成的用户名不同,无法登录,错误为ERROR_LOGON_FAILURE(用户名或密码不正确)。

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

最后一点,我最初尝试将生成的用户名和PIN传递给SYSTEM并让它降级,但失败并出现相同的ERROR_LOGON_FAILURE错误。我假设自从被不同的用户/程序调用以来必须重新生成用户名,但这种假设可能是错误的。

1 个答案:

答案 0 :(得分:0)

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

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

我进一步采取了这一步骤,并在我的用户空间/ SYSTEM范例中实现了它。逻辑工作正常,我能够生成用户名但仍未能LogonUser。经过一周或反复试验,我找到了一个在用户空间和SYSTEM之间起作用的解决方案。我最终不得不使用LsaLogonUser而不是LogonUser

如果有人希望让用户空间程序向在SYSTEM中运行的守护程序发送凭据并让该程序向下移动到用户,请使用此example。我最初尝试了这个very similar example,但它仍然失败了。在工作示例中,您无需传入域或用户名,只需传递PIN。系统将从阅读器读取智能卡,并使用传入的PIN进行验证。只有智能卡位于远程计算机上时,此解决方案才能在计算机上运行。我正在寻找一种方法来完成它与主机中的智能卡一起工作,但它不在这篇文章之内。

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