Java PDF签名,生成的PDF文档证书无效?(使用外部签名、web eid、HSM)

Java PDF签名,生成的PDF文档证书无效?(使用外部签名、web eid、HSM),java,pdf,bouncycastle,pdfbox,hsm,Java,Pdf,Bouncycastle,Pdfbox,Hsm,我有一个服务对数据进行签名,并向我提供签名的哈希, 它正确地生成PKCS#7摘要信息,如rfc2315#第9.4节所述 像这样的 上述系统的代码为: 工作流是这样的 -抓取原始PDF -添加签名字典并获取哈希值 -将哈希发送到客户端 -等待标准输入数据。 -等待客户端发送签名的散列,然后反馈该数据 到暂停的程序,也就是说,数据被发送到 节目 -添加CMS:) 我不知道为什么使用此过程生成的PDF的签名显示为无效 客户端或与客户端的通信中至少存在两个问题: DigestInfo结构中错误的假定哈希

我有一个服务对数据进行签名,并向我提供签名的哈希, 它正确地生成PKCS#7摘要信息,如rfc2315#第9.4节所述

像这样的

上述系统的代码为:

工作流是这样的
-抓取原始PDF
-添加签名字典并获取哈希值
-将哈希发送到客户端
-等待标准输入数据。
-等待客户端发送签名的散列,然后反馈该数据 到暂停的程序,也就是说,数据被发送到 节目
-添加CMS:)


我不知道为什么使用此过程生成的PDF的签名显示为无效

客户端或与客户端的通信中至少存在两个问题:

DigestInfo结构中错误的假定哈希算法 使用签名者证书的公钥解密时,客户端返回的签名值包含以下结构:

  0  81: SEQUENCE {
  2  13:   SEQUENCE {
  4   9:     OBJECT IDENTIFIER sha-512 (2 16 840 1 101 3 4 2 3)
 15   0:     NULL
       :     }
 17  64:   OCTET STRING
       :     '413140d54372f9baf481d4c54e2d5c7bcf28fd6087000280'
       :     'e07976121dd54af2'
       :   }
特别地,它声称已使用SHA512来计算散列。尽管如此,它包含一个长度为32字节的摘要值,因此不能是SHA512摘要值

那么你的要求呢

我有一个为数据签名并提供签名哈希的服务,它正确地生成PKCS#7 DigestInfo,如rfc2315第9.4节所述

要么是错误的,要么是与服务通信的代码提供了错误的数据

因此,请修复您的客户机或客户机通信组件,使其将正确的摘要算法OID引入签名的
DigestInfo
结构

错误的散列值 即使更正了上述OID,其中的哈希值也是错误的,PDF签名范围的正确SHA256哈希值也是错误的

9a75434965d5cf2635eb963752494b408a480effabfca1d87b82e619040dfb4b
因此,请调试您的工具链,以找出错误的哈希值来自何处

附录:CMS容器的结构 解决方案的另一个缺点是生成的CMS容器的结构非常简单。特别是,它根本不包含有符号的属性。虽然CMS规范允许这样做,但这对于许多可能的伪造攻击是非常不安全的。因此,当前规范中几乎没有任何CMS容器配置文件认为这种签名容器有效


因此,除非您的签名文档仅在非常受控的环境中使用,并且有组织措施防止这些伪造攻击,否则它们的价值实际上为零。

原始PDF:signed PDF:I将在稍后研究签名。但是,第一眼就可以看出,签名容器只是根据CMS容器最原始的要求构建的。这种用法几乎不适用于签名必须遵循某些安全配置文件的任何用例。感谢您指出,我的工作假设客户端的行为符合我的要求,我在客户端使用web eid。我已经把这件事通知了作者,但在他这方面似乎一切都是正确的。(虽然我不确定)。谢谢你的提示,我将研究CMS容器结构以及如何改进它。我已经在这里上传了整个代码,所以你可以查看它(如果你有时间的话),我会尝试在这期间修复它。这是客户端代码的问题,它生成了错误的签名值。
9a75434965d5cf2635eb963752494b408a480effabfca1d87b82e619040dfb4b