iText LTV включен - как добавить больше CRL?
Мне нужно сделать подписанный PDF LTV включенным. Сертификат подписи имеет цепочку из трех уровней (root / public / personal). Я знаю, что нужно добавить OCSP и CRL сертификатов в pdf (кроме 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();
}
1 ответ
Если вы хотите предоставить несколько CRL для LtvVerification.addVerification
Вы не вызываете этот метод один раз для каждого CRL, а вместо этого один раз со всеми CRL.
За это CrlClientOnline
также принимает несколько URL-адресов:
/**
* Creates a CrlClientOnline instance using one or more URLs.
*/
public CrlClientOnline(String... crls)
Таким образом, используя этот конструктор, мы упрощаем и исправляем ваш код
PdfReader r = new PdfReader(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 crlClient = new CrlClientOnline("http://www.postsignum.cz/crl/psrootqca2.crl", "http://www.postsignum.cz/crl/pspublicca2.crl");
if (pkcs7.isTsp())
{
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)
{
if (v.addVerification(name, ocsp, crlClient,
LtvVerification.CertificateOption.WHOLE_CHAIN,
LtvVerification.Level.CRL,
LtvVerification.CertificateInclusion.NO))
{
System.out.println("crl " + crlClient.toString() + " added to " + name);
}
}
}
stp.close();
( AddLtvCrls.java, метод addLtvFixed
)
Применяя его к вашему примеру файла, мы получаем:
Для некоторого фона, LtvVerification.addVerification
хранит информацию, которая у него есть, в качестве информации для проверки, необходимой для рассматриваемой подписи. Многократный вызов приводит к получению информации только с последней попытки подсчета.
призвание LtvVerification.merge
и здесь не помогает, поскольку просто объединяет информацию проверки, необходимую для разных подписей из более старых версий, в новый раздел информации, связанной с проверкой.