0

我有数千个使用 iText 签名并加盖时间戳的 PDF 文档。

出于法律原因,我现在需要能够从任何 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 使用。

有人可以帮助我获得预期的结果吗?

4

1 回答 1

0

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!
于 2019-01-02T15:29:36.017 回答