Chrome 下数字签名小程序的替代方案

Alternative for digital signing applet under Chrome

目前我们已经开发了一个系统,可以使用 java 小程序对文档进行数字签名。然而,由于 chrome 禁止小程序,我们正在寻找数字签名的替代解决方案。

目前签名的工作方式如下:

  1. 将 HTTP GET 发送到 servlet 以获取要访问的文档 被签名;
  2. 小程序启动,数字签名驱动程序从文件系统中提取,用户输入 PIN;
  3. 小程序获取认证链,检查CRLs/OSCP并签署文档;
  4. 小程序将带有已签名文件的多部分 post 发送到系统中的 servlet。

另一种解决方案是在浏览器中导入证书并使用 js 进行签名。但这不是一个用户友好的解决方案。

另一种解决方案可能是要求用户下载 运行 一个使用 JNLP 的程序,该程序下载并签署文档并使用 HTTP 多部分 POST 自动上传它。这种方法的缺点是它需要额外的用户交互(下载操作)并且我们会丢失浏览器 http 会话,因此我们必须再次进行身份验证。

哪个更有生命力?你能想到替代方案吗?

以下所有 post 建议基于 RSA 的签名。

您可以使用纯 Javascript+ Web Crypto api.

签名

重点是用HTML5 <file>标签提取密钥,使用forge js library to deal with keys and hashes and canonize xml with deoxxa和sign/verify使用网络加密(此外,伪造也可能sign/verify 但网络加密更快)。

如果您使用独家规范化签署 xmls,请使用 deoxxa(您应该在使用前对其进行浏览器验证)。如果您签署 xml 并需要进行包容性规范化,请使用 my fork of deoxxa (hosted on own gitlab server). I was too lazy to rename exclusive to inclusive but my .js file performs inclusive, believe me) Example of usage forge+deoxxa+html5_p12_file_read in signJs, verifyJs files

此外,forge 支持签署二进制文件(CMS 或旧命名样式 PKCS#7),但我的 JSP 文件没有这样的示例。关于JS中的OCSP和chain test - 我opened the issue在forge中,但是在JS中处理CRL/OCSP和TSP协议似乎太难了,所以你可能会在JS中签名,但验证可能会分裂 - hash检查在 JS 中执行的操作(在我的 JSP 中显示了伪造用法和其他代码)但是像 CRL、链 e.t.c 这样的智能检查在您的 Web 服务中执行 - 您可以提取 X509Certificate 并将其发送到您的 Web 服务并使用bouncycastle 或任何其他很棒的库来进行智能检查。 X509Certificate 无论如何都是 public 信息,将其发送到服务没有问题,但摘要检查需要文件,您可能不想将文件发送到服务,因此使用 forge 来检查我的 verifyJS 文件中显示的摘要。

我的 JS 代码没有重构,甚至没有在 OOP 中,目前我没有在那个项目上工作,但在某个阶段我已经完全工作 xml 在文件系统中使用 p12 密钥的 RSA 签名。

我的仓库中的最新 JSP 使用 forge 仅用于解析 p12 文件并将它们的密钥提供给 Web Crypto API 但我的仓库历史也有纯 Javascript sign/verify(如果你不喜欢网络加密 api)。查看项目分支的历史记录。