PDF 签名验证失败
PDF Signature fails verification
我正在使用 iTextSharp.LGPLv2 签署 PDF 文档(目前 .Net Core 唯一可用的选项)。
我能够提供签名,但大多数读者都拒绝了。您可以下载文件:
https://www.dropbox.com/s/ns35fdi5tyq52cw/blank.bs.pdf?dl=0
几个重要问题:
- Adobe Reader 和 Foxit 均拒绝签名,称“文档已被更改...”
- 签名使用了“adbe.pkcs7.detached”的子过滤器。如果更改为“ETSI.CAdES.detached”,福昕认为签名是好的。 Reader 没有。
- SHA256 用于所有哈希目的。
- 看来 ByteRange 设置正确。
- 通过使用 openssl,我能够验证签名的格式是否正确并且包含有效的 PKCS1.5 填充缓冲区。
我在这里有点困惑,很高兴听到任何消息 suggestions/hints/directions。
签名中有(至少)两个错误:
文档哈希不匹配:
带符号字节范围的 SHA256 哈希为
69CF153087670FC5D450FF23675C207BB9659A235A465202F5802ABED7BA7C21
但您的签名容器声称它是
93D5804C1A9A31B17F041DE79FB1CD598E1FCC7CDC2A37885CD0502D4FCBB5A6
这解释了为什么验证器认为文档已被更改。
签名属性的散列不匹配:
您的 CMS 签名容器中 SignerInfo
的已签名属性的 SHA256 哈希值是
C84C6600F5E11291AAD8240239B7DC09FC00BD6A9056B6BBF584E8D46C8CEBE5
但是你的SHA256withRSA签名值中的hash值是
93D5804C1A9A31B17F041DE79FB1CD598E1FCC7CDC2A37885CD0502D4FCBB5A6
即使文档哈希(见上文)匹配,也会导致验证失败。
顺便说一句,签名值中的这个哈希值与您声称的(不正确的)文档哈希值相同。
后面的不匹配可能是你签错数据造成的
前者的不匹配可能是由于您的代码在计算带符号字节范围的哈希值时出现了一些错误,也可能是由于实际操作了带符号的数据。
为了进一步分析问题,需要您的签名代码。
PS:您的证书中至少还有一个错误,它的序列号是负数。
我正在使用 iTextSharp.LGPLv2 签署 PDF 文档(目前 .Net Core 唯一可用的选项)。 我能够提供签名,但大多数读者都拒绝了。您可以下载文件: https://www.dropbox.com/s/ns35fdi5tyq52cw/blank.bs.pdf?dl=0
几个重要问题:
- Adobe Reader 和 Foxit 均拒绝签名,称“文档已被更改...”
- 签名使用了“adbe.pkcs7.detached”的子过滤器。如果更改为“ETSI.CAdES.detached”,福昕认为签名是好的。 Reader 没有。
- SHA256 用于所有哈希目的。
- 看来 ByteRange 设置正确。
- 通过使用 openssl,我能够验证签名的格式是否正确并且包含有效的 PKCS1.5 填充缓冲区。
我在这里有点困惑,很高兴听到任何消息 suggestions/hints/directions。
签名中有(至少)两个错误:
文档哈希不匹配:
带符号字节范围的 SHA256 哈希为
69CF153087670FC5D450FF23675C207BB9659A235A465202F5802ABED7BA7C21
但您的签名容器声称它是
93D5804C1A9A31B17F041DE79FB1CD598E1FCC7CDC2A37885CD0502D4FCBB5A6
这解释了为什么验证器认为文档已被更改。
签名属性的散列不匹配:
您的 CMS 签名容器中
SignerInfo
的已签名属性的 SHA256 哈希值是C84C6600F5E11291AAD8240239B7DC09FC00BD6A9056B6BBF584E8D46C8CEBE5
但是你的SHA256withRSA签名值中的hash值是
93D5804C1A9A31B17F041DE79FB1CD598E1FCC7CDC2A37885CD0502D4FCBB5A6
即使文档哈希(见上文)匹配,也会导致验证失败。
顺便说一句,签名值中的这个哈希值与您声称的(不正确的)文档哈希值相同。
后面的不匹配可能是你签错数据造成的
前者的不匹配可能是由于您的代码在计算带符号字节范围的哈希值时出现了一些错误,也可能是由于实际操作了带符号的数据。
为了进一步分析问题,需要您的签名代码。
PS:您的证书中至少还有一个错误,它的序列号是负数。