Java PDF签名,生成的PDF文档证书无效?(使用外部签名、web eid、HSM)
我有一个服务对数据进行签名,并向我提供签名的哈希, 它正确地生成PKCS#7摘要信息,如rfc2315#第9.4节所述 像这样的 上述系统的代码为: 工作流是这样的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结构中错误的假定哈希
-抓取原始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