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

时间:2018-01-11 16:28:13

标签: java validation pdf itext

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

Java代码来自iText 5 example site

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>

感谢您的回复。

1 个答案:

答案 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()验证的时间戳是签名时间戳。

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