使用 iText v8.0.3 进行 PDF 哈希签名

问题描述 投票:0回答:1

我正在尝试 iText java v8.0.3 试用版来签署 pdf 文档。我们首先需要生成文档哈希,然后将该哈希发送到我们的签名服务器,该服务器返回 PKCS7 签名。然后我们将此签名应用到原始 pdf 文档上。

在iText文档中,提到了PdfPadesSigner类的prepareDocumentForSignature()和addSignatureToPreparedDocument()方法,我相信这将达到我们的目的。但当我针对 iText v8.0.3 maven 依赖项进行构建时,该类似乎不包含这些方法。

我尝试使用 v5.5.13.3 PdfPKCS7 getAuthenticatedAttributeBytes 方法,但收到“文档已更改”签名验证错误。另外,我没有签名证书可传递给 PdfPKCS7 构造函数。所以检查一下最新版本是否直接支持。

我也看到了这个问题: 使用 iText 8.0.3 进行 Pdf 哈希签名

请帮助提供示例代码/API 来实现此流程。

这是我的代码第1步:哈希生成:

pdfTwoPhaseSigner =  new PdfTwoPhaseSigner(new PdfReader(inputStream), new FileOutputStream(tmpFileName));
    
SignerProperties signerProperties = new SignerProperties();
signerProperties.setPageRect(new Rectangle(36, 748, 144, 780));
signerProperties.setFieldName("swa");
signerProperties.setReason("test reason");
signerProperties.setLocation("test location");
        
SignatureFieldAppearance signatureFieldAppearance = new SignatureFieldAppearance("swa");
signatureFieldAppearance.setContent("Test Name", "Test description");    signerProperties.setSignatureAppearance(signatureFieldAppearance);`        
byte[] digestedDocumentBytes = pdfTwoPhaseSigner.prepareDocumentForSignature(signerProperties, "SHA256", PdfName.Adobe_PPKLite, PdfName.Adbe_pkcs7_detached, (8192 * 2 + 2), true);      // ETSI_CAdES_DETACHED
return digestedDocumentBytes;

第2步:远程哈希签名:返回:byte[] pkcs7, X509Certificate[] chain

第3步:对pdf应用签名

CMSContainer cms = new CMSContainer();
SignerInfo signerInfo = new SignerInfo();
signerInfo.setSigningCertificate(chain[0]);
signerInfo.setSignature(pkcs7);
signerInfo.setDigestAlgorithm(new AlgorithmIdentifier(DigestAlgorithms.getAllowedDigest("SHA256")));
cms.addCertificates(chain);
cms.setSignerInfo(signerInfo);
    
outputStream = new FileOutputStream(outputFile);
try (PdfDocument document = new PdfDocument(new PdfReader(new FileInputStream(tmpFileName)))) {
PdfTwoPhaseSigner.addSignatureToPreparedDocument(document, "swa", outputStream, cms);
}
finally {
outputStream.close();
}

结果:自应用签名以来文档已被更改或损坏

pdf itext
1个回答
0
投票

这似乎是一个不正确的链接,您要查找的方法位于 PdfTwoPhaseSigner 类中(或参阅 here 了解 .NET API)。

您是否也看过 iText 知识库上最近的 PAdES 签名 API 示例

© www.soinside.com 2019 - 2024. All rights reserved.