Я пытаюсь подписать PDF-файл с включенной временной меткой и LTV, чтобы он отображался в Adobe Reader следующим образом:
На английском это означает, что «подпись включает встроенную метку времени» и «подпись включена LTV». Вот код, который я использую:
PrivateKey pk = // get pk from an encrypting certificate created using encrypting file system
Certificate[] chain = ks.getCertificateChain(alias);
PdfReader reader = new PdfReader(src);
FileOutputStream fout = new FileOutputStream(dest);
PdfStamper stp = PdfStamper.createSignature(reader, fout, '\0');
PdfSignatureAppearance sap = stp.getSignatureAppearance();
ExternalSignature signature = new PrivateKeySignature(pk, "SHA-512", "SunMSCAPI");
TSAClient tsc = null;
String url = // TSA URL
tsc = new TSAClientBouncyCastle(url, null, null, 4096, "SHA-512");
List<CrlClient> crlList = new ArrayList<>();
crlList.add(new CrlClientOnline(chain));
ExternalDigest digest = new BouncyCastleDigest();
MakeSignature.signDetached(sap, digest, signature, chain, crlList, null, tsc, 0, CryptoStandard.CMS);
Основываясь на этом ответе, мне нужен способ получить CRL для сертификата TSA в CrlList
, но ... как я могу получить сертификат TSA? Нужно ли мне делать timestamp-query
запрос к TSA и читать ответ, а затем добавлять его в CrlList
? Обратите внимание, что это уже делается внутри MakeSignature.signDetached
, когда он вызывает sgn.getEncodedPKCS7
. Обратите внимание, что я использую бесплатный сервер TSA.
Это то, что показано в Adobe Reader с приведенным выше кодом. Детали подписи:
ОБНОВЛЕНИЕ
Поскольку это был бесплатный сервер TSA, мне просто нужно было добавить сертификат сервера TSA в Adobe Trusted Certificates, и теперь он работает. Но я сделал еще один тест, используя смарт-карту для подписи документа, и вот что у меня есть (я добавил корневой сертификат в доверенные сертификаты в Adobe):
Детали подписи:
Реквизиты сертификата подписи:
На основании этой ссылки, LTV включен означает, что вся информация, необходимая для проверки файл (без корневых сертификатов) содержится в PDF-файле. Таким образом, PDF-файл поддерживает LTV, если он подписан правильно и содержит все необходимые сертификаты и действительный ответ CRL или OSCP для каждого сертификата, а также, если он включает подписи поверх CRL и OCSP, а не только сертификат подписи. Похоже, я выполнил все эти требования или что-то упустил? Если да, то как я могу узнать, чего не хватает для получения PDF-файла с поддержкой LTV?