首页 > 解决方案 > PDF 签名验证失败

问题描述

我正在使用 iTextSharp.LGPLv2 签署 PDF 文档(.Net Core 目前唯一可用的选项)。我能够产生签名,但大多数读者拒绝它。您可以下载文件: https ://www.dropbox.com/s/ns35fdi5tyq52cw/blank.bs.pdf?dl=0

几个重要的问题:

我在这里有点困惑,我很高兴听到任何建议/提示/方向。

标签: c#pdfitextpdf-generationsign

解决方案


签名中有(至少)两个错误:

  • 文档哈希不匹配:

    有符号字节范围的 SHA256 哈希是

    69CF153087670FC5D450FF23675C207BB9659A235A465202F5802ABED7BA7C21
    

    但你的签名容器声称它是

    93D5804C1A9A31B17F041DE79FB1CD598E1FCC7CDC2A37885CD0502D4FCBB5A6
    

    这解释了为什么验证器会假设文档已被更改。

  • 签名属性的哈希不匹配:

    SignerInfoCMS 签名容器中的签名属性的 SHA256 哈希是

    C84C6600F5E11291AAD8240239B7DC09FC00BD6A9056B6BBF584E8D46C8CEBE5
    

    但是你 SHA256withRSA 签名值中的哈希值是

    93D5804C1A9A31B17F041DE79FB1CD598E1FCC7CDC2A37885CD0502D4FCBB5A6
    

    即使文档哈希(见上文)匹配,这也会使验证失败。

    顺便说一句,签名值中的此哈希值与您声称的(不正确的)文档哈希值相同。

后一种不匹配可能是由于您签署了错误的数据造成的。

前一种不匹配可能是由于您的代码在计算带符号字节范围的哈希时出现了一些错误,也可能是由于实际操作了带符号的数据。

要进一步分析问题,需要您的签名代码。

PS:您的证书中也至少有一个错误,它的序列号为负数。


推荐阅读