【发布时间】:2018-03-23 04:52:26
【问题描述】:
我正在尝试执行以下设置来签署 pdf,分为客户端和服务器之间的异步步骤:
- 服务器接收 pdf 并计算其摘要。
- 服务器将摘要发送给客户端。
- 客户端稍后对哈希进行签名。
- 客户端将签名发送到服务器。
- 服务器将签名嵌入到 pdf 中。
我主要在PDF Signature digest和Create pkcs7 signature from file digest工作
第二个问题允许我编写大部分代码,但我发现文件的完整性已受到损害。我似乎无法序列化中间 pdf 以便稍后嵌入签名(以确保没有更改时间戳等)。但是从第一个 SO 问题来看,这似乎是一个比我想象的更难的问题。真的可以做到吗?
我正在使用 pdfbox。
服务器代码:
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序列化,这样我以后可以在服务器上反序列化并添加客户端的签名?
【问题讨论】:
-
你有完整的例子吗?