2017-07-10 30 views
2

我們有修改PDF然後數字簽名修改過的PDF的代碼。我們使用iTextSharp庫的LGPL版本(4.1.6)對PDF進行數字簽名。生成的簽名PDF會導致Adobe Reader崩潰但沒有其他PDF閱讀器

public static Stream DigitallyCertifyPdfStream(Stream uncertifiedFileStream, CertificationBundle certificationBundle) 
{ 
    using (var memoryStream = new MemoryStream()) 
    { 
     var pdfReader = new PdfReader(uncertifiedFileStream); 
     var signatureStamper = PdfStamper.CreateSignature(pdfReader, memoryStream, '\0', null); 
     signatureStamper.SetEncryption(null, Encoding.UTF8.GetBytes(certificationBundle.Password), PdfWriter.ALLOW_PRINTING | PdfWriter.ALLOW_MODIFY_ANNOTATIONS, PdfWriter.STANDARD_ENCRYPTION_128); 

     var signatureAppearance = signatureStamper.SignatureAppearance; 
     signatureAppearance.Reason = "Approval of design"; 
     signatureAppearance.Location = ""; 

     var privateKey = certificationBundle.PrivateKey; 
     var signingCertificates = new[] { certificationBundle.Certificate }; 
     signatureAppearance.SetCrypto(privateKey, signingCertificates, null, PdfSignatureAppearance.WINCER_SIGNED); 

     pdfReader.Close(); 
     signatureStamper.Close(); 

     return new MemoryStream(memoryStream.ToArray()); 
    } 
} 

下面是一個示例PDF,它展示了這個問題。 PDF將首先打開,但然後凍結,無法導航。無論您是否有我們的證書來驗證安裝的簽名,問題似乎都會發生。

此問題似乎並不一致,並且問題僅在Adobe Reader中存在。瀏覽器PDF閱讀器和福昕閱讀器(它的簽名驗證)處理它就好了。有時會出現一個錯誤框,表示「打開流時出錯」。

的另外的興趣,對已通過與此相同的數字簽名歷程的PDF文件,我們已經觀察到外觀完整性報告

Adobe Appearance Integrity Report

目前,我們是不確定的,如果這些都涉及到以下問題。我提到他們是因爲他們可能是相關的。

問題是,爲什麼數字簽名的PDF會使Adobe Reader崩潰,我們該如何解決它?

+0

我希望簽名應用程序的用戶知道您正在創建的簽名已被棄用(不再在PDF 2.0中有效)並且不安全。您創建不安全簽名的用例是什麼? –

+0

欲瞭解更多信息:http://itextpdf.com/blog/are-pdf-signatures-shattered(您正在使用SHA-1)。擁有某種處理能力的任何人都可以在不破壞簽名的情況下更改PDF –

+0

@BrunoLowagie那麼iTextSharp的LGPL版本不能創建安全簽名是真的嗎?我在加密算法中看到的選項是'PdfWriter.STANDARD_ENCRYPTION_128','PdfWriter.ENCRYPTION_AES_128'和'PdfWriter.STANDARD_ENCRYPTION_40'。目前的iTextSharp發行版使用什麼加密算法? –

回答

3

你的PDF文件包含一個斷開的圖像:

16 0 obj 
<</Type/XObject/BitsPerComponent 8/Interpolate true/Width 736/ColorSpace/DeviceRGB/Filter/DCTDecode/Length 0/Height 1242/Subtype/Image>>stream 

endstream 
endobj 

這個影像x對象聲稱包含的RGB位圖圖像(736x1242,24位),並在同一時間是空的(長度 0)。如果遇到這種缺少的數據,PDF查看器可能會失敗(儘管Adobe Reader鎖定一段時間令人印象深刻......)。

請檢查您的源PDF中的流是否已損壞。


一個問題的方式:

pdfReader.Close(); 
    signatureStamper.Close(); 

您關閉壓模之前關閉的讀者。由於壓模可能需要在關閉過程中訪問讀者,這是一個壞主意。只需切換Close調用的順序。


順便問一下,你的代碼產生adbe.pkcs7.sha1簽名。這在安全方面是一個糟糕的想法,因爲無論您使用哪種安全算法簽名,此機制都將SHA1用於第一個文檔散列,否則SHA1通常不再被認爲是安全的。

+0

所以......關於這方面的更多注意事項。 @mkl ...對於你提到的XObject而言,事實上它的長度爲零。流是空的,但你看,它有一個寬度和高度等,這是不好的。我認爲這是破壞了簽名的外觀,這就是掛在Adobe瀏覽器上的東西。福昕實際上是在忽略它的外觀,雖然打開文檔可能是期望的行爲,但這並不好。基於瀏覽器的觀衆只是簡單地展示了這個外觀......這也不是很好。 – joelgeraci

+0

是的,在同一時間空蕩蕩的,幷包含一個大的圖像......;) – mkl

+0

觸摸 - 我想我愛你。 – joelgeraci