繁体   English   中英

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

[英]PDF Signing, generated PDF Document certification is invalid? (using external signing, web-eid, HSM)

我有一个签署数据并为我提供签名哈希的服务,它正确生成PKC# 7 DigestInfo,如rfc2315#section-9.4中所述

像这样的东西 PDF外部签名系统架构

上述系统的代码是: https//pastebin.com/b3qZH6xW

            //prepare signature
        PDSignature signature = new PDSignature();
        signature.setFilter(PDSignature.FILTER_ADOBE_PPKLITE);
        signature.setSubFilter(PDSignature.SUBFILTER_ADBE_PKCS7_DETACHED);
        signature.setName("Ankit");
        signature.setLocation("Bhopal, IN");
        signature.setReason("Testing");
        // TODO extract the above details from the signing certificate? Reason as a parameter?

        // the signing date, needed for valid signature
        signature.setSignDate(Calendar.getInstance());

        if (accessPermissions == 0)
        {
            setMDPPermission(document, signature, 3);
        }

        FileOutputStream fos = new FileOutputStream(new File("signed_file.pdf"));

        DetachedPkcs7 detachedPkcs7 = new DetachedPkcs7();
        //populate signature options for visible signature. if any.
        SignatureOptions signatureOptions = null;
        document.addSignature(signature);
        ExternalSigningSupport externalSigning = document.saveIncrementalForExternalSigning(fos);
        InputStream dataToSign = externalSigning.getContent();
        byte[] cmsSignature = detachedPkcs7.sign(dataToSign);
        externalSigning.setSignature(cmsSignature);  

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

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

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

DigestInfo结构中的假定哈希算法错误

当使用签署者证书的公钥解密时,客户端返回的签名值包含此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摘要值!

所以你的主张

我有一个签署数据并为我提供签名哈希的服务,它正确生成PKC#7 DigestInfo,如rfc2315#section-9.4中所述

要么是不正确,要么与服务通信的代码会向其提供不正确的数据。

因此,请修复您的客户端或客户端通信组件,以使它们将正确的摘要算法OID引入签名的DigestInfo结构中。

哈希值错误

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

9a75434965d5cf2635eb963752494b408a480effabfca1d87b82e619040dfb4b

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

附录:CMS容器的结构

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM