2017-08-25 58 views
0

我试图使用TSA服务器将时间戳添加到PDF文件,但添加了时间戳后Adobe Reader说该文档自签名以来已被更改或损坏。向PDF添加时间戳损坏文件

测试代码:

@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> 

当我打开输出文件,我得到这样的:

enter image description here

任何想法可能是什么问题?

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

感谢, 胡利安

+0

看看这个示例... http://developers.itextpdf.com/examples/security/digital-signatures-white-paper/digital-signatures-chapter-5#888-c5_04_ltv.java – joelgeraci

+0

请分享样本时间戳pdf。 – mkl

+0

@mkl添加了示例 – shulito

回答

2

首先,在时间戳的TSTInfoMessageImprint包含时间戳的字节范围的正确的哈希值。因此,这个问题肯定是不同的。

扩展密钥用法

的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可以具有不同的私钥,例如,以适应不同的策略,不同的算法,不同的私钥大小或提高性能。如[RFC2459]部分 4.2.1.13与具有值KeyPurposeID定义的 相应的证书必须仅包含一个所述 扩展密钥用法字段扩展的实例:

ID-KP-时间戳。这个扩展必须是关键的。

RFC 3161 section 2.3

因此,TSA的证书不能被用来产生RFC 3161个时间戳,所以用它产生的所有时间标记是无效的。