Извлечение информации о метках времени из подписанного PDF

У меня есть тысячи PDF-документов, подписанных и проставленных с помощью iText.

По юридическим причинам мне теперь нужно иметь возможность извлекать из любого PDF-файла все данные, связанные с отметкой времени (включая дату/время, конечно, но также имя TSA, его публичный сертификат, подписанный хеш и используемый алгоритм).

Я могу определить, действительно ли PDF имеет отметку времени, и извлечь дату/время с помощью следующего фрагмента кода (на основе найденного здесь):

AcroFields acroFields = reader.getAcroFields();

List<String> names = acroFields.getSignatureNames();
String sigName = names.get(names.size() - 1);
PdfPKCS7 pdfPkcs7 = acroFields.verifySignature(sigName);

for (String name: names) {
System.out.printf("Signature : %s\n", name);

if (pdfPkcs7.getTimeStampDate() != null) {
    SimpleDateFormat date_format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SS");
    System.out.println("Signed on: " + date_format.format(pdfPkcs7.getSignDate().getTime()));
    System.out.println("TimeStamp: " + date_format.format(pdfPkcs7.getTimeStampDate().getTime()));
    System.out.println("Timestamp token : " + pdfPkcs7.getTimeStampToken().toString());
    System.out.println("Timestamp verified : " + pdfPkcs7.verifyTimestampImprint());
    System.out.println("Subject: " + pdfPkcs7.getSigningCertificate());
} else {
    System.out.println("No timestamp found");
}

Я думал, что моя цель может быть легко достигнута с помощью getTimeStampToken() и getSigningCertificate()... На самом деле getTimeStampToken() возвращает что-то вроде org.bouncycastle.tsp.TimeStampToken@59f55efc, а getSigningCertificate() возвращает информацию, относящуюся к сертификату, используемому для подписи документа, который не имеет ничего общего с тот, который используется TSA.

Может ли кто-нибудь помочь мне получить ожидаемый результат?


person Silas    schedule 23.12.2018    source источник
comment
Надувной замок TimeStampToken имел множество областей интересов. Вы смотрели на них?   -  person mkl    schedule 24.12.2018


Ответы (1)


а getSigningCertificate() возвращает информацию о сертификате, использованном для подписи документа,

Правильно - он делает то, что говорит название ;-)

который не имеет ничего общего с тем, который используется TSA.

Опять правильно.

На самом деле getTimeStampToken() возвращает что-то вроде org.bouncycastle.tsp.TimeStampToken@59f55efc

Это просто означает, что метод toString() не был перезаписан. Как указал mkl, вы пытались получить доступ к некоторым полям/атрибутам? Вместо

System.out.println("Timestamp token : " + pdfPkcs7.getTimeStampToken().toString());

попробуйте что-то вроде:

org.bouncycastle.tsp.TimeStampToken ts = pdfPkcs7.getTimeStampToken();
ASN1ObjectIdentifier algOID = ts.getTimeStampInfo().getMessageImprintAlgOID();
...
//there are so many infos, just have a look at the TimeStampToken object!
person Lonzak    schedule 02.01.2019