我使用 iText 5.5.10 来验证 pdf 文件中的时间戳。有人可以解释一下,为什么调用 pkcs7.verifyTimestampImprint() 方法会返回false?
Java代码来自iText 5 example site,
将C5_02_SignatureInfo.java视为输入文件
代码:
public static void main(String[] args) throws IOException, GeneralSecurityException {
BouncyCastleProvider provider = new BouncyCastleProvider();
Security.addProvider(provider);
PdfReader reader = new PdfReader("testpdf_timestamp.pdf");
AcroFields fields = reader.getAcroFields();
ArrayList<String> names = fields.getSignatureNames();
for (String name : names) {
System.out.println("===== " + name + " =====");
System.out.println("Signature covers whole document: " + fields.signatureCoversWholeDocument(name));
System.out.println("Document revision: " + fields.getRevision(name) + " of " + fields.getTotalRevisions());
PdfPKCS7 pkcs7 = fields.verifySignature(name);
System.out.println("Integrity check OK? " + pkcs7.verify());
SimpleDateFormat date_format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SS");
System.out.println("Signed on: " + date_format.format(pkcs7.getSignDate().getTime()));
if (pkcs7.getTimeStampDate() != null) {
System.out.println("TimeStamp: " + date_format.format(pkcs7.getTimeStampDate().getTime()));
TimeStampToken ts = pkcs7.getTimeStampToken();
System.out.println("TimeStamp service: " + ts.getTimeStampInfo().getTsa());
// Why pkcs7.verifyTimestampImprint() returns FLASE?
System.out.println("Timestamp verified? " + pkcs7.verifyTimestampImprint());
}
}
}
Maven依赖项:
<!-- https://mvnrepository.com/artifact/com.itextpdf/itextpdf -->
<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>itextpdf</artifactId>
<version>5.5.10</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.bouncycastle/bcpkix-jdk15on -->
<dependency>
<groupId>org.bouncycastle</groupId>
<artifactId>bcpkix-jdk15on</artifactId>
<version>1.49</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.bouncycastle/bcprov-jdk15on -->
<dependency>
<groupId>org.bouncycastle</groupId>
<artifactId>bcprov-jdk15on</artifactId>
<version>1.49</version>
</dependency>
感谢您的回复。
答案 0 :(得分:0)
原因
为什么调用 pkcs7.verifyTimestampImprint() 方法返回false
此方法用于验证签名时间戳的印记,它不用于验证文档时间戳的印记。
PdfPKCS7
是一个用于创建和验证签名以及请求时间戳(用作签名时间戳)和验证时间戳(签名和文档)的类。因此,并非所有方法都适用于每个用例。不幸的是,PdfPKCS7
JavaDocs并没有特别清楚使用哪些方法。
如果是文档时间戳,则verify
调用期间已经验证了时间戳记印记。
您在this site上引用C5_02_SignatureInfo.java
上的代码,该代码清楚地表明“这些示例是在白皮书Digital Signatures for PDF documents的上下文中编写的。” < / p>
在该白皮书中,您可以看到您在C5_02_SignatureInfo.java
中找到的代码来自第5.2章“从签名中检索信息”,而verifyTimestampImprint()
验证的时间戳是签名时间戳。
对于文档时间戳验证,您应该查看后面章节中的代码。