我們有修改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文件,我們已經觀察到外觀完整性報告
目前,我們是不確定的,如果這些都涉及到以下問題。我提到他們是因爲他們可能是相關的。
問題是,爲什麼數字簽名的PDF會使Adobe Reader崩潰,我們該如何解決它?
我希望簽名應用程序的用戶知道您正在創建的簽名已被棄用(不再在PDF 2.0中有效)並且不安全。您創建不安全簽名的用例是什麼? –
欲瞭解更多信息:http://itextpdf.com/blog/are-pdf-signatures-shattered(您正在使用SHA-1)。擁有某種處理能力的任何人都可以在不破壞簽名的情況下更改PDF –
@BrunoLowagie那麼iTextSharp的LGPL版本不能創建安全簽名是真的嗎?我在加密算法中看到的選項是'PdfWriter.STANDARD_ENCRYPTION_128','PdfWriter.ENCRYPTION_AES_128'和'PdfWriter.STANDARD_ENCRYPTION_40'。目前的iTextSharp發行版使用什麼加密算法? –