我尝试使用 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
谢谢, 朱利安
首先,时间戳的
MessageImprint
中的TSTInfo
包含时间戳字节范围的正确哈希值。因此,问题一定是不同的。
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-时间戳。 此扩展必须至关重要。
因此,该 TSA 的证书不得用于生成 RFC 3161 时间戳,因此用它生成的所有时间戳都是无效的。