是否有一种仅使用JavaScript和WebCrypto API对PDF进行签名的方法?私钥可以在
<textarea>
中输入,或更好的方法是在浏览器的证书设置中存储。Base64 PDF (from REST API) → 使用JS和证书进行签名 → Signed Base64 PDF (发送到REST)
[1] https://github.com/diafygi/webcrypto-examples [2] https://pkijs.org/
<textarea>
中输入,或更好的方法是在浏览器的证书设置中存储。声明:我在CISPL工作。
目前,WebCrypto API无法访问(Windows)或任何其他密钥存储或本地加密USB /智能卡设备。
此外,在大多数签名方案中,为了保护服务器边界内的PDF文件的要求,不建议将完整的PDF文件发送到浏览器或签名API服务器。
因此,最好的做法是创建PDF的哈希值进行签名,将哈希值发送到浏览器,并通过浏览器扩展使用JavaScript访问运行在本地系统上的某个应用程序来访问本地密钥库(或USB /智能卡)并生成签名,然后将签名发送回服务器(PDF签名的PKCS7或CMS容器),其中签名可以被注入回从中创建哈希的PDF,该哈希已经被发送到浏览器或签名api服务器。
对于基于浏览器的签名场景,我的公司提供了一个免费的浏览器扩展程序Signer.Digital和服务器所需的.NET库。本地系统(在Windows上在Chrome浏览器后面运行的主机)可以从cNET下载站下载。安装此主机并重新启动Chrome将自动添加Signer.Digital Chrome扩展程序和/或Signer.Digital Firefox扩展程序。
该扩展程序的实际工作过程在此处进行说明,包括完整的代码演示和可工作的示例VS 2015项目源代码的下载链接。
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.
}
);
2022年7月:新增方法signCAdESBr,以ICP-Brazil标准签署PDF或内容,以及方法signCAdESEg,以Egypt ITIDA CAdES-BES标准签署。
您可以使用 openpgp.js 对任何文件(包括 PDF)进行签名
https://openpgpjs.org/openpgpjs/doc/#create-and-verify-detached-signatures
(向下滚动至“创建和验证分离签名”)
将文件读取为Uint8Array,并使用您的私钥对其进行签名。