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

Ivo*_*Ivo 10 java applet google-chrome digital-signature

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

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

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

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

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

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

Bau*_*han 5

以下所有帖子都建议基于RSA的签名.

您可以使用纯Javascript + Web Crypto api进行签名.

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

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

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

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

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