簡體   English   中英

在現代 Firefox/Chrome/Edge 瀏覽器中對 PDF 進行數字簽名

[英]Digitally Signing a PDF in Modern Firefox/Chrome/Edge Browsers

我已經在幾個兔子洞里尋找答案。

我有一個用 AngularJS 編寫的 Web 應用程序,它目前需要 IE11 和 Acrobat 插件才能對 PDF 表單進行數字簽名。 但是,該插件在 IE11 上是垃圾,不支持現代瀏覽器(我定義為 Firefox、Chrome 和 Edge。我的公司不支持 Safari。)

因為該應用程序是 AngularJS(而不是在 Node 上運行),所以我需要一個 javascript 解決方案來簽署 PDF。 不僅如此,簽名證書還保存在智能卡上,這意味着我需要一個可以通過某種 PKCS#11 接口訪問證書的加密庫。 在 JavaScript 中。 客戶目前不接受在 Acrobat 中從外部打開表單。

我查看了多個圖書館,但無法找出一個直接的答案:

  • PKI.js
  • pkcs11.js
  • hwcrypto.js
  • 石墨烯.js

這些軟件包都沒有提供足夠的信息讓我知道是否進一步研究它們。

任何人都可以向我提供進一步的信息或方向嗎?

謝謝,傑森

此答案旨在解決方法,而不是實際答案。

這是因為目前瀏覽器中沒有 API可以用來獲取智能卡證書的私鑰並使用它。 據推測,這已經在 Web Crypto API 中討論過,據我所知 - 共識是出於安全原因不應該支持這(我非常不同意!)。

作為成百上千的其他開發人員(包括我們),您很不走運。

第一個解決方法涉及部署在服務器上並從服務器運行的 .NET ClickOnce 桌面應用程序。 應用程序在運行時參數中獲取當前用戶會話的安全上下文,以便在瀏覽器和在瀏覽器旁邊運行的應用程序之間共享會話。 從這個意義上說,獨立運行這個應用程序(沒有瀏覽器中的會話)會在與服務器通信期間導致授權問題。

該應用程序使用服務器的 API 來首先檢索用戶即將簽署的文檔。 然后應用程序不受限制地使用本地證書存儲(因為它是常規桌面應用程序),加密文檔並將其發送回服務器。

優點:可以從瀏覽器中調用 ClickOnce 應用程序。

缺點:這需要客戶端的 .NET 運行時。

第二種解決方法涉及獨立安裝在客戶端計算機上的 Java 桌面應用程序。 您為選定的操作系統(例如 Windows、Linux、MacOS)提供安裝包,用戶下載安裝包並在他們的操作系統中安裝應用程序。

然后,當瀏覽器應該簽署文檔時,您提供一個指令,告訴用戶在后台運行應用程序。 該應用程序在運行時會在本地主機和具有兩個服務的固定端口上公開一個 HTTP 偵聽器

  • 接受要簽名的文檔數據的推送服務
  • 在可用時公開簽名文檔的拉取服務

正如您猜測的那樣,是瀏覽器發出請求,瀏覽器向localhost:port發出請求並將文檔數據上傳到推送服務。 Java 應用程序從等待文檔切換到簽署文檔狀態。 用戶應該使用該應用程序 - 從商店中選擇一個證書(沒有限制,因為它是一個常規的 Java 桌面應用程序)並簽署文檔。 您的瀏覽器在后台ping應用程序的拉取服務,當數據准備就緒時,瀏覽器會下載它。 然后,瀏覽器使用實際經過身份驗證的會話將簽名文檔上傳到實際服務器。

這里有一個潛在的安全漏洞,因為任何本地應用程序或任何打開的網頁都可以 ping 拉服務並下載文檔(這當然是您不想要的)。 我們知道有兩個修復方法。

首先,您可以在 Java 應用程序中擁有另一個服務,該服務返回一次性身份驗證令牌(例如 guid),該令牌旨在讀取一次,然后在每次調用 pull 服務時作為身份驗證令牌提供。 如果任何其他惡意應用程序或網頁您的應用程序網頁之前讀取令牌,您的頁面將從拉取服務中獲取錯誤(因為一次性令牌顯然已被盜且不可用)。 該網頁可能會在此處發出通信錯誤信號,並警告用戶存在潛在的安全問題。

修復漏洞的第二種方法涉及到拉取服務調用的參數,該參數由應用服務器提供並作為值放入頁面腳本中,該值是由服務器證書簽名的令牌。 您的 Java 應用程序可以擁有服務器證書的公鑰,以便 Java 應用程序能夠驗證參數的簽名。 但是沒有其他應用程序(也沒有其他頁面)能夠偽造令牌(因為令牌簽名的私鑰僅在您的服務器上可用)並且沒有簡單的方法可以從頁面正文中竊取有效令牌。

優點:Java 應用程序可能針對多個操作系統 缺點:這仍然需要客戶端的 Java 運行時

這兩種解決方法都在生產中進行了測試,並且都運行良好多年。 我希望這能給你一個可能的方向,你的最終解決方案可以基於。

@Json,你說“這不是我想聽到的,但我會接受你的回答。” !!

我建議使用瀏覽器擴展對 pdf、文件或現代瀏覽器中的任何內容進行數字簽名。 瀏覽器擴展將在提供 JavaScript 的瀏覽器與連接到本地運行的擴展主機(應用程序)並訪問 CertStore 的瀏覽器之間插入。

我們公司發布了一個這樣的擴展並且是免費的,它使用 .NET 框架 3.5,它通常在所有 Windows 客戶端上可用。 它不使用 PKCS#11,只是消除了提供 PKCS#11 驅動程序等的需要,並且一旦安裝成功就可以透明地工作。 它使用 Windows CertStore。

根據您的評論,您有更多客戶端運行 Firefox,但我們正在開發 Edge 和 Firefox 擴展。

可以從https://download.cnet.com/Signer-Digital-Chrome-Extension/3000-33362_4-78042540.html下載安裝(在 Windows 上的 chrome 瀏覽器后面運行的主機應用程序)安裝此主機並重新啟動 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 錯誤”開頭的錯誤消息:

我希望這有幫助!

自 2016 年以來,我一直在尋找類似的東西。在巴西,我們有 Lacuna Software WEBPKI,但它一定很貴。

我昨天發現了這個: https : //developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/pkcs11

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM