【问题标题】:X509Store - How to list certificates located in a USB keyX509Store - 如何列出位于 USB 密钥中的证书
【发布时间】:2014-09-18 00:56:25
【问题描述】:

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

        }
    }
}

此代码在本地机器上运行良好(调试模式),但在应用服务器上发布时返回一个空列表。
感谢您的帮助。

【问题讨论】:

    标签: usb x509certificate digital-signature x509


    【解决方案1】:

    如果您需要从服务器上的设备读取证书:

    在应用服务器上,您的代码在服务帐户下运行(很可能)。在这种情况下,CurrentUser 存储(您使用 StoreLocation.CurrentUser 参数引用)将为空。

    现在取决于硬件驱动程序如何映射来自 USB 令牌的证书。如果它可以将证书映射到 LocalMachine 存储,那么您可以修改代码以从 LocalMachine 枚举证书。如果驱动程序仅将它们映射到当前用户,那么您很可能需要在该用户帐户下运行您的代码。在 Windows 中可以使用impersonate as user(或see this SO question),这样您就可以只为一个线程切换到特定的用户帐户。

    另一种选择是通过 PKCS#11 接口访问设备(如果相应的驱动程序 DLL 由硬件供应商提供,并且您有权将其放入服务器系统)。在这种情况下,您使用代码登录硬件,它并不关心用户。 PKCS11 接口与 X509Store 非常不同,需要第三方库(例如我们的 SecureBlackbox)才能使用。但在某些情况下,这似乎是唯一的选择。

    如果您需要从位于远程客户端的设备读取证书:

    唯一的选择是拥有一个可以访问设备的客户端模块(通常是 Java 小程序)。 Java 小程序可以与 PKCS#11 和 Windows 上的 Windows 证书存储一起使用。

    缺点是 Java 小程序不能在移动平台上运行,在移动平台上,您唯一的选择是某种客户端应用程序(到目前为止,这个问题还没有好的通用解决方案)。

    【讨论】:

    • 您的意思是使用 PKCS#11 接口,Web 应用程序 可以访问 客户端计算机 上的 LocalMachine 存储吗?
    • @MisterB。似乎我误读了您的问题(很容易误读,因为您没有指定要读取连接的远程客户端系统上的证书)。我会更新我的答案。
    猜你喜欢
    • 1970-01-01
    • 2012-09-06
    • 2011-06-11
    • 1970-01-01
    • 2011-02-08
    • 2012-12-31
    • 1970-01-01
    • 2022-10-05
    • 1970-01-01
    相关资源
    最近更新 更多