我使用 PADES LTV Profile 签署文件。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 个修订版,一切可能都很好......我不知道,有时会发生......当我测试时,当我创建许多修订版时会出现问题...... 最后一个修订版认为 OCSP 响应以前的版本是它自己的!