Извлечение информации о метках времени из подписанного PDF - PullRequest
0 голосов
/ 23 декабря 2018

У меня есть тысячи документов 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.

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

1 Ответ

0 голосов
/ 02 января 2019

и 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!
...