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

时间:2015-09-11 14:08:27

标签: java google-chrome applet digital-signature

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

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

  1. 将HTTP GET发送到servlet以获取要访问的文档 签字;
  2. 小程序启动,数字签名驱动程序从文件系统中提取,用户输入PIN;
  3. applet获取认证链,检查CRL / OSCP并签署文档;
  4. applet将已签名文件的多部分帖子发送到系统中的servlet。
  5. 一种替代解决方案是在浏览器中导入证书并使用js进行签名。但这不是一个用户友好的解决方案。

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

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

2 个答案:

答案 0 :(得分:5)

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

您可以使用纯Javascript + Web Crypto API进行签名。

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

如果您使用独占规范化签署xmls,请使用deoxxa(您应该在使用前对其进行浏览)。如果您签署xml并需要进行包容性规范化,请使用my fork of deoxxa(托管在自己的gitlab服务器上)。我太懒了,无法重命名为包容性,但我的.js文件执行包容性,请相信我)forge中的使用示例deoxxa + html5_p12_file_read + # define SDL_MAIN_HANDLED // somehow it want it to not define its own main #include <iostream> #include <sdl2/SDL.h> using namespace std; int main( int argc, char* argv[] ) { SDL_SetMainReady(); // just for check return 0; }

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

答案 1 :(得分:0)

对此问题的一些答案/评论期望WebCrypto API提供对本地证书存储的访问(在2016年),但WebCrypto API不提供对本地证书存储的访问。

因此,在当前情况下,最好的选择是使用Chrome Extension Digital Signature from Browser或任何其他可用的Browser Extension进行数字签名。上面的链接页面还指向3个不同的Stacks Overflow答案,以实现不同的签名任务和方案以及JavaScript源代码。