PDF在线数字签名

时间:2017-02-23 21:04:44

标签: javascript java web-applications digital-signature

我们正在构建一个Java网站,以便与用户共享文档。

一旦用户访问他的文档,他就可以使用他的证书对其进行数字签名(它存储在客户端)。

要求是在文件列表上带有“签名按钮”的在线标志。

我们研究了完成要求的方法,但显然,如果不使用Java Applet或包含用户证书的安全服务器,就没有办法做到这一点。

我们知道在独立的Java应用程序上使用Itext的其他解决方案,但这不是在线解决方案。

问题是:

有没有办法访问用户的密钥库,或者在签名过程中从文件系统加载证书而不使用applet?

谢谢和问候。

3 个答案:

答案 0 :(得分:1)

由于安全限制,无法使用javascript在系统/浏览器密钥库上安装证书

另一种解决方案是在客户端上安装带有嵌入式Web服务器的应用程序,并在此时从网页发送文档进行签名。此应用程序可以使用密钥库并包含itext库。

如果用户有证书文件(.p12 / .pfx),则可以使用WebCryptographyApi加载内容并在客户端签名文档(无需将证书上传到服务器。请参阅{{3 }}

答案 1 :(得分:0)

@pedrofb是对的,如果没有插件的帮助,您将无法访问主机上的证书存储区。

您可以在浏览器中使用带有PKIjs等库的WebCrypto将密钥加载到浏览器中并使用它进行签名,您也可以根据需要验证PDF签名。以下是一些相关的例子:

您可以查看https://hwcrypto.github.io/进行讨论,以及在浏览器中访问智能卡的插件。

答案 2 :(得分:0)

现代浏览器不支持applet。对于基于浏览器的签名方案,我公司已发布了免费的Chrome扩展程序Signer。可以使用链接https://download.cnet.com/Signer-Digital-Chrome-Extension/3000-33362_4-78042540.html从cNet下载数字和设置。 安装此主机并重新启动Chrome会自动添加Signer.Digital Chrome Extension

从扩展名调用方法的JavaScript

    //Calculate Sign for the Hash by Calling function from Extension SignerDigital
    SignerDigital.signPdfHash(hash, $("#CertThumbPrint").val(), "SHA-256")      //or "SHA256"
     .then(
            function (signDataResp) {
              //Send signDataResp to Server
        },
            function (errmsg) {
                //Send errmsg to server or display the result in browser.
              }
     );

如果失败,则返回错误消息,以“ SDHost错误:”开头

如果成功,则返回Base64编码的pkcs7签名-如您所说,请使用iText或任何合适的库将符号注入pdf。