我们需要基于 X509 证书(当然包括私钥)和 RFC 3161 实现我们自己的 PDF 时间戳机制。我已经用谷歌搜索并在这里询问了 SO,正确的解决方案是重新实现 TSAClient 类为我们在本地做时间戳(没有在线 TSA)。但是,除了 SecureBlackbox 组件,我没有找到 RFC 3161 的任何实现。Bouncy Castle 图书馆应该可以,但我不知道怎么做。
你能指出我正确的方向吗?
可以使用 Bouncycastle 库生成 RFC3161 时间戳记号。
首先创建一个 TimestampRequest。对于您的情况,它只是摘要算法和摘要值的包装器。
byte[] document = /* ... */
byte[] digest = MessageDigest.getInstance("SHA256").digest(document);
TimeStampRequestGenerator tsReqGen = new TimeStampRequestGenerator();
TimeStampRequest tsReq = tsReqGen.generate(CMSAlgorithm.SHA256, digest);
然后生成令牌
DigestCalculator dgCalc = new JcaDigestCalculatorProviderBuilder().build();
ContentSigner signer = new JcaContentSignerBuilder().build(getPrivateKey());
SignerInfoGenerator siGen = new JcaSignerInfoGeneratorBuilder(new JcaDigestCalculatorProviderBuilder()).build(signer, getCertificate());
ASN1ObjectIdentifier policy = new ASN1ObjectIdentifier("1.2.3.4.5.6"); // Replace by your timestamping policy OID
TimeStampTokenGenerator tstGen = new TimeStampTokenGenerator(siGen, dgCalc, policy);
/* Set the parameters e.g. set the accuracy or include the signing certificate */
TimeStampToken tst = tstGen.generate(tsReq, generateSerialNumber(), new Date());
byte[] encoding = tst.getEncoded();