2017-08-25 52 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個時間戳,所以用它產生的所有時間標記是無效的。