0

我使用 PADES LTV Profile 签署文件。Signer 库是基于 Pdfbox 库编写的。

我有一个问题。

在 PADES LTV 配置文件中,最终修订必须在线签入(这意味着 OCSP 响应、CRLS 和此修订的证书不得在文档安全存储 (DSS) 中)。

为了测试,我在我的文档中添加了 12 个修订版。

每次添加修订时,我都不会将当前修订的证书和 ocsp 响应添加到 DSS。我将以前的修订证书和 ocsp 响应添加到 DSS。我这样做是因为最后一次修订必须在线签入。所以我不能将最新版本的 OCSP 响应添加到 DSS。我这样做了,但有时 Adob​​e 读者认为最新版本在文档中 嵌入了 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 响应以前的版本是它自己的!

4

1 回答 1

1

在 PADES LTV 配置文件中,最终修订必须在线签入

不。

PAdES,即 ETSI TS 102 778,在第 4 部分(PAdES-LTV 配置文件)中仅建议这样做:

4.3 验证过程

建议验证过程如下:

1)“最新”文档时间戳应在当前时间验证,并在当前时间收集验证数据。

单词应该表示推荐,而前面的句子实际上将其拼写出来。

但是让我们假设您想遵循建议。你的解释

(这意味着此修订版的 OCSP 响应、CRLS 和证书不得位于文档安全存储 (DSS) 中)。

仍然不正确:文档中可能存在验证相关信息(OCSP 响应、CRL、证书),这些信息(被视为孤立信息)适用于外部时间戳或签名。如果您使用相同的时间戳服务连续两次为您的文档添加时间戳,并在其间为第一个时间戳中使用的证书添加 CRL,则外部时间戳可能涉及此 CRL 涵盖的证书并应用于CRL 指示的有效间隔。

不,如果验证者选择遵循上面引用的 PAdES-LTV 建议,则验证者有责任不使用这些信息。

Adobe Reader并未声称遵循此建议(至少据我所知)。因此,如果您使用 Adob​​e Reader 验证签名和时间戳,则文档中包含的信息也可用于验证外部时间戳。

实际上,Adobe 最初喜欢首先检索与验证相关的信息,然后对包括这些信息在内的所有内容进行签名和时间戳的概念。

问题可能在于:

每个 ocsp 响应必须是唯一的,即使我们使用相同的证书生成它们也是如此。换句话说,如果我们两次请求 ocsp 对象,它们必须是唯一的。

不。虽然使用 nonce 是一种很好的风格,但您的观察与它们无关。

Adobe Reader有时(并且仅有时)使用已经嵌入的信息来验证外部签名/时间戳的原因是 OCSP 响应和 CRL 具有由其thisUpdatenextUpdate字段定义的有效间隔,有时(如果您添加多个时间戳) TSA)尽管被嵌入用于验证较旧的时间戳,但仍包含新添加的时间戳的时间(因此,也用于它们的验证)。

如果您想防止这种情况发生,您必须检查 PDF 中已包含或您刚刚添加到其中的 OCSP 响应和 CRL,检查其各自的有效间隔尚未结束的那些,并且不对文档应用任何时间戳可以使用他们验证其证书。

于 2014-03-13T14:21:25.720 回答