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

目前,我们已经开发出一个可以使用Java applet对文档进行数字签名的系统。 然而,随着chrome下的applet禁令,我们正在寻找一种替代的数字签名解决方案。

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

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

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

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

哪个更可行? 你能想到另类吗?

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

你可以用纯Javascript + Web Crypto api签名。

关键点是使用HTML5 标签提取密钥,使用伪造 js库处理密钥和哈希并使用deoxxa封装 xml并使用web加密进行签名/validation(此外,伪造也可以签名/validation但是网络加密更快)。

如果您使用独占规范化签署xmls,请使用deoxxa(您应该在使用前对其进行浏览)。 如果您签署xml并需要进行包容性规范化,请使用我的deoxxa分支 (托管在自己的gitlab服务器上)。 我太懒了,不能重命名包容但我的.js文件执行包容性,相信我)在signJs,verifyJs文件中使用deoxxa + html5_p12_file_read + html5_p12_file_read的示例 。

此外,forge支持签署二进制文件(CMS或较旧的命名样式PKCS#7),但我的JSP文件没有这样的示例。 关于OCSP中的OCSP和链测试 – 我在forge中打开了这个问题 ,但是在JS中处理CRL / OCSP和TSP协议似乎太难了,这就是为什么你可以登录JS,但validation可能会被拆分 – 在JS中进行哈希检查(在我的JSP中显示伪造用法和其他代码)但是在您的Web服务中执行CRL,链等等智能检查 – 您可以提取X509Certificate并将其发送到您的Web服务并使用bouncycastle或任何其他酷库进行智能检查。 X509Certificate无论如何都是公共信息,将其发送到服务没有问题,但摘要检查需要文件,您可能不想将文件发送到服务,因此使用伪造来检查我的verifyJS文件中显示的摘要。

我的JS代码没有重构,甚至没有在OOP中,目前我没有在该项目上工作,但在某些阶段我完全使用文件系统中的p12键进行xml RSA siging。

我的repo中的最新JSP使用伪造只是为了解析p12文件并提供从它们到Web Crypto API的密钥,但我的repo历史也有纯Javascript签名/validation(如果你不喜欢web crypto api)。 看项目分支的历史。