目前我们开发了一个可以使用java applet对文档进行数字签名的系统。然而,由于禁止使用chrome,我们正在寻找替代的数字签名解决方案。
目前,签署的工作方式如下:
一种替代解决方案是在浏览器中导入证书并使用js进行签名。但这不是一个用户友好的解决方案。
另一种解决方案可能是要求用户使用JNLP下载运行程序,该程序下载并签署文档并使用HTTP多部分POST自动上传。这种方法的缺点是它需要额外的用户交互(下载操作),我们丢失浏览器http会话,所以我们必须再次进行身份验证。
哪个更可行?你能想到另类吗?
答案 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源代码。