【问题标题】:Adding a timestamp to a PDF corrupts the file向 PDF 添加时间戳会损坏文件
【发布时间】:2017-08-25 20:46:20
【问题描述】:

我正在尝试使用 TSA 服务器为 PDF 文件添加时间戳,但在添加时间戳后,Adobe Reader 显示文档自签名后已被更改或损坏。

测试代码:

@SpringBootApplication
public class TestTimestampApplication implements CommandLineRunner {

public static void main(String[] args) {
    SpringApplication.run(TestTimestampApplication.class, args);
}

@Override
public void run(String... arg0) throws Exception {
    TSAClient tsa = new TSAClientBouncyCastle("http://tsa.buenosaires.gob.ar/TSS/HttpTspServer");

    try (OutputStream os = new FileOutputStream("I:/output.pdf")) {
        PdfReader reader = new PdfReader("I:/input.pdf");
        PdfStamper stamper = PdfStamper.createSignature(reader, os, '\0', null, true);

        PdfSignatureAppearance sap = stamper.getSignatureAppearance();
        LtvTimestamp.timestamp(sap, tsa, "Atenea");
    }
}

}

我正在使用这些框架来做时间戳:

    <dependency>
        <groupId>com.itextpdf</groupId>
        <artifactId>itextpdf</artifactId>
        <version>5.5.12</version>
    </dependency>
    <dependency>
        <groupId>org.bouncycastle</groupId>
        <artifactId>bcprov-jdk15on</artifactId>
        <version>1.58</version>
    </dependency>
    <dependency>
        <groupId>org.bouncycastle</groupId>
        <artifactId>bcpkix-jdk15on</artifactId>
        <version>1.58</version>
    </dependency>

当我打开输出文件时,我得到了这个:

知道可能是什么问题吗??

输出文件示例:https://drive.google.com/file/d/0B5OSF4ESCy5gRU5xTXQxU2NEMmM/view?usp=sharing

谢谢, 朱利安

【问题讨论】:

  • 请分享一个带有时间戳的 pdf 样本。
  • @mkl 添加了示例
  • @joelgeraci 如果我正确理解代码,该示例会为 PDF 文件中已存在的签名添加时间戳。我想要实现的是添加一个没有签名的时间戳(我开始怀疑它是否可能)
  • “我想要实现的是添加一个没有签名的时间戳(我开始怀疑这是可能的” - 没有规范要求这样做文档时间戳只允许在签名之后。结果只是不匹配任何基线或扩展 PAdES 配置文件,但这些配置文件无论如何都是以签名为中心的。特别是结果不应声称更改或损坏。

标签: java pdf timestamp itext bouncycastle


【解决方案1】:

首先,时间戳的TSTInfo中的MessageImprint包含时间戳字节范围的正确哈希值。因此,问题一定是不同的。

##扩展密钥用法

TSA 证书的 Extended Key Usage 扩展的 ASN.1 表示形式如下所示:

 951   49: . . . . . . . . SEQUENCE {
 953    3: . . . . . . . . . OBJECT IDENTIFIER extKeyUsage (2 5 29 37)
         : . . . . . . . . . . (X.509 extension)
 958   42: . . . . . . . . . OCTET STRING, encapsulates {
 960   40: . . . . . . . . . . SEQUENCE {
 962    8: . . . . . . . . . . . OBJECT IDENTIFIER
         : . . . . . . . . . . . . serverAuth (1 3 6 1 5 5 7 3 1)
         : . . . . . . . . . . . . (PKIX key purpose)
 972    8: . . . . . . . . . . . OBJECT IDENTIFIER
         : . . . . . . . . . . . . codeSigning (1 3 6 1 5 5 7 3 3)
         : . . . . . . . . . . . . (PKIX key purpose)
 982    8: . . . . . . . . . . . OBJECT IDENTIFIER
         : . . . . . . . . . . . . timeStamping (1 3 6 1 5 5 7 3 8)
         : . . . . . . . . . . . . (PKIX key purpose)
 992    8: . . . . . . . . . . . OBJECT IDENTIFIER
         : . . . . . . . . . . . . ocspSigning (1 3 6 1 5 5 7 3 9)
         : . . . . . . . . . . . . (PKIX key purpose)
         : . . . . . . . . . . . }
         : . . . . . . . . . . }
         : . . . . . . . . . }

这尤其意味着证书被标记为用于服务器身份验证、代码签名、时间戳和 OCSP 签名。此外,该扩展未标记为关键。

另一方面,RFC 3161 要求:

###2.3。 TSA 的识别

TSA 必须使用保留的密钥对每个时间戳消息进行签名 专门为此目的。 TSA 可能有不同的私钥, 例如,为了适应不同的策略、不同的算法, 不同的私钥大小或提高性能。这 对应的证书必须只包含一个实例 [RFC2459] 部分中定义的扩展密钥使用字段扩展 4.2.1.13 KeyPurposeID 具有值:

id-kp-timeStamping。此扩展程序必须很关键。

(RFC 3161 section 2.3)

因此,该 TSA 的证书不得用于生成 RFC 3161 时间戳,因此使用它生成的所有时间戳都无效。

【讨论】:

    猜你喜欢
    • 2014-08-07
    • 2017-11-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-18
    • 2014-07-13
    • 1970-01-01
    相关资源
    最近更新 更多