【发布时间】:2021-03-04 20:23:25
【问题描述】:
我需要启用签名的 pdf LTV。签名证书具有三个级别(根/公共/个人)的链。我知道有必要在pdf中添加证书的OCSP和CRL(root除外)。
我可以使用基本的 LtvVerification.addVerification() 方法吗? 如果我一次添加两个 CRL,结果 PDF 只是一秒钟。如果我改变订单,还有第二个。 如果我在两次运行中添加 CRL,它将以相同的方式结束 - 在 pdf 中,CRL 仍然作为第二个添加。 我认为“添加”不会覆盖以前的状态..
如何正确使用LtvVerification.merge()方法?在添加第一个/第二个/两个 CRL 之前/之后?
或者我只能使用替代方法 LtvVerification.addVerification(String signatureName, Collection ocsps, Collection crls, Collection certs)?
非常感谢您的提示。
源代码:
public void addLtv(String src, String dest) throws IOException, DocumentException, GeneralSecurityException
{
BouncyCastleProvider provider = new BouncyCastleProvider();
Security.addProvider(provider);
PdfReader r = new PdfReader(src);
System.out.println("Source file: " + src);
FileOutputStream fos = new FileOutputStream(dest);
PdfStamper stp = new PdfStamper(r, fos, '\0', true);
LtvVerification v = stp.getLtvVerification();
AcroFields fields = stp.getAcroFields();
ArrayList<String> names = fields.getSignatureNames();
String sigName = names.get(names.size() - 1);
System.out.println("found signature: " + sigName);
PdfPKCS7 pkcs7 = fields.verifySignature(sigName);
//add LTV
OcspClient ocsp = new OcspClientBouncyCastle();
CrlClient crlClient1 = new CrlClientOnline("http://www.postsignum.cz/crl/psrootqca2.crl");
ArrayList<CrlClient> crllist = new ArrayList<CrlClient>();
crllist.add(crlClient1);
CrlClient crlClient2 = new CrlClientOnline("http://www.postsignum.cz/crl/pspublicca2.crl");
crllist.add(crlClient2);
System.out.println("crllist.size=" + crllist.size());
if (pkcs7.isTsp())
{
for (CrlClient crlclient : crllist)
{
if (v.addVerification(sigName, new OcspClientBouncyCastle(), crlclient,
LtvVerification.CertificateOption.SIGNING_CERTIFICATE,
LtvVerification.Level.CRL,
LtvVerification.CertificateInclusion.NO)) {
System.out.println("crl " + crlclient.toString() + " added to timestamp");
}
}
} else{
for (String name : names)
{
for (int i = 0; i < crllist.size(); i++) {
if (v.addVerification(name, ocsp, crllist.get(i),
LtvVerification.CertificateOption.WHOLE_CHAIN,
LtvVerification.Level.CRL,
LtvVerification.CertificateInclusion.NO)) {
System.out.println("crl " + crllist.get(i).toString() + " added to " + name);
}
if (i > 0) {
System.out.println("found verification, merge");
v.merge();
}
}
}
}
stp.close();
}
【问题讨论】:
-
您能否分享一个示例文档来重现您的问题?
-
示例源 pdf(签名)quarim.cz/custom/itextLTV/source_signed.pdf