从签名的PDF中提取时间戳信息

时间:2018-12-23 14:49:13

标签: itext trusted-timestamp

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

出于法律原因,我现在需要能够从任何PDF中提取与时间戳有关的所有数据(当然包括日期/时间,还包括TSA名称,其公共证书,签名的哈希和所使用的算法)。

我可以检测PDF是否确实带有时间戳,并使用以下代码段(受发现的here启发)提取日期/时间:

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和{{1} }返回与用于签署文档的证书相关的信息,与TSA使用的证书无关。

能帮我得到预期的结果吗?

1 个答案:

答案 0 :(得分: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!
相关问题