无法弄清楚为什么我的 PDF 签名未启用 LTV

Can't figure out why my PDF signature is not LTV enabled

我正在生成带有签名的 PDF 文档,我希望它启用 LTV。 为此,我在创建 PDF 时对其进行签名,然后添加包含 DSS 和验证相关信息 (VRI) 的第二个版本。 正如我在一些文章中发现的那样,我需要添加证书链(没有根证书 - 授权机构)和证书吊销列表 (CRL)。在我的例子中,两者都有 2 个元素。之后,我添加了 VRI 的条目,它是签名内容的 SHA-1 哈希值(在 /Contents 的第一个 PDF 版本中找到),其值引用了上面提到的证书和 CRL。

对于证书和吊销列表元素,我都使用内容的原始字节流。

这是 my PDF sample

编辑

我获取 CRL 信息的方式是这样使用 WynCrypt:

//Retrieve chained certificate
if(!CertGetCertificateChain(hChainEngine, pSignerCert, pTime, hAdditionalStore, &chainPara, dwFlags, NULL, &ppChainContext))
    return NULL;

//first cert in chain is the end cert; last one is the root cert
for(int i = 0; i < ppChainContext->cChain; ++i)
{
    PCERT_SIMPLE_CHAIN simpleChain = ppChainContext->rgpChain[i];

    for(int j = 0; j < (int)simpleChain->cElement - 1; j++)//do not include root certificate
    {
        PCERT_CHAIN_ELEMENT chainElement = simpleChain->rgpElement[j];

        if(chainElement->pCertContext)
        {   
            //the certificate bytes
            byte* certBytes =chainElement->pCertContext->pbCertEncoded
        }

        if(chainElement->pRevocationInfo && chainElement->pRevocationInfo->pCrlInfo)
        {
            PCCRL_CONTEXT crlContext = chainElement->pRevocationInfo->pCrlInfo->pBaseCrlContext;//get revocation context

            //the bytes that will be written in PDF
            byte* crlBytes = crlContext->pbCrlEncoded;
        }
    }
}

刚刚快速浏览了一下,对象 15 和 16 是 OCSP 响应,但您将它们添加为 CRL:

Stream Object 15

Stream Object 16

This ASN.1 Decoder is very handy!

在我的源代码查看器中,DSS 字典(对象 21)是:

<<
/CRLs 19 0 R
/Certs 20 0 R
/VRI 18 0 R
>>

19 指向数组原子: [15 0 R 16 0 R]

同样,对于 LTV,VRI 不是必需的,它目前基本上是一种优化(参见 ETSI TS 102 778-4 中的附录 A1,它基本上取自 PDF 2.0 规范)。如果您使用它并添加时间戳(/TS 条目),Adobe 目前甚至无法正确显示它。在 VRI 中,TU/TS 也是完全可选的,不会影响 LTV 有效性(同上)。

字词"LTV enabled"

据我所知,"LTV enabled"这个词的含义还没有正式的规范。其中有一些不规范的描述,特别是:

  • Leonard Rosenthol(PDF 架构师兼 Adob​​e 首席科学家)曾将其描述为

    LTV enabled means that all information necessary to validate the file (minus root certs) is contained within.

    (iText mailing list on Jan 10, 2013)

  • 另一位 Adob​​e 员工 Steven.Madwin 将实施描述为

    As part of the validation process [Acrobat] figures out if it has to go online to download revocation information, or, is all of the revocation information embedded in the PDF file. At this point it knows what it's going to say in the Signature Navigation Panel. If it had to download data then the signature is not LTV enabled, but if all of the revocation collateral is in the file then the signature is LTV enabled.

    (Adobe support forums on Sep 24, 2013)

因此,术语 "LTV enabled" 的含义取决于 Adob​​e Acrobat 签名验证算法(封闭源代码且不一定固定)的实现细节和基础配置。 你可以在多个旧的堆栈溢出答案中读到我对此的咆哮......

尽管如此,这些实现细节下的机制并不是完全随意的,它们本质上形成了关于该主题的现有已发布规范(特别是 RFC)的配置文件(尽管是专有的、封闭的,甚至可能会发生变化)。

特别是你应该做什么才能让你的签名被标记为 "LTV enabled",特别是添加验证者在验证过程中可能需要的所有信息,特别是

  • 将签名者证书中的所有中间证书添加到 Adob​​e 信任的证书中。如果您不确定哪些证书是可信的,请将所有证书添加到根证书。如果您知道这些证书中的任何一个由另一个 CA 交叉签名,请添加所有这些可能链的证书。
  • 对于所有这些证书(根证书除外)检索吊销信息(CRL 或 OCSP 响应)并添加它们。
  • 对于每个添加的 CRL 和 OCSP 响应,确定其各自的签名者证书,将该证书及其链中的证书添加到文档中,以检索并为它们添加吊销信息(除非它们是根证书,或带有id-pkix-ocsp-nocheck 扩展名,或者您已经拥有它们的吊销信息)等等。

不过,仍然存在一个挑战,那就是确定如何将所有这些信息添加到您的 PDF 中。

如果您在签名前知道签名者证书,则可以将所有证书添加到签名容器中的证书存储中以创建,并将所有吊销数据添加到 [=12= 的签名 adbe-revocationInfoArchival 属性中] 其中。

如果不这样做,您可以将这些证书和吊销信息放入 PAdES 文档安全存储 (DSS) 中,即放入已签名 PDF 增量更新中的特殊结构中。该 DSS 尚未在 ISO 32000-1 中定义;最初在ETSI技术规范(ETSI TS 102 778-4)及后来的规范(ETSI EN 319 142-1)中定义,并被采纳到当前的PDF规范ISO 32000-2中。

为什么您的 PDF 签名未启用 LTV

您的 PDF 使用 DSS 存储证书和吊销信息,但存在不足。

正如 Peter G 在 中所解释的那样,CRLsCRL 数组中的 PDF 的 DSS 不包含实际 CRL。

其中的对象并不像 Peter G 所说的那样只是 OCSP 响应,而是包装到其他结构中的 OCSP 响应。这些对象中的实际 OCSP 响应从偏移量 160 开始...

我猜你在 crlContext->pbCrlEncoded 缓冲区中的代码包含一些用于任意撤销信息的包装器,你必须首先解析它以查看它实际上是哪种类型,然后解开实际的撤销信息对象并根据到它的类型。我不知道 WynCrypt,所以这纯属猜测...

DSS 中的可选元素

两年前,我也建立了一个 LTV-enabler。当时的实验表明,Adobe Acrobat 需要某些指定为可选的 DSS 元素,至少在某些情况下是这样:我使用 Adob​​e Acrobat 启用了 LTV 的 PDF,并逐步将该 PDF 缩减为我构建的内容。事实证明,VRI DSS 小节和其中的 TU 条目是必需的,删除其中任何一个都会使文件无法启用 LTV。

我现在使用我的 LTV 启用程序(实际上是一个可以提供额外证书的变体)来启用 LTV 的 PDF。这奏效了。出于兴趣,我还减少了这个支持 LTV 的 PDF。有趣的是,我可以删除 TU 甚至 VRI 而不会丢失启用 LTV 的状态。

因此,要么 Adob​​e Acrobat 已更改为不再需要这些元素,要么我在以前的实验中开始使用的文件是一种需要额外数据的特殊情况,而在其他情况下则不需要。

解决方案

解决此问题的解决方案相同: