我在几个兔子洞里找了个答案。
我有一个用AngularJS编写的web应用程序,目前需要IE11和Acrobat插件对PDF表单进行数字签名。但是,这个插件在IE11上是垃圾,在现代浏览器中不支持(我把它定义为火狐、Chrome和Edge )。我的公司将不支持Safari。)
因为应用程序是AngularJS (而不是在Node上运行),所以我需要一个javascript解决方案来签署PDF。不仅如此,签名证书还保存在智能卡上,这意味着我需要一个可以通过某种PKCS#11接口访问证书的密码库。在Javascript里。客户目前无法接受在Acrobat外部打开表单。
我看过多个库,却找不到一个直接的答案:
这些软件包都没有提供足够的信息给我,让我知道是否要进一步研究。
有谁能为我提供进一步的信息或方向吗?
谢谢,杰森
发布于 2019-04-29 12:13:18
这个答案的目的是解决问题,而不是实际的答案。
这是因为浏览器中没有 API,此时您可以使用获取智能卡证书的私钥并使用它。据推测,这在Web中已经讨论过了,据我所知--大家的共识是,出于安全原因,不应该支持这一点(我不同意!)
你,作为数百或数以千计的其他开发人员(包括我们),是不走运的。
的第一个解决方案涉及部署在服务器上并在服务器上运行的.NET ClickOnce桌面应用程序。应用程序在运行时参数中获取当前用户会话的安全上下文,以便在浏览器和在浏览器旁边运行的应用程序之间共享会话。从这个意义上说,独立运行这个应用程序(在浏览器中没有会话)将在与服务器的通信过程中引起授权问题。
该应用程序首先使用服务器的app检索用户即将签名的文档。然后,应用程序不受任何限制地使用本地证书存储(因为它是一个普通的桌面应用程序),对文档进行加密并将其发送回服务器。
Pros:可以在浏览器中调用 ClickOnce应用程序。
Cons: --这需要客户机上的.NET运行时。
的第二个解决方案涉及到一个在客户端机器上独立安装的Java桌面应用程序。您为选定的OSes (例如Windows、MacOS)提供安装包,用户下载安装包并在他们的操作系统中安装应用程序。
然后,当浏览器应该在文档上签名时,您提供了一条指令,指示用户在后台运行应用程序。该应用程序运行时,在本地主机上公开一个HTTP侦听器,并使用两个服务固定端口
正如您猜测的那样,是浏览器执行请求,浏览器向localhost:port发出请求并将文档数据上载到push服务。Java应用程序从等待文档切换到签署文档状态。用户应该使用应用程序-从商店中挑选一个证书(没有限制,因为这是一个普通的Java桌面应用程序)并在文档上签名。你的浏览器在后台点击应用程序的拉式服务,当数据准备好后,浏览器下载它。然后,浏览器使用实际的经过身份验证的会话将签名的文档上载到实际的服务器。
这里有一个潜在的安全漏洞,因为任何本地应用程序或任何打开的网页都可以平拉服务并下载文档(当然,这是您不想要的)。我们知道对此有两种解决办法。
首先,您可以在Java应用程序中提供另一个服务,该服务返回一个一次性身份验证令牌(例如,guid ),该令牌意味着要读取一次,然后将每个调用都作为身份验证令牌提供给pull服务。如果有任何其他恶意应用程序或网页在您的应用程序网页之前读取令牌,您的页面将从拉服务中获得错误(因为一次性令牌显然已被窃取,并且不可用)。该网页可能在此发出通信错误的信号,并警告用户潜在的安全问题。
第二种修复漏洞的方法涉及由应用服务器提供并将页面的脚本作为值(由服务器的证书签名的令牌)的拉服务调用的参数。您的Java应用程序可以拥有服务器证书的公钥,以便Java应用程序能够验证参数的签名。但是没有其他应用程序(也没有其他页面)能够伪造令牌(因为令牌的签名私钥只能在您的服务器上使用),也没有从页面正文中窃取有效令牌的简单方法。
优点: Java应用程序可能针对多个OSes Cons:这仍然需要客户端的Java运行时
这两种解决办法都在生产中进行了测试,而且两种方法多年来都运行良好。我希望这给你一个可能的方向,你的最终解决方案可以基于。
发布于 2019-05-18 00:06:03
@Json,你说“这不是我想听到的,但我会接受你的回答。”!!
我建议使用浏览器扩展来对pdf、文件或现代浏览器中的任何东西进行数字签名。浏览器扩展将在浏览器提供JavaScript到浏览器之间插入,连接到本地运行的扩展主机(应用程序)和访问CertStore。
我们公司已经发布了一个这样的扩展,并且是免费的,它使用的是.NET框架3.5,它通常可以在所有的Windows上使用。它不使用PKCS#11,只需消除提供PKCS#11驱动程序等的需求,只需在安装成功后透明地工作。它使用Windows CertStore。
根据您的评论,您有更多运行firefox的客户端,但我们正在开发Edge和Firefox扩展。
安装程序(运行在windows上的chrome浏览器后面)可以从4-78042540.html下载,安装此主机,重新启动Chrome将自动添加Signer.Digital Chrome扩展
这个扩展的实际工作说明了这里。
从扩展调用方法的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签名--如果失败,请使用任何合适的库将符号注入pdf,返回以"SDHost错误:“开头的错误消息。
我希望这能帮到你!
发布于 2021-02-03 22:53:54
自2016年以来,我一直在寻找这样的东西。在巴西,我们有Lacuna软件,WEBPKI,但它必须昂贵。
我昨天发现了这个:https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/pkcs11
https://stackoverflow.com/questions/55902007
复制相似问题