远程站点和客户端私钥

时间:2011-12-16 19:32:27

标签: asp.net firefox applet smartcard

我有一个困难的情况,我需要一种方法,连接到ASP.NET MVC站点的客户端用他们的私钥签名和解密blob,这样服务器永远不会看到私钥材料。在解密的情况下,这些是加密的会话密钥。服务器可以看到会话密钥,而不是用户私钥。

也就是说,我需要在浏览器中向用户呈现一些内容,有一些javascript(或java applet,或silverlight等)执行客户端,与客户端上的硬件令牌进行通信,并将结果返回给服务器。

这不是客户端身份验证。我不需要通过IIS使用证书进行身份验证。硬件令牌是HID OmniKey USB读卡器。

我对可用选项的理解是:

1。 Mozilla Javascript Crypto - 这似乎是最佳路线。 Firefox似乎向远程站点公开了各种智能卡事件和功能。我看到如何签署文本,但没有关于解密blob(最大的目标)。似乎有加载PKCS#11模块的方法,但文档似乎在此之后停止。

2。信任度较高的Silverlight - 由于熟悉Silverlight和.NET,这是我的第二个首选路径。 Silverlight 5具有P / Invoke功能,因此我总是可以调用PC / SC模块,但这需要运行Out of Browser,这是我无法做到的。似乎有一些关于在浏览器中使用提升的信任来运行Silverlight应用程序的帖子,但这是一个全局设置,因此我不想降低其他应用程序的安全性。

第3。 ActiveX - ActiveX组件可以与PC / SC模块交互,但这只是Internet Explorer的解决方案。如果被迫选择所需的浏览器,我更喜欢Firefox或Chrome。

第3。 Firefox / Chrome扩展程序 - 我的理解是Firefox XPCOM是C ++,我可以直接调用PC / SC库,扩展可以与远程站点上的脚本/ DOM交互。我不确定远程站点是如何触发Firefox扩展的。换句话说,远程站点如何告诉分机“好的,是时候签名了”?这条路线的一个这样的例子是XSign(虽然它不使用硬件令牌)。

4。 Java Applet - 这可能最终是唯一的方法。我找到了几个示例/指南,但我不熟悉Java。 Java Applet for Signing with a Smart Card。在这种情况下,它只是一个可以与令牌通信的简单applet,并将结果发布到站点。

还有其他选择吗?我相信选项(1),Mozilla Javascript Crypto是最好的方法,但文档超出了稀疏。谢谢你的指导。

2 个答案:

答案 0 :(得分:0)

我几乎检查了所有选项。最后一个选项(Java Applet)最适合您的情况并且最容易实现。缺点是JRE(Java运行时环境)应该已经安装在客户端并且与浏览器配合使用。用户还必须在初次运行时授予小程序连接到智能卡的权限。

顺便说一句,如果你想使用PKCS#7,你可以使用Bouncy Castle。它在JDK中没有标准API。

PS:不要使用JavaScript进行加密。 Javascript Cryptography Considered Harmful

答案 1 :(得分:0)

也许您可以考虑让客户端下载本机应用程序并安装它(一次)。您可以让他们使用该应用程序进行身份验证并与您的服务器协商会话密钥 - 然后应用程序可以启动带有启动URL中的会话密钥的浏览器。 “原生”应用可能不是原生的 - 使用java或.net(如果你只是windows)或python等。