我想知道是否可以使用智能卡的私钥来签署数据,而不使用来使用java applet或activex控件。
我非常接近!
我们的环境是:
我用:
敲了一个简单的ASP.NET(.net 4.0)Web表单应用程序通过阅读器中的智能卡,我可以轻松地枚举登录用户的智能卡(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;
}
我试过让应用程序池身份访问证书存储无济于事。
答案 0 :(得分:4)
无法在服务器上使用用户的私钥。这将有效地抵消使用智能卡的好处。实际上,安全操作将在智能卡上执行。
支持智能卡的策略
Microsoft将智能卡视为其公钥基础结构(PKI)支持的关键组件。智能卡增强了纯软件解决方案,例如客户端身份验证,交互式登录和安全电子邮件。智能卡是公钥证书和相关密钥的融合点,因为它们:
- 提供防篡改存储以保护私钥和 其他形式的个人信息。
- 隔离涉及身份验证的安全关键计算, 数字签名,以及系统其他部分的密钥交换。
- 启用凭据和其他私人信息的可移植性 在工作,在家或移动用户的计算机之间。
如您所见,一个关键方面是将安全关键操作与系统的其他部分隔离开来。使用用户私钥执行加密的唯一方法是使用智能卡读卡器(硬件本身)。由于无法从服务器端ASP.NET网页访问客户端的硬件,因此您无法尝试执行此操作。
实现此目的的唯一方法是使用客户端组件。
答案 1 :(得分:0)
你可以先试试这个:
store.Open(OpenFlags.ReadOnly);
cert = store.Certificates[0];
store.Close();
答案 2 :(得分:0)
您获得拒绝访问权限的原因是您尝试访问私钥并且尚未将PIN传递给卡。 (我相信)
私钥功能需要PIN。另外..您需要使用winscard.dll
获取卡片上下文你可以看一下。
http://msdn.microsoft.com/en-us/library/windows/desktop/aa379886(v=vs.85).aspx
您还需要使用智能卡CSP .. Windows有一个7和7以上的本机称为智能卡迷你驱动程序。
我正在尝试同样的事情......如果我进一步发展,我会回复一个样本......