目前我们已经开发了一个可以使用java applet 对文档进行数字签名的系统。然而,随着 Chrome 下小程序的禁令,我们正在寻找数字签名的替代解决方案。
目前签名的工作方式如下:
- HTTP GET 被发送到 servlet 以获取要发送的文档
已签署;
- 小程序启动,从文件系统中提取数字签名驱动程序,然后用户输入 PIN;
- 小程序获取证书链,检查 CRL/OCSP 并签署文档;
- 小程序将带有已签名文件的多部分帖子发送到系统中的 servlet。
一种替代解决方案是在浏览器中导入证书并使用 js 进行签名。但这不是一个用户友好的解决方案。
另一种解决方案可能是要求用户下载一个使用 JNLP 运行的程序,该程序下载并签署文档,并使用 HTTP 多部分 POST 自动上传该文档。这种方法的缺点是它需要额外的用户交互(下载操作),并且我们会丢失浏览器 http 会话,因此我们必须再次进行身份验证。
哪个更有生命力?你能想到替代方案吗?
下面的所有帖子都建议基于 RSA 的签名。
您可以在纯 Javascript Web Crypto api 中对其进行签名。
重点是用HTML5提取密钥<file>
标记、使用forge https://github.com/digitalbazaar/forgejs 库来处理键和哈希并规范化 xmldeoxxa https://github.com/deoxxa/xml-c14n并使用网络加密进行签名/验证(此外,forge也可以签名/验证,但网络加密更快)。
如果您使用独占规范化对 xml 进行签名,请使用 deoxxa(您应该在使用之前对其进行浏览器化)。如果您签署 xml 并需要进行包容性规范化使用我的 deoxxa 叉子 http://git.nitec.kz/baurzhansahariev/ESign/blob/webcrypto/content/src/main/webapp/xml/xml-c14n.js(托管在自己的 gitlab 服务器上)。我懒得将排他性重命名为包容性,但我的 .js 文件执行包容性,相信我)使用示例forge
+deoxxa
+html5_p12_file_read
in SignJs、verifyJs 文件 http://git.nitec.kz/baurzhansahariev/ESign/tree/webcrypto/esign/src/main/webapp/WEB-INF/view.
另外,Forge 支持签署二进制文件(CMS 或较旧的命名风格 PKCS#7),但我的 JSP 文件没有这样的示例。关于JS中的OCSP和链测试-I打开问题 https://github.com/digitalbazaar/forge/issues/264在forge中,但在JS中处理CRL/OCSP和TSP协议似乎太难了,这就是为什么你可以登录JS,但验证可能会被分割 - 哈希检查在JS中进行(forge用法和附加代码显示在我的JSP中)但是像 CRL、链等在您的 Web 服务中执行的智能检查 - 您可以提取 X509Certificate 并将其发送到您的 Web 服务,并使用 bouncycastle 或任何其他很酷的库来执行智能检查。 X509Certificate 无论如何都是公共信息,将其发送到服务没有问题,但是摘要检查需要文件,并且您可能不想将文件发送到服务,因此使用 forge 来检查我的 verifyJS 文件中显示的摘要。
我的 JS 代码没有重构,甚至没有在 OOP 中,目前我没有参与该项目,但在某些阶段我已经使用文件系统中的 p12 密钥完全运行了 xml RSA 签名。
我的存储库中的最新 JSP 仅使用 forge 来解析 p12 文件并将它们的密钥提供给 Web Crypto API,但我的存储库历史记录也有纯 Javascript 签名/验证(如果您不喜欢 Web Crypto api)。查看项目分支的历史记录。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)