我有成千上万个使用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使用的证书无关。
能帮我得到预期的结果吗?
答案 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!