Jas*_*son 5 javascript pkcs#11
我已经在几个兔子洞里寻找答案。
我有一个用 AngularJS 编写的 Web 应用程序,它目前需要 IE11 和 Acrobat 插件才能对 PDF 表单进行数字签名。但是,该插件在 IE11 上是垃圾,不支持现代浏览器(我定义为 Firefox、Chrome 和 Edge。我的公司不支持 Safari。)
因为该应用程序是 AngularJS(而不是在 Node 上运行),所以我需要一个 javascript 解决方案来签署 PDF。不仅如此,签名证书还保存在智能卡上,这意味着我需要一个可以通过某种 PKCS#11 接口访问证书的加密库。在 JavaScript 中。客户目前不接受在 Acrobat 中从外部打开表单。
我查看了多个图书馆,但无法找出一个直接的答案:
这些软件包都没有提供足够的信息让我知道是否进一步研究它们。
任何人都可以向我提供进一步的信息或方向吗?
谢谢,杰森
此答案旨在解决方法,而不是实际答案。
这是因为浏览器中目前没有API可以用来获取智能卡证书的私钥并使用它。据我所知,这已经在 Web Crypto API 中进行了讨论 - 共识是出于安全原因不应支持这一点(我强烈不同意!)。
您,以及成百上千的其他开发人员(包括我们),运气不好。
第一个解决方法涉及部署在服务器上并从服务器运行的 .NET ClickOnce 桌面应用程序。应用程序在运行时参数中获取当前用户会话的安全上下文,以便在浏览器和在浏览器旁边运行的应用程序之间共享会话。从这个意义上说,独立运行此应用程序(在浏览器中没有会话)会在与服务器通信期间导致授权问题。
该应用程序使用服务器的 API 首先检索用户即将签名的文档。然后应用程序不受限制地使用本地证书存储(因为它是常规桌面应用程序),加密文档并将其发送回服务器。
优点: ClickOnce 应用程序可以从浏览器内调用。
缺点:这需要客户端有 .NET 运行时。
第二种解决方法涉及在客户端计算机上独立安装的 Java 桌面应用程序。您为选定的操作系统(例如 Windows、Linux、MacOS)提供安装包,用户下载安装包并在其操作系统中安装应用程序。
然后,当浏览器应该签署文档时,您提供一条指令,告诉用户在后台运行应用程序。该应用程序在运行时会在本地主机和固定端口上公开一个 HTTP 侦听器,并提供两个服务
正如您所猜测的,是浏览器发出请求,浏览器向推送服务发出请求localhost:port并将文档数据上传到推送服务。Java 应用程序从等待文档状态切换到签署文档状态。用户应该使用该应用程序 - 从商店中选择一个证书(没有限制,因为它是常规的 Java 桌面应用程序)并签署文档。您的浏览器在后台ping应用程序的拉取服务,当数据准备好后,浏览器就会下载它。然后,浏览器使用实际的经过身份验证的会话将签名的文档上传到实际的服务器。
这里存在一个潜在的安全漏洞,因为任何本地应用程序或任何打开的网页都可以 ping 拉取服务并下载文档(这当然是您不希望的)。我们知道对此有两个修复。
首先,您可以在 Java 应用程序中使用另一个服务,该服务返回一次性身份验证令牌(例如 guid),该令牌将被读取一次,然后在每次调用拉取服务时作为身份验证令牌提供。如果任何其他恶意应用程序或网页在您的应用程序网页之前读取令牌,您的页面将从拉取服务中收到错误(因为一次性令牌显然已被盗并且不可用)。该网页可能会在此处发出通信错误信号,并警告用户潜在的安全问题。
修复该漏洞的第二种方法涉及应用程序服务器提供的拉取服务调用的参数,并将其作为值(由服务器证书签名的令牌)放入页面的脚本中。您的 Java 应用程序可以拥有服务器证书的公钥,以便 Java 应用程序能够验证参数的签名。但是没有其他应用程序(也没有其他页面)能够伪造令牌(因为令牌签名的私钥仅在您的服务器上可用),并且没有简单的方法可以从页面主体窃取有效令牌。
优点:Java 应用程序可能会针对多个操作系统 缺点:这仍然需要客户端的 Java 运行时
这两种解决方法都在生产中进行了测试,并且多年来都运行良好。我希望这能为您的最终解决方案提供一个可能的方向。
| 归档时间: |
|
| 查看次数: |
4436 次 |
| 最近记录: |