【发布时间】: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