iText pdf 时间戳验证返回 false,为什么?



我使用iText 5.5.10来验证pdf文件中的时间戳。有人可以解释一下,为什么调用pkcs7.verifyTimestampImprint()方法返回 false?

Java 代码来自 iText 5 示例站点,

请参阅C5_02_SignatureInfo.java作为输入文件

使用testpdf_timestamp.pdf。

法典:

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>

感谢您的回复。

原因

为什么调用pkcs7.verifyTimestampImprint()方法返回 false

是此方法用于验证签名时间戳的印记,而不是用于验证文档时间戳的印记。

PdfPKCS7是一个用于创建和验证签名以及请求时间戳(用作签名时间戳)和验证时间戳(签名和文档)的类。因此,并非所有方法在每个用例中都有意义。不幸的是,JavaDocsPdfPKCS7并没有特别明确何时使用哪些方法。

对于文档时间戳,时间戳印记的验证已在verify调用期间进行。


您引用了本网站上C5_02_SignatureInfo.java的代码,该代码清楚地表明"这些示例是在白皮书PDF文档的数字签名的上下文中编写的"。

在该白皮书中,您可以看到您在C5_02_SignatureInfo.java中找到的代码来自第 5.2 章"从签名中检索信息",verifyTimestampImprint()验证的时间戳是签名时间戳。

对于文档时间戳验证,您应该在后面的章节中查看代码。

最新更新