Как построить временную метку RFC 3161 с помощью Bouncy Castle

Нам нужно реализовать наш собственный механизм отметки времени PDF, основанный на сертификате X509 (включая, конечно, закрытый ключ) и RFC 3161. Я гуглил и спросил здесь о SO, и надлежащим решением было бы повторно реализовать класс TSAClient, чтобы делать отметки времени локально для нас. (без онлайн TSA). Однако я не нашел никакой реализации RFC 3161, кроме компонентов SecureBlackbox. Это должно быть возможно с библиотеками Bouncy Castle, но я не знаю как.

Можете ли вы указать мне правильное направление?

1 ответ

Решение

Можно сгенерировать токен метки времени RFC3161 с библиотеками Bouncycastle.

Сначала создайте 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();
Другие вопросы по тегам