当前位置: 首页 > 知识库问答 >
问题:

使用摘要异步签名pdf

戴化
2023-03-14

我正在尝试为PDF签名执行以下设置,将其分解为客户端和服务器之间的异步步骤:

    null
        PDDocument document = PDDocument.load(documentFile);
        PDSignature signature = new PDSignature();
        signature.setFilter(PDSignature.FILTER_ADOBE_PPKLITE);
        signature.setSubFilter(PDSignature.SUBFILTER_ADBE_PKCS7_DETACHED);
        signature.setName("Example User");
        signature.setLocation("Los Angeles, CA");
        signature.setReason("Testing");
        Calendar date = Calendar.getInstance();
        signature.setSignDate(date);
        document.addSignature(signature);

        ExternalSigningSupport externalSigningSupport = document.saveIncrementalForExternalSigning(null);

        byte[] content = IOUtils.toByteArray(externalSigningSupport.getContent());
        MessageDigest md = MessageDigest.getInstance("SHA256", new BouncyCastleProvider());
        byte[] digest = md.digest(content); // this is sent to client

我所做的基本上是将该摘要发送给客户机进行签名,然后在服务器上重做上述步骤并设置客户机签名:

        ExternalSigningSupport externalSigning = document.saveIncrementalForExternalSigning(fos);
        externalSigning.setSignature(encodedSignature); // encodedSignature is received from client and computed based on the digest sent by the server

此设置最终导致文件完整性被破坏,因为在服务器上嵌入encodedsignature后,我要创建一个新的PDSignature。有没有一种方法可以序列化调用addSignature后创建的PDDocument,这样我以后就可以在服务器上反序列化它并添加客户端的签名?

共有1个答案

归俊杰
2023-03-14

我所做的基本上是将该摘要发送给客户机进行签名,然后在服务器上重做上述步骤并设置客户机签名

如果希望上述步骤生成相同文档,则需要

  • 确保这些步骤的输入相同,并且
  • 提供相同的修订id种子值。
Calendar date = Calendar.getInstance();
signature.setSignDate(date);

幸运的是,PDFBox允许我们提供它用来使修订ID足够唯一的种子值。

由于我们不希望在签署同一文档的所有时间都使用相同的修订ID,而只是在当前签署事务期间使用相同的seed值,因此我们应该只在同一事务中使用相同的seed值。由于种子值是一个long,我们可以简单地使用上面已经讨论过的date对应的以毫秒为单位的时间,即:

pdDocument.setDocumentId(date.getTimeInMillis());
 类似资料:
  • 我有一个关于计算PDF文档摘要以用于数字签名的快速问题(与我前面的一个问题有点相关,我试图弄清楚为什么您需要知道客户的证书以创建正确的摘要)。在Adobe关于PDF格式的文档中,指定了以下内容: 字节范围摘要应在文件中的一个字节范围内计算,该范围应由签名字典中的字节范围条目指示。这个范围应该是整个文件,包括签名字典,但不包括签名值本身(内容条目)。 因此,在这一点上,事情似乎相当简单,只需消化除/

  • 我需要发送一个签名的XML文件到巴西的一个政府机构。问题是,我的Java代码(使用Java XML数字签名API)计算的摘要与使用另一个工具(如XMLSec)生成的摘要不同。 下面是我用来为某个XML节点生成XML签名的代码: 如果尝试使用xmlsec验证生成的XML,则会出现以下错误: 但如果我尝试使用xmlsec(使用相同的私钥)对同一文件(consult.xml)进行签名,则错误就会消失:

  • 我正在使用iText7执行PDF和签名操作。我的场景是,我在本地机器上计算哈希,并将这个哈希发送到签名服务器,作为响应,得到签名的PKCS1(原始签名),然后我将这个签名嵌入到PDF中。我的代码片段如下: 1:从智能卡设备读取公共证书。 3:初始化PdfSigner并设置签名外观: 4:我已经实现了IExternalSignatureContainer接口来获取文档哈希: 5:获取文档哈希: 7:

  • 问题内容: 目前,我有一个客户端-服务器应用程序,给定一个PDF文件,使用服务器证书对其进行签名,将签名与原始文件一起附加,然后将输出返回给客户端(所有这些操作均通过PDFBox实现)。 我有一个签名处理程序,这是我的外部签名支持(其中内容为PDF文件) 它工作正常,但我在想-如果PDF文件太大而无法上传怎么办?例如:100mb …这将永远!鉴于此,我想弄清楚,如果不对PDF文件签名,是否可以仅对

  • 我正在编写一个Java web服务,它使用来自网络中一些客户端的iText对PDF文档进行签名。文档的签名正确,可以使用外部工具进行验证。然而,由于一些法律限制,为了将此文档存储在一个正式的文档存储库中,我必须提供来自签名的散列/摘要消息。 我已经尝试了几乎所有的方法来获得那个散列,但我能得到的最接近的方法是用下面的代码段以字符串的形式获得整个签名(证书+散列/摘要+时间戳)(请原谅字符串和[1]

  • 目前,我有一个客户机-服务器应用程序,给定一个PDF文件,它对其进行签名(使用服务器证书),将签名附加到原始文件,并将输出返回给客户机(所有这些都是通过PDFBox实现的)。 我有一个签名处理程序,它是我的外部签名支持(其中的内容是PDF文件) 它工作得很好,但我在想--如果PDF文件太大无法上传怎么办?例如:100MB...这会花上很长时间的!鉴于此,我试图弄清楚,如果不签署PDF文件,是否可能