【问题标题】:Sign data using smart card's private key with ASP.NET, Windows Authentication, and Impersonation通过 ASP.NET、Windows 身份验证和模拟使用智能卡的私钥对数据进行签名
【发布时间】:2014-06-24 04:49:52
【问题描述】:

我想知道是否可以使用智能卡的私钥对数据进行签名而不诉诸 java 小程序或 activex 控件。

我非常接近!

我们的环境是:

  • AD 域
  • 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;

        }

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

【问题讨论】:

  • ASP.NET 代码在服务器上运行,证书位于客户端系统上。如果没有帮助模块,您将如何使用 ASP.NET 代码获取客户端证书?
  • @EugeneMayevski'EldoSCorp - 但是 ASP.NET 代码 正在 枚举证书!所以它可以“看到”一些东西——包括证书上的公钥,而不是私钥。
  • 我只能猜测在您的情况下发生了什么(您是否在同一台计算机上运行服务器和客户端?)但正如我所说,无法从 ASP.NET 代码中获取客户端的私钥。
  • 你并不是真的“非常接近”。您访问了应该公开的信息,这些信息故意复制到系统中。现在您到了要访问私钥的地步。但是私钥实际上并不是证书的一部分,它与证书相关联,因为证书中的公钥和智能卡中的私钥是一对。您仍然需要本地计算机上的权限才能以某种方式访问​​智能卡的私钥。根据卡的不同,您可能还需要使用 PIN 重新进行身份验证。
  • @owlstead - 你知道解释这个的参考资料或文章吗?如果是这样,您可以发布答案吗?

标签: asp.net .net-4.0 x509certificate smartcard


【解决方案1】:

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

支持智能卡的策略

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

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

来源:Smart Card Concepts

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

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

【讨论】:

  • 这很有帮助,也是我一直在寻找的。​​span>
【解决方案2】:

你可以先试试这个:

store.Open(OpenFlags.ReadOnly);
cert = store.Certificates[0];
store.Close();

【讨论】:

  • 是的,这行得通,证书有效 - 但 PrivateKey 属性会引发“拒绝访问”错误。
  • 呃,我又看了你的问题。我认为通过裸浏览器的 PKI 获取私钥是不可能的。至少不应该这样。
【解决方案3】:

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

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

你可以看看这个。

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

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

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

【讨论】:

    猜你喜欢
    • 2015-08-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-08
    • 1970-01-01
    • 2013-03-07
    相关资源
    最近更新 更多