X509Store - 如何列出位于USB密钥中的证书

时间:2014-09-18 00:56:26

标签: usb x509certificate digital-signature x509

在将签署文档的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 ;

        }
    }
}

此代码在本地计算机上工作正常(调试模式),但在应用程序服务器上发布时返回空列表 谢谢你的帮助。

1 个答案:

答案 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不能在移动平台上运行,你的唯一选择就是某种类型的客户端应用程序(到目前为止,这个问题还没有很好的通用解决方案)。