【发布时间】:2014-04-18 00:03:06
【问题描述】:
我使用 PADES LTV 个人资料签署文件。 Signer 库是基于 Pdfbox 库编写的。
我有一个问题。
在 PADES LTV 配置文件中,最终修订版必须在线签入(这意味着该修订版的 OCSP 响应、CRLS 和证书不得在文档安全存储 (DSS) 中)。
为了测试,我在我的文档中添加了 12 个修订版。
每当我添加新修订版时,我都会不将这个当前修订版的证书和 ocsp 响应添加到 DSS。我将以前的修订证书和 ocsp 响应添加到 DSS。我这样做是因为上次修订必须在线签入。所以我不能将最新版本的 OCSP 响应添加到 DSS。我这样做了,但有时 Adobe 读者认为最新版本在文档中嵌入 OCSP 响应。
问题可能在于:
每个 ocsp 响应必须是唯一的,即使我们使用相同的证书生成它们也是如此。换句话说,如果我们两次请求 ocsp 对象,它们必须是唯一的。
为此,我执行以下操作,但它不起作用:
private OCSPReq buildOcspRequest(X509Certificate issuerCert, BigInteger serialNumber, File inputDocument) {
InputStream is = new FileInputStream(inputDocument);
X509CertificateHolder certificateHolder;
certificateHolder = new X509CertificateHolder(issuerCert.getEncoded());
CertificateID id = new CertificateID(new BcDigestCalculatorProvider().get(CertificateID.HASH_SHA1), certificateHolder, serialNumber);
OCSPReqBuilder ocspReqBuilder = new OCSPReqBuilder();
ocspReqBuilder.addRequest(id);
DigestCalculatorProvider digestCalculatorProvider;
JcaDigestCalculatorProviderBuilder digestCalcProvBuilder = new JcaDigestCalculatorProviderBuilder().setProvider("BC");
digestCalculatorProvider = digestCalcProvBuilder.build();
// get SHA 256
DigestCalculator digest = digestCalculatorProvider.get(AlgorithmIdentifier.getInstance("2.16.840.1.101.3.4.2.1"));
OutputStream os = digest.getOutputStream();
IOUtils.copy(is, os);
byte[] messageImprint = digest.getDigest();
BigInteger time = BigInteger.valueOf(System.currentTimeMillis());
// time + imprint
byte[] nonce = ArrayUtils.addAll(time.toByteArray(), messageImprint);
Extension extension = new Extension(OCSPObjectIdentifiers.id_pkix_ocsp_nonce, true, nonce);
ocspReqBuilder.setRequestExtensions(new Extensions(extension));
return ocspReqBuilder.build();
}
这是测试pdf链接SAMPLE PDF
我可能会创建 4 个修订版,一切都会好起来的...我不知道,有时会发生...当我在测试时,当我创建许多修订版时会出现问题...最后REVISION 认为 OCSP 对以前的版本的响应是它自己的!
【问题讨论】:
标签: pdf digital-signature bouncycastle digital-certificate ocsp