c# - PDF 签名验证失败
问题描述
我正在使用 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”,则 Foxit 认为签名正常。读者没有。
- SHA256 用于所有散列目的。
- 看起来 ByteRange 设置正确。
- 通过使用 openssl,我能够验证签名是否正确格式化并包含有效的 PKCS1.5 填充缓冲区。
我在这里有点困惑,我很高兴听到任何建议/提示/方向。
解决方案
签名中有(至少)两个错误:
文档哈希不匹配:
有符号字节范围的 SHA256 哈希是
69CF153087670FC5D450FF23675C207BB9659A235A465202F5802ABED7BA7C21
但你的签名容器声称它是
93D5804C1A9A31B17F041DE79FB1CD598E1FCC7CDC2A37885CD0502D4FCBB5A6
这解释了为什么验证器会假设文档已被更改。
签名属性的哈希不匹配:
SignerInfo
CMS 签名容器中的签名属性的 SHA256 哈希是C84C6600F5E11291AAD8240239B7DC09FC00BD6A9056B6BBF584E8D46C8CEBE5
但是你 SHA256withRSA 签名值中的哈希值是
93D5804C1A9A31B17F041DE79FB1CD598E1FCC7CDC2A37885CD0502D4FCBB5A6
即使文档哈希(见上文)匹配,这也会使验证失败。
顺便说一句,签名值中的此哈希值与您声称的(不正确的)文档哈希值相同。
后一种不匹配可能是由于您签署了错误的数据造成的。
前一种不匹配可能是由于您的代码在计算带符号字节范围的哈希时出现了一些错误,也可能是由于实际操作了带符号的数据。
要进一步分析问题,需要您的签名代码。
PS:您的证书中也至少有一个错误,它的序列号为负数。
推荐阅读
- java - LinkedList 和 TreeMap:compareTo 还是 equals?
- c# - 用各种长度的文本覆盖控制台行
- java - 如果选择了从下拉列表中选择的选项,如何断言。硒。页面对象模型
- c# - 静态类方法重载使用会导致编译器错误
- amazon-web-services - AWS Visibility 超时是否保证在此期间不传递消息
- python - VectorError:xlGetChannelIndex 失败(XL_ERR_HW_NOT_PRESENT)
- javascript - 点击后关闭侧边菜单
- java-8 - java8 Streams与java中的集合有何不同
- excel - 分配工作簿变量时 Excel/VBA 中的运行时错误 91
- telegram - 如何修复 curl_error:SSL:没有替代证书主题名称与目标主机名“api.telegram.org”匹配