PDF在线数字签名

PDF online digital signature

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

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

要求是在文档列表上有一个带有“签名按钮”的在线签名。

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

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

问题是:

有没有办法在不使用小程序的情况下访问用户的密钥库或从文件系统加载证书?

感谢和问候。

由于安全限制

,无法通过 javascript 使用安装在 system/browser 密钥库上的证书

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

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

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

您可以在浏览器中将 WebCrypto 与 PKIjs 等库一起使用,将密钥加载到浏览器中并使用它进行签名,如果您愿意,还可以验证 PDF 签名。以下是一些相关示例:

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

现代浏览器不支持小程序。对于基于浏览器的签名方案,我的公司发布了免费的 Chrome 扩展 Signer.Digital 并且可以使用 link 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.
              }
     );

如果失败,returns 错误消息以 "SDHost Error:"

开头

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

披露:我为 CISPL 工作 (Signer.Digital)