当前位置: 首页 > 知识库问答 >
问题:

已签名的PDF尚未准备好LTV

齐典
2023-03-14

我正试图用BouncyCastle CMS签署一份PDF文件。签名有效,但Adobe Reader告诉我它还没有准备好LTV。

据我所知,CRL嵌入在CMS SignedData中。证书也被嵌入其中。还嵌入了时间戳。

签名是一个分离的签名,放在“预留空间”。

为什么签名还没有准备好?我是不是做错了什么?

签名测试-PDF:http://www.filedropper.com/outputx

代码:

    CMSSignedDataGenerator gen = new CMSSignedDataGenerator();
    // CertificateChain
    List<Certificate> certList = Arrays.asList(certChain);

    try {

        Hashtable signedAttrs = new Hashtable();
        X509Certificate signingCert = (X509Certificate) certList.get(0);
        gen.addSignerInfoGenerator(new JcaSimpleSignerInfoGeneratorBuilder().setProvider("BC")
                .setSignedAttributeGenerator(new AttributeTable(signedAttrs))
                .build("SHA256withRSA", privKey, signingCert));

        gen.addCertificates(new JcaCertStore(certList));
        boolean embedCrls = true;
        if (embedCrls) {
            X509CRL[] crls = fetchCRLs(signingCert);
            for (X509CRL crl : crls) {
                gen.addCRL(new JcaX509CRLHolder(crl));
            }
        }
        // gen.addOtherRevocationInfo(arg0, arg1);

        CMSProcessableByteArray processable = new CMSProcessableByteArray(IOUtils.toByteArray(content));

        CMSSignedData signedData = gen.generate(processable, false);
        if (tsaClient != null) {
            signedData = signTimeStamps(signedData);
        }
        return signedData.getEncoded();
    } catch (Exception e) {
        throw new RuntimeException(e);
    }

共有1个答案

席俊
2023-03-14

在可互操作的PDF签名中,有两种方法可以添加与验证相关的信息,它们都没有使用默认的CMS方法来添加代码使用的CRL。

旧的ISO 32000-1样式的ISO 32000中使用的PKCS#7签名(后来基于CMS而不是PKCS#7)被指定为在Adobe注册的OID的专用签名属性中包含撤销信息:

adbe吊销信息属性:

adbe-revocationInfoArchival OBJECT IDENTIFIER ::=
                            { adbe(1.2.840.113583) acrobat(1) security(1) 8 }

吊销信息属性的值可以包括以下任何数据类型:

  • RFC 3280(参见参考书目)中描述的证书撤销列表(CRL):CRL通常较大,因此不应嵌入PKCS#7对象中

adbe的吊销信息属性值具有ASN。1类撤销:

RevocationInfoArchival ::= SEQUENCE {
   crl [0] EXPLICIT SEQUENCE of CRLs, OPTIONAL
   ocsp [1] EXPLICIT SEQUENCE of OCSP Responses, OPTIONAL
   otherRevInfo [2] EXPLICIT SEQUENCE of OtherRevInfo, OPTIONAL
}
OtherRevInfo ::= SEQUENCE {
   Type OBJECT IDENTIFIER
   Value OCTET STRING
}

(显然这只是伪ASN.1…)

由于此结构是已签名属性的值,因此必须在签名之前获取吊销信息,才能像这样添加。

对于他们的PAdES签名,ETSI指定了额外的PDF结构,添加到可携带额外验证相关信息的已签名PDF文档中,请参阅ETSI EN 319 142。这些结构后来被整合到ISO 32000-2中:

文件安全存储(DSS)应为字典,该字典应为文件目录字典中DSS密钥的值(见7.7.2,“文件目录字典”)。本词典可能包含:

  • 文档中出现的用于签名(包括时间戳签名)的所有证书的数组。它还应持有验证参与证书链验证的证书所需的所有辅助证书

任何VRI字典(如有)应位于文件增量更新部分。如果VRI字典适用的签名字典本身处于增量更新部分,则DSS/VRI更新应在签名更新之后进行。包含VRI字典条目是可选的。VRI条目中引用的所有验证材料也包含在DSS条目中。

...

正如您在这里已经读到的,这种结构是为在签名后添加信息而设计的。这与ETSI一起支持在签名后生成的用于验证的撤销信息。

你在标签中提到了PDFBox,所以你似乎使用PDFBox进行签名。

要将预取的验证数据添加到已签名的adbe revocationfoarchive属性中,只需将上述定义的属性添加到代码的signedAttrs

要在文档安全存储(DSS)中添加数据,您可以使用@Tilman在评论中提到的PDFBox示例addValidationInformation的代码。

 类似资料:
  • null 无论我用电子邮件发送apks还是用USB安装apks,问题仍然存在。

  • 结果是,我尝试为ElasticSearch和Kibana添加用户。对于ElasticSearch,我添加了。yml和和。yml。 当我启动ElasticSearch时,系统会提示我输入用户名和密码。我这样做并成功登录。 但是当我开始Kibana,在日志中我得到这个错误: 在http://localhost:5601,我得到了这个错误 为了排除故障,我跑步http://localhost:9200/

  • 我有下面的代码,我想在它上面关闭preparedStatement对象,因为它是作为一个来自sonar的bug提出的。 如何关闭preparedStatement对象?我看到的大多数示例大多使用try/finally或try with resources,然后创建对象并使用它try and close in finally。然而,在这里,对象是在单独的函数中创建的,它从那里返回,然后被使用。所以创

  • 我以编程方式签名PDF。每个新签名都是以增量方式添加的,我在%EOF之后添加签名字典,并像这样更新AcroForm(对不起,我在工作,所以我不能上传PDF): 也许问题是我有多个具有相同ID的对象,而我的最后一个AcroForm只引用了最后一个签名?我想能够签署一个文件多次,但我有一个问题。第一次签名没有问题,并显示以下横幅: 然后我尝试用另一个证书再次对同一个文件进行签名,这给了我签名旁边的垃圾

  • 问题是,当请求者请求时,数据可能还没有准备好,所以请求的未来可能会失败。我需要给发送者发送一些东西来保证有数据,但显然Akka似乎没有promiseAkaik。 这里如何落实?

  • 问题内容: 通过JDBC对pgbouncer执行批处理查询时,出现以下错误: 我在网上发现了错误报告,但它们似乎都适用于Postgres 8.3或更低版本,而我们正在使用Postgres 9。 这是触发错误的代码: 有人看过吗? 编辑1: 事实证明,这是使用 会话池 以外的任何方法时都会发生的pgBouncer问题。我们正在使用 事务池 ,它显然不支持准备好的语句。通过切换到 会话池 ,我们解决了