Java 向PDF添加时间戳会损坏文件

Java 向PDF添加时间戳会损坏文件,java,pdf,timestamp,itext,bouncycastle,Java,Pdf,Timestamp,Itext,Bouncycastle,我试图使用TSA服务器将时间戳添加到PDF文件中,但添加时间戳后,Adobe Reader表示文档自签名后已被更改或损坏 测试代码: @SpringBootApplication public class TestTimestampApplication implements CommandLineRunner { public static void main(String[] args) { SpringApplication.run(TestTimestampApplicatio

我试图使用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>

com.itextpdf

你知道问题出在哪里吗

输出文件示例:

谢谢,
朱利安首先,时间戳的
TSTInfo
中的
messageprint
包含时间戳字节范围的正确哈希值。因此,问题一定有所不同

扩展密钥使用 TSA证书的扩展密钥使用扩展的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可能具有不同的私钥, e、 例如,为了适应不同的策略、不同的算法, 不同的私钥大小或大小可以提高性能。这个 相应的证书必须只包含一个 [RFC2459]节中定义的扩展密钥使用字段扩展 4.2.1.13 KeyPurposeID具有以下值:

id kp时间戳。这一扩展必须至关重要

()


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

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

扩展密钥使用 TSA证书的扩展密钥使用扩展的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可能具有不同的私钥, e、 例如,为了适应不同的策略、不同的算法, 不同的私钥大小或大小可以提高性能。这个 相应的证书必须只包含一个 [RFC2459]节中定义的扩展密钥使用字段扩展 4.2.1.13 KeyPurposeID具有以下值:

id kp时间戳。这一扩展必须至关重要

()


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

查看此示例。。。请共享带有时间戳的pdf样本。@mkl添加了example@joelgeraci如果我正确理解代码,该示例会向PDF文件中已经存在的签名添加时间戳。我试图实现的是添加一个没有签名的时间戳(我开始怀疑它是否可能)“我试图实现的是添加一个没有签名的时间戳(我开始怀疑它是否可能)”-没有任何规范要求仅在签名后才允许使用文档时间戳。结果仅与任何基线或扩展PAdES配置文件不匹配,但这些配置文件无论如何都是以签名为中心的。特别是,结果不应声称存在更改或损坏。查看此示例…请共享sample带时间戳的pdf。@mkl添加了example@joelgeraci如果我正确理解了代码,该示例会将时间戳添加到PDF文件中已经存在的签名中。我试图实现的是添加一个没有签名的时间戳(我开始怀疑这是否可能)“我试图实现的是添加一个没有签名的时间戳(我开始怀疑这是否可能)“-没有任何规范要求仅在签名后才允许使用文档时间戳。结果仅与任何基线或扩展PAdES配置文件不匹配,但这些配置文件无论如何都以签名为中心。尤其是,结果不应声称存在更改或损坏。