在将签署文档的Web应用程序(aspx / C#)中,如何列出用户USB密钥上的证书(身份验证/签名密钥)?
这是我的代码:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Security.Cryptography.X509Certificates;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
namespace Signature1
{
public partial class signature : System.Web.UI.Page
{
string strTxt = "Certificates : ";
protected void Page_Load(object sender, EventArgs e)
{
X509Store store = new X509Store(StoreName.My, StoreLocation.CurrentUser);
store.Open(OpenFlags.ReadOnly);
foreach (X509Certificate2 cert in store.Certificates)
{
strTxt += "\nDélivered to " + cert.SubjectName.Name + " by " + cert.IssuerName.Name;
}
store.Close();
myTextbox.Text = strTxt ;
}
}
}
此代码在本地计算机上工作正常(调试模式),但在应用程序服务器上发布时返回空列表 谢谢你的帮助。
答案 0 :(得分:0)
如果您需要从服务器上的设备读取证书:
在应用程序服务器上,您的代码在服务帐户下运行(最有可能)。在这种情况下,CurrentUser存储(您使用StoreLocation.CurrentUser参数引用它)将为空。
现在,它取决于硬件的驱动程序如何映射来自USB令牌的证书。如果它可以将证书映射到LocalMachine商店,那么您可以修改代码以枚举LocalMachine中的证书。如果驱动程序仅将它们映射到当前用户,则很可能您需要在该用户帐户下运行代码。在Windows中可以impersonate as user(或see this SO question),因此您只需切换到一个线程的特定用户帐户即可。
另一种选择是通过PKCS#11接口访问设备(如果相应的驱动程序DLL由硬件供应商提供,并且您有权将其放入服务器系统)。在这种情况下,您使用代码登录硬件,它不关心用户。 PKCS11接口与X509Store非常不同,但需要第三方库(例如我们的SecureBlackbox)才能使用。但在某些情况下,这似乎是唯一的选择。
如果您需要从远程客户端上的设备读取证书:
唯一的选择是拥有一个客户端模块(通常是它的Java小程序),它可以访问该设备。 Java小程序可以与Windows上的PKCS#11和Windows证书存储一起使用。
缺点是Java applet不能在移动平台上运行,你的唯一选择就是某种类型的客户端应用程序(到目前为止,这个问题还没有很好的通用解决方案)。