使用纯 JavaScript 签署 PDF
挑战:
使用 WebCrypto API 对 PDF 文档进行数字签名提出了挑战,因为当前的 API 不允许直接访问密钥存储或本地加密
解决方案:
要规避此限制,建议:
-
创建 PDF 的哈希: 生成 PDF 文件的哈希值,而不是将整个文档发送到浏览器。
-
利用浏览器扩展: 安装浏览器扩展,例如 Signer.Digital 来访问本地密钥库(例如 Windows 证书库或 Linux 上的 PKCS#11) ).
-
签署哈希:使用扩展程序的 API使用从本地密钥库获取的私钥对散列 PDF 进行签名。
-
接收签名:浏览器扩展将以合适的格式返回签名(例如 PKCS7)。
-
将签名插入 PDF: 在服务器端,使用适当的库(或由Signer.Digital)将签名重新注入到原始 PDF 文件中。
Signer.Digital 扩展:
Signer.Digital 浏览器扩展提供了必要的执行签名过程的功能为如下:
-
函数: SignerDigital.signPdfHash(hash, certThumbPrint, hashingAlgo)
-
参数:
- 哈希: Base64 编码字符串中 PDF 的哈希值
- certThumbPrint:用于签名的证书指纹
- hashingAlgo:用于对 PDF 进行哈希处理的算法(例如, "SHA256")
示例:
// Assuming hash is a Base64-encoded PDF hash
SignerDigital.signPdfHash(hash, $("#CertThumbPrint").val(), "SHA-256")
.then(
function (signDataResp) {
// Send signDataResp (contains Base64 PKCS7 signature) to server
},
function (errmsg) {
// Handle error
}
);
登录后复制
注:
- 私钥存储在本地的证书设置中浏览器。
- 将来,随着 WebCrypto API 的进步,直接访问密钥存储可能成为可能,从而无需浏览器扩展。
以上是如何在没有直接密钥访问的情况下使用 JavaScript 对 PDF 进行数字签名?的详细内容。更多信息请关注PHP中文网其他相关文章!