2014-01-27 38 views
3

我们需要基于X509证书来实现我们自己的PDF时间戳机制来构建一个RFC 3161时间戳(当然也包括私有密钥)和RFC 3161我GOOGLE了,问here on SO和妥善的解决办法是重新实施TSAClient课程,为我们在本地做时间戳(没有在线TSA)。但是,除了SecureBlackbox组件外,我没有发现任何RFC 3161的实现。 Bouncy Castle图书馆应该可能,但我不知道如何。如何使用充气城堡

能否请你点我正确的方向?

回答

5

,能够生成具有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();