当前位置: 首页 > 知识库问答 >
问题:

生成的签名PDF会导致Adobe Reader崩溃,但不会导致其他PDF Reader崩溃

澹台宾白
2023-03-14

我们有修改PDF的代码,然后对修改后的PDF进行数字签名。我们使用iTextSharp库(4.1.6)的LGPL版本对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查看器和Foxit Reader(进行签名验证)处理得很好。有时一段时间后会出现一个错误框,上面写着“打开流时出错”之类的内容。

此外,对于经过相同数字签名过程的PDF,我们在外观完整性报告中观察到以下情况

目前我们不确定这些是否与问题有关。我提到它们是因为它们可能是相关的。

那么,问题是,为什么这种数字签名的PDF会使Adobe Reader崩溃,我们如何补救?

共有1个答案

郎增
2023-03-14

您的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 

此Image XObject声称包含RGB位图图像(736x1242,24bit),同时为空(长度0)。如果遇到此类丢失的数据,PDF查看器可能会失败(尽管Adobe Reader锁定一段时间的方式令人印象深刻...)。

请检查该流是否已经在您的源PDF中损坏。

顺便提一下,有一个问题:

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

在关闭压模之前关闭读取器。由于压模可能需要在关闭过程中访问读取器,这是一个坏主意。只需切换Close调用的顺序。

顺便说一下,你的代码会生成一个adbe。pkcs7。sha1签名。在安全方面,这是一个糟糕的想法,因为这种机制使用SHA1作为第一个文档哈希,而不管您在签名中使用什么安全算法,而SHA1通常不再被认为是安全的。

 类似资料:
  • 我试图用LWJGL编写一个opengl渲染器。为了打开窗户,我用的是GLFW。但是,当我调用glfwCreateWindow时,它会崩溃,出现以下错误: Java运行时环境检测到一个致命错误: 谢了!

  • 我正在尝试使用、和(不使用)实现实时相机应用程序 所以,我发现这篇教程 http://altitudelabs.com/blog/real-time-filter/ 它是用Objective-C编写的,所以我在Swift4.0中重写了那个代码,xcode9 它看起来工作很好,但有时(很少),它崩溃了以下错误。调用的方法时 EXC_BAD_ACCESS(代码=1,地址+0x************)

  • Logcat消息: java.lang.IllegalStateException:在Android的父上下文或祖先上下文中找不到方法@={()->ViewModel.OnBtnClicked()(View):在id为“button”的视图类AndroidX.AppCompat.Widget.AppCompatButton上定义的OnClick属性 文件1:activity_main.xml 文件

  • 问题内容: 我正在尝试创建一个node.js应用程序, 导致我的程序崩溃。节点说 ReferenceError:警报未定义 然后退出。我可以在常规html页面上运行javascript时使用该函数,因此我不知所措,这是为什么…这是我必须与node.js一起使用的单独模块吗? 问题答案: 该功能是浏览器对象的属性。它实际上不是JavaScript的一部分;它只是该环境中JavaScript代码可用的

  • 我们刚刚从Visual Studio2008“升级”到Visual Studio2012。我们更新了我们的单元测试,现在它们在单独运行时通过,但是当我尝试运行全部时,我得到了以下错误: 还有人遇到过类似的问题吗?如果是的话,你是怎么解决的? 在MSDN上也问过同样的问题,但答案是“点击崩溃转储的链接”。这个答案对我没有帮助,因为我没有看到到崩溃转储的任何链接,并且我无法生成崩溃转储。 关于Stac

  • 我试图从我的框架中获得轮廓,这就是我所做的: .................................................... 程序在处崩溃,我收到以下错误消息: OpenCV错误:不支持的格式或格式组合([开始]FindContour只支持8uC1和32sC1图像)在未知的功能,文件......\src\openc v\模块\imgproc\src\contours.cp