8

我有一个 Web 应用程序,其中一些数据(不是文件)需要使用 PKI 私钥进行数字签名。PKI 证书和私钥将位于 USB Cryptotoken 中,当插入 USB 插槽时,该加密令牌会向浏览器注册证书。这减轻了使用证书进行身份验证的痛苦,因为我通过在我的应用程序中触发 ssl-renegotiation 来做到这一点。

但是,使用证书进行数字签名似乎有点棘手。我可以想到几种方法来做到这一点

  1. CAPICOM - http://en.wikipedia.org/wiki/CAPICOM 这适用于支持 CAPICOM 的浏览器(例如 IE)。然而,微软似乎已经停止了这一点。

  2. Mozilla 加密对象 - https://developer.mozilla.org/en-US/docs/JavaScript_crypto

  3. WebCrypto API - 大多数浏览器尚不支持。

  4. 自定义 Java Applet 或一些开源免费提供的 JavaApplet 控件。

  5. 还有其他选择吗?

我试图弄清楚在 Web 应用程序中执行此操作的常见、方便和安全的方法是什么。

笔记:

  1. 我可以只支持流行的浏览器。
  2. 我正在签署一小段数据——比如 100-200 字节而不是文件。
  3. 我更喜欢 PKCS#7 签名。
4

1 回答 1

2

[披露:我为 CoSign 工作。]

您遇到的问题是旧式 PKI 系统的常见问题,旧式 PKI 系统将签名者的私钥存储在边界处(例如,在智能卡、令牌等中)。该系统是在 PC(以及在其上运行的应用程序)成为焦点时设计的。但本世纪并非如此。现在无论是浏览器还是移动设备都是焦点。

Web 应用程序的性质(它们要么在主机上运行,​​要么是浏览器上的沙盒 JavaScript)与“保护”私钥的本地硬件的想法之间存在矛盾。

突破浏览器的沙箱

一种设计方向是尝试突破浏览器的沙箱来访问本地硬件私钥存储。您列出了许多选项。另外一个是Chrome USB 访问库。但所有这些解决方案都是:

  • 仅限于特定浏览器
  • 安装困难(且昂贵)
  • 维护困难(且昂贵)
  • 高水平的管理开销可帮助用户解决有关保持系统工作的问题。

关于您的问题 5“还有其他选择吗?”

是:集中签名

更好的选择(恕我直言)是集中签名。这样,密钥就保存在集中的 FIPS 安全服务器中。同时,签名者只需使用 webapp 来授权签名。签名者不需要持有私钥,因为它存储在安全服务器中。

要对签名者进行身份验证,您可以使用应用所需的任何安全级别:用户名/密码;一次性密码;通过短信进行两因素身份验证;等等

CoSign Signature APICoSign Signature Web Agent就是为此而设计的。其他供应商也提供集中式 PKI 签名。

为回应评论而添加

从答案的第二部分开始-如果证书存储在服务器中并通过使用 uname/pwd 或使用 2FA 对用户进行身份验证来检索,那么为什么要进行数字签名呢?即,与仅使用 uname/pwd 或 2FA 验证交易相比,它有什么优势?

A:在中心化设计中,私钥不会离开中心服务器。而是将要签名的文档或数据发送到服务器,进行签名,然后将签名的文档或数据(例如 XML)返回给 webapp。

回复:为什么要这样做?因为可以验证经过数字签名的文档或数据集(例如 XML) ,以保证文档在签名后没有更改,并提供信任链来保证签名者的身份。相比之下,密码,即使通过 2FA 等加强,也只能为应用程序提供签名者身份保证,而不是第三方。

PKI 数字签名使第三方能够通过验证过程确保签名者的身份。并且可以根据需要通过选择不同的 CA 来设置保证的强度。

于 2013-07-17T08:50:27.237 回答