2

我想知道是否可以使用智能卡的私钥对数据进行签名,而无需借助 java applet 或 activex 控件。

我非常接近!

我们的环境是:

  • 广告域
  • PKI 基础设施/智能卡 (PIV)

我敲开了一个简单的 ASP.NET (.net 4.0) 网络表单应用程序:

  • Windows 身份验证开启,匿名关闭
  • 身份模拟

使用读卡器中的智能卡,我可以轻松枚举登录用户智能卡 (StoreLocation.CurrentUser) 上的证书。但是,当我尝试访问私钥(通过 CSP)时,我收到“拒绝访问”错误。

在调试模式下的本地机器上一切正常。我知道——这是陈词滥调。

        protected void Page_Load(object sender, EventArgs e)
        {

            //always populate the cert store
            store = new X509Store(StoreName.My, StoreLocation.CurrentUser);
            store.Open(OpenFlags.MaxAllowed);

            RSACryptoServiceProvider csp = new RSACryptoServiceProvider();

            //hardcoded to get the first cert in the store - it's legit and had a private key
            cert = store.Certificates[0];

            //throws error when not local
            csp = (RSACryptoServiceProvider)cert.PrivateKey;

        }

我尝试让应用程序池身份访问证书存储区无济于事。

4

3 回答 3

4

不能在服务器上使用用户的私钥。这将有效地抵消使用智能卡的好处。事实上,安全操作将在智能卡上执行。

支持智能卡的策略

Microsoft 将智能卡视为其公钥基础结构 (PKI) 支持的关键组件。智能卡增强了纯软件解决方案,例如客户端身份验证、交互式登录和安全电子邮件。智能卡是公钥证书和相关密钥的汇聚点,因为它们:

  • 提供防篡改存储,以保护私钥和其他形式的个人信息。
  • 将涉及身份验证、数字签名和密钥交换的安全关键计算与系统的其他部分隔离开来。
  • 在工作、家中或移动用户的计算机之间实现凭据和其他私人信息的可移植性。

资料来源:智能卡概念

如您所见,一个关键方面是将安全关键操作与系统的其余部分隔离开来。使用用户私钥执行加密的唯一方法是使用智能卡读卡器(硬件本身)。由于无法从服务器端 ASP.NET 网页访问客户端的硬件,因此您尝试执行的操作是不可能的。

实现这一点的唯一方法是使用客户端组件。

于 2013-04-30T14:43:59.220 回答
0

你可以先试试这个:

store.Open(OpenFlags.ReadOnly);
cert = store.Certificates[0];
store.Close();
于 2013-04-30T11:30:32.953 回答
0

您访问被拒绝的原因是因为您试图访问私钥并且没有将 PIN 传递给卡。(我相信)

私钥功能需要 PIN。另外..您需要使用 winscard.dll 获取卡上下文

你可以看看这个。

http://msdn.microsoft.com/en-us/library/windows/desktop/aa379886(v=vs.85).aspx

您还需要使用智能卡 CSP。Windows 在 7 及更高版本中有一个本机,称为智能卡迷你驱动程序。

我正在尝试同样的事情......如果我更进一步,我会发回一个样本......

于 2014-06-23T20:49:52.873 回答