2009-01-07 44 views
1

我的公司有一個網絡文檔管理應用程序,我已被分配到找到一種方法來簽署用戶數字證書的PDF文件。Digitally sign pdfs

PDF文件可以從幾KB去到100MB,這是在互聯網上,從而在Web服務器簽名必須發生。

爲了做到這一點,我構建了一個ActiveX控件,要求用戶選擇證書,然後使用WebClient.UploadData將該證書作爲字節數組發送到網頁。

在網頁上,當我試圖簽署PDF文件我收到錯誤「密鑰不存在」。這對我來說並不奇怪,因爲當我選擇正確的證書後,我通過https連接直接使用證書時,我會提示輸入密鑰。這在activeX中沒有發生。

這是怎麼了我是從用戶獲取證書:

private static X509Certificate2 PickCertificate() 
     { 
      X509Store store = new X509Store(StoreName.My, StoreLocation.CurrentUser); 
      try 
      { 
       store.Open(OpenFlags.ReadOnly); 

       // pick a certificate from the store 
       X509Certificate2 cert = X509Certificate2UI.SelectFromCollection(store.Certificates, "Title", "Message", X509SelectionFlag.SingleSelection)[0]; 

       // show certificate details dialog 
       X509Certificate2UI.DisplayCertificate(cert); 
       store.Close(); 
       return cert; 
      } 
      finally { store.Close(); } 
     } 

我怎麼能要求用戶提供我丟失的鑰匙嗎?

回答

4

您希望用戶將其證書的私鑰上傳到網絡服務器,以便它可以簽署PDF文件?如果是這樣,從安全角度來看,這基本上是打破了。

我想你可能已經錯過了公共證書!=私鑰這一點。 (我們大多數人都很sl and,用「證書」這個詞來指代這些事情(或兩者),所以這並不是完全令人驚訝的)。從內存開始,CryptoAPI只有一組選擇的方法可以讓你訪問密鑰。在這些方法中必須有一個「以PFX方式導出」的方法,所以如果你真的想要,你可以讓你的設計工作,但是我沒有辦法推薦這個方法。 (將私鑰發送給Web服務器的風險,不可否認性的破壞等等)。

如果你真的必須在服務器上做簽名[我真的不明白你的論點,簽名不應該給上傳添加太多數據],那麼你應該考慮一個多層架構和一個密鑰託管機制。這樣你至少可以減少一些安全問題(但是你仍然會失去不可否認性......並引入其他風險,這裏沒有免費的午餐)。

因此......您可能需要考慮重新設計您的應用程序,以便在PDF文件上傳之前在客戶端(在您的ActiveX控件中)發生PDF簽名。我想象你需要一個第三方庫進行簽名步驟,如this SO thread中所述。

+0

以前的版本在客戶端使用pdf簽名。當您想要簽署100Mb文件時,這是一個問題,因爲您必須通過網絡上傳文件。試想一下,如果不上15kb /秒的上傳連接,它會怎樣? – Sergio 2009-01-07 12:23:30