我有一个Web应用程序,其中某些数据(不是文件)需要使用PKI私钥进行数字签名。 PKI证书&私钥将位于USB Cryptotoken中,当插入USB插槽时,它会将证书注册到浏览器。这减轻了使用证书进行身份验证的痛苦,因为我通过在我的应用程序中对ssl-renegotiation进行分解来实现这一点。
然而,使用证书进行数字签名似乎有点棘手。我可以想到几种方法来做到这一点
CAPICOM - http://en.wikipedia.org/wiki/CAPICOM 这适用于支持CAPICOM的浏览器(例如IE)。但是,似乎微软已停止使用此功能。
Mozilla加密对象 - https://developer.mozilla.org/en-US/docs/JavaScript_crypto
WebCrypto API - 大多数浏览器尚不支持此功能。
自定义Java Applet或一些可自由开源的JavaApplet控件。
还有其他选择吗?
我试图找出在网络应用程序中执行此操作的常用,方便和安全的方法。
注意:
答案 0 :(得分:1)
[披露:我为CoSign工作。]
您遇到的问题是旧式PKI系统常见的问题,该系统将签名者的私钥存储在边界(例如智能卡,令牌等)。该系统是在PC(及其上运行的应用程序)成为焦点时设计的。但这个世纪并非如此。现在要么是浏览器,要么是移动设备。
Web应用程序的性质(它们在主机上运行或浏览器上的沙盒JavaScript)与“保护”私钥的本地硬件的概念之间存在紧张关系。
打破浏览器的沙箱
一个设计方向是尝试打破浏览器的沙箱以访问本地硬件私钥库。您列出了许多选项。另外一个是Chrome USB access library。但所有这些解决方案都是:
重新提问5“还有其他选择吗?”
是:集中签名
更好的选择(恕我直言)是集中签署。这样,密钥保存在集中的FIPS安全服务器中。同时,签名者只需使用webapp授权签名。签名者不需要保存私钥,因为它存储在安全服务器中。
要对签名者进行身份验证,您可以使用您的应用程序所需的任何安全级别:用户名/密码;一次性密码;通过SMS进行双因素认证;等
CoSign Signature API和CoSign Signature Web Agent专为此而设计。其他供应商也提供集中式PKI签名。
在回复评论时添加
从答案的第2部分 - 如果证书存储在服务器中并通过使用uname / pwd或2FA验证用户来检索,那么为什么要进行数字签名呢?即,仅使用uname / pwd或2FA验证交易有什么优势?
A:在集中式设计中,私钥不离开中央服务器。相反,要签名的文档或数据被发送到服务器,被签名,然后签名的文档或数据(例如XML)被返回到webapp。
回复:为什么这样?因为数字签名的文档或数据集(例如XML)可以验证以保证文档自签名后未被更改,并提供信任链以保证签名者的身份。相比之下,即使加密2FA等密码,密码也仅为 app 提供签名者身份保证,而不是第三方。PKI数字签名使第三方能够通过验证过程确保签名者的身份。并且可以根据需要通过选择不同的CA来设置保证的强度。
答案 1 :(得分:0)
现代浏览器不支持Java Applet。如我所见,今天最推荐的方法是使用浏览器扩展从浏览器访问证书存储。浏览器通过本地运行的主机应用程序访问证书存储。
请参阅此SO Answer
用于USB令牌或智能卡的驱动程序具有CSP(加密服务提供商),一旦插入令牌,该令牌就会在证书存储中提供令牌中的证书(非私钥)。在用户选择用于签名的证书时,CSP使用硬件在客户端连接的设备通过将其发送到加密设备来获取内容签名。