使用 JavaScript 和 WebCrypto API 签署 PDF
WebCrypto API 的发展及其在 Chrome 和 Firefox 等主要浏览器中的支持增加了可能性利用它进行数字 PDF 签名。然而,缺乏文档和详细示例带来了挑战。虽然有解释签名过程的示例,但期望的结果 - 签名的 Base64 PDF 字符串 - 仍然难以捉摸。
我们可以单独使用 JavaScript 和 WebCrypto API 对 PDF 进行签名吗?
目前,WebCrypto API 无法访问密钥存储或外部加密设备。为了满足常见的 PDF 签名要求(其中 PDF 应在服务器边界内受到保护),不鼓励将整个文档发送到浏览器或签名 API 服务器。
最佳方法
有效的解决方案包括创建 PDF 的哈希值以进行签名,将该哈希值发送到浏览器,并通过浏览器扩展利用 JavaScript 访问本地密钥库(或 USB/智能卡)以生成签名。生成的签名(例如 PKCS7 或 CMS 容器)可以发送回服务器,在服务器中可以将其注入到创建哈希的原始 PDF 中。
Signer.Digital Extension for Browser扩展
为了促进基于浏览器的签名方案,可以使用名为 Signer.Digital 的浏览器扩展和随附的 .NET 库。该扩展程序可与主要浏览器(Chrome 和 Firefox)无缝协作,利用 Signer.Digital Browser Host 与 Windows 证书存储和底层 CSP 交互以签署哈希值。
JavaScript 代码示例
要从扩展调用签名功能,可以使用 JavaScript 代码如下:
// Calculate Sign for the Hash by Calling function from Extension SignerDigital SignerDigital.signPdfHash(hash, $("#CertThumbPrint").val(), "SHA-256") // or "SHA256" // SignerDigitial.signHashCAdESBr method may be used for producing ICP-Brazil Signature .then( function (signDataResp) { // Send signDataResp to Server }, function (errmsg) { // Send errmsg to server or display the result in browser. } );
图:从浏览器进行数字签名
[从浏览器进行数字签名的图像]
以上是JavaScript 和 WebCrypto API 可以单独签署 PDF 吗?的详细内容。更多信息请关注PHP中文网其他相关文章!