使用apache pdfbox进行分离式签名

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

我们正在尝试使用apache pdfbox的分离签名功能。我们尝试了两种方法。

1. 使用证书文件和私钥进行签名。 在这种情况下,文件得到完美的签名。 2. 使用加密令牌进行签名。 在这里,我们使用证书和加密令牌收到的文档(文档签名)的签名哈希值,签名被显示为无效(原因:文档在签名后被修改或损坏)。以下是代码片段。

//fis = file input stream
// out = output file path
PDDocument document = PDDocument.load(fis);
FileOutputStream fos = new FileOutputStream(out);
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 externalSigning = document.saveIncrementalForExternalSigning(fos);
MessageDigest digest = null;
 try {
digest = MessageDigest.getInstance("SHA-256");
} catch (NoSuchAlgorithmException e1) {
e1.printStackTrace();
}
X509CertificateHolder cer = new X509CertificateHolder(euc); // euc = end user certificate in byte array form
X509Certificate cervalue = new JcaX509CertificateConverter().getCertificate(cer);
Certificate certChain[] = new Certificate[1];
certChain[0] = cervalue;
CMSSignedDataGenerator gen = new CMSSignedDataGenerator();
ContentSigner signer = new ContentSigner() {
@Override
public byte[] getSignature() {
return docSig;  //byte[] docSig = byte array of signed hash received from crypto token
}
@Override
public OutputStream getOutputStream() {
return new ByteArrayOutputStream();
}
@Override
public AlgorithmIdentifier getAlgorithmIdentifier() {
return new DefaultSignatureAlgorithmIdentifierFinder().find("SHA256WITHRSA");
}
};
gen.addSignerInfoGenerator(new JcaSignerInfoGeneratorBuilder(new JcaDigestCalculatorProviderBuilder().build()).build(signer, cervalue));
gen.addCertificates(new JcaCertStore(Arrays.asList(certChain)));
CMSProcessableInputStream msg = new CMSProcessableInputStream(externalSigning.getContent());
CMSSignedData signedData = gen.generate(msg, false);
byte[] cmsSignature = signedData.getEncoded();
externalSigning.setSignature(cmsSignature);
output.close();

以下是签名后创建的文档截图。签署后的文件

请建议我们哪里做的不对。先谢谢你。

java pdfbox digital-signature
1个回答
1
投票

如果哈希值无效或签名无效或格式不正确,通常会出现 "文档已被修改或损坏 "的错误信息。

在你的代码中,你从哪里得到 "docSig"? 这是个网页应用还是桌面应用?Token 是连接到服务器还是客户端?

请检查,如果这 所以答案 是有帮助的...

注意:您可以使用不同厂商提供的浏览器扩展和服务器库。

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