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

问题描述 投票:9回答:1

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

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

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

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

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

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

java google-chrome applet digital-signature
1个回答
5
投票

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

您可以在纯Javascript Web Crypto api中签名。

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

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

此外,forge支持签署二进制文件(CMS或旧命名风格PKCS#7),但我的JSP文件没有这样的示例。关于OCSP中的OCSP和链测试 - 我在forge中使用opened the issue,但是在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)。看项目分支的历史。

© www.soinside.com 2019 - 2024. All rights reserved.