披露:我为 CISPL 工作。
截至目前,WebCrypto API 不提供对 (Windows) 或任何其他密钥库或本地加密 USB/智能卡设备的访问。
同样在大多数签名场景中,为了保护服务器边界内的 pdf 文件,不建议将完整的 pdf 文件发送到浏览器或签名 API 服务器。
因此,它的良好做法是创建用于签名的 PDF 哈希值,将哈希值发送到浏览器并通过浏览器扩展使用 javascript 来访问在本地系统上运行的某些应用程序以访问本地密钥库(或 USB/智能卡)并生成签名并发回( PKCS7 或 CMS 容器(在 PDF 签名的情况下)到服务器,其中签名可以注入回 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"
.then(
function (signDataResp) {
//Send signDataResp to Server
},
function (errmsg) {
//Send errmsg to server or display the result in browser.
}
);
如果成功,则返回 Base64 编码的 pkcs7 签名 - 使用合适的库或 Signer.Digital 提供的库将签名注入 pdf
如果失败,则返回以“SDHost 错误”开头的错误信息:
来自浏览器的数字签名
- 服务器向浏览器发送要签名的数据/文档/内容的哈希值。
- 浏览器使用 Signer.Digital 浏览器扩展 Javascript API 来调用来自 Signer.Digital 浏览器扩展主机的操作。
- 在 Windows 上,浏览器扩展主机使用 Microsoft 证书存储和底层 CSP 来获得哈希签名。
- 在 Linux 上,浏览器扩展主机使用 Crypto Device 的 PKCS#11 .SO 库来获得哈希签名。
- 原始签名(哈希签名)或签名容器由 Signer.Digital Browser EXtension Host 返回到浏览器。
- 如果是加密设备,即。USB 令牌或智能卡,用户的私钥永远不会从设备中出来,但要签名的哈希值会发送到设备以使其签名。
- Web 应用程序(浏览器中的 Javascript)将签名发送回服务器,并且可以在 PDF 文档、XML 或 Json 中或根据需要修改相同的签名。