LTV enabled pdf iText 7



我已经阅读了许多关于如何使用iText启用pdf ltv的问题/答案。它们都不适用于我。我有一个pdf蒸汽,我设置了一个签名字段,然后我使用它来调用signDetached方法并对pdf进行签名。我使用:

signer.signDetached(new BouncyCastleDigest(), pks, chain,
Collections.singleton(crlClient), ocspClient, tsc,0, subfilter);

但什么也没发生。我已经读到,你必须包括除了根证书之外的所有证书。我添加了我的私人证书链(我使用它来签署pdf),但我还没有找到一种可能的方式来包括TSA的证书。

我使用iText版本7.X.

KeyStore ks = getKeyStore();
Certificate[] chain = null;
Enumeration<String> al = ks.aliases();
for (Enumeration<String> l = al; l.hasMoreElements();) {
String alias = (String) l.nextElement();
chain = ks.getCertificateChain(alias);
}
PrivateKey pk = (PrivateKey) ks.getKey(ks.aliases().nextElement(), "******".toCharArray());
IExternalSignature pks = new PrivateKeySignature(pk, digestAlgorithm, BouncyCastleProvider.PROVIDER_NAME);
OCSPVerifier ocspVerifier = new OCSPVerifier(null, null);
OcspClientBouncyCastle ocspClient = new OcspClientBouncyCastle(ocspVerifier);
String url = CertificateUtil.getCRLURL((X509Certificate) chain[0]);
CrlClientOnline crlClient = new CrlClientOnline(url);
try {
signer.signDetached(new BouncyCastleDigest(), pks, chain, Collections.singleton(crlClient), ocspClient, tsc,
0, subfilter);
} catch (Exception ex) {
System.out.println("Tzizzzzzzzzzzzzzzz" + ex.getCause());
}
private KeyStore getKeyStore()
throws KeyStoreException, IOException, NoSuchAlgorithmException, CertificateException {
KeyStore ks = KeyStore.getInstance("pkcs12");
ks.load(new FileInputStream("tsaPath"), "****".toCharArray());
ks.load(new FileInputStream("p12Path"), "*******".toCharArray());
return ks;
}

如果有人仍然对adobeLTV有问题。与itext5中相同,仍然需要在itext7中完成才能启用AdobeLTV,您需要自己创建文档安全存储,并在间接引用中添加有关验证数据/ocsp/crls/certs的信息。

https://github.com/mkl-public/testarea-itext7/blob/master/src/main/java/mkl/testarea/itext7/signature/AdobeLtvEnabling.java

几个小时后,我找到了一个解决方案。需要明确的是,Adobe有自己的信任库,所以你必须使用他们的证书之一,或者使用windows的信任库并相应地配置AC Reader,然后在那里添加根证书。正如大家所提到的,你应该在你的PDF文档中包括所有的认证链。您可以访问我的GitHub项目,以查看一个工作示例,该示例使用iText 7使用ERMIS中的timepstap对PDF文档进行签名,用私钥加密并启用ltv。

制作启用ltv的样本:

private void ltvEnable(PdfSigner signer, ByteArrayOutputStream baos, OutputStream os, String name,
OcspClientBouncyCastle ocspClient, CrlClientOnline crlClient, CustomTSAClient tsc) {
ByteArrayInputStream signedPdfInput = new ByteArrayInputStream(baos.toByteArray());
try {
PdfReader pdfReader = new PdfReader(signedPdfInput);
PdfDocument document = new PdfDocument(pdfReader.setUnethicalReading(true), new PdfWriter(os),
new StampingProperties().useAppendMode());
LtvVerification ltvVerification = new LtvVerification(document);
ltvVerification.addVerification(name, ocspClient, crlClient, LtvVerification.CertificateOption.WHOLE_CHAIN,
LtvVerification.Level.OCSP_CRL, LtvVerification.CertificateInclusion.YES);
ltvVerification.merge();
document.getCatalog().getPdfObject().getAsDictionary(PdfName.DSS).getAsArray(PdfName.Certs)
.add(new PdfStream(
IOUtils.toByteArray(getClass().getClassLoader().getResourceAsStream("HPARCA_CA.cer"))));
document.close();
pdfReader.close();
} catch (IOException | GeneralSecurityException e) {
LOG.error("Error while making signature ltv enabled");
}
}

狡猾的零件参数:

OCSPVerifier ocspVerifier = new OCSPVerifier(null, null);
OcspClientBouncyCastle ocspClient = new OcspClientBouncyCastle(ocspVerifier);
CrlClientOnline crlClient = new CrlClientOnline();

通常不可能LTV启用示例签名

首先,默认情况下,您的签名者证书不是来自Adobe Reader信任的CA,即CA证书既不在AATL上,也不在EUTL上。PDF阅读器永远不会将签名称为"启用LTV",除非它以某种方式信任签名者。

此外,签名者证书没有任何AIA(权威信息访问)扩展,签名代码可以从该扩展确定检索颁发者证书或吊销信息的位置。丢失的信息使得证书和吊销信息的自动检索变得不可能,而不需要进一步的麻烦。

因此,即使CA是可信的,自动LTV启用仍然需要自定义代码。


在这里的评论过程中(以及在与iText支持的沟通中),事实证明所提供的示例签名不具有代表性;另一方面,还有其他相关的边界条件,您最终得到了一个例程,在您的用例中创建启用LTV的签名。

关于这个程序的详细信息可以在你的答案中找到。

最新更新