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

iText 7将ltv添加到现有签名

刘高峯
2023-03-14

我是新来的iText 7,我已经尝试添加ltv信息到现有的签名通过使用addolv()方法(下面提供的代码)...如果我理解正确的话,这个方法将crl或ocsp参数添加到现有的签名或时间戳中,然后对文档进行时间戳,但是生成的pdf文档没有启用ltv。然而,如果我首先用ocsp或crl列表签署文档,我就能够生成支持LTV的签名,这让我相信这个问题与某些证书丢失或未正确添加无关。因此,由于某种原因,addLetv()方法对我不起作用。我希望我是有意义的: D任何帮助或建议都是非常有用的:)

    private void addLtv(String src, String dest, IOcspClient ocsp, ICrlClient crl, ITSAClient tsa) throws Exception {
    PdfReader r = new PdfReader(src);
    FileOutputStream fos = new FileOutputStream(dest);
    PdfDocument pdfDoc = new PdfDocument(new PdfReader(src), new PdfWriter(dest));
    PdfSigner ps= new PdfSigner(r, fos, true);

    LtvVerification v = new LtvVerification(pdfDoc);
    SignatureUtil signatureUtil = new SignatureUtil(pdfDoc);

    List<String> names =   signatureUtil.getSignatureNames();
    String sigName = names.get(names.size() - 1);

    PdfPKCS7 pkcs7 = signatureUtil.verifySignature(sigName);

    if (pkcs7.isTsp()) {
        v.addVerification(sigName, ocsp, crl,
                LtvVerification.CertificateOption.WHOLE_CHAIN,
                LtvVerification.Level.CRL,
                LtvVerification.CertificateInclusion.YES);
    }
    else {
        for (String name : names) {
            v.addVerification(name, ocsp, crl,
                    LtvVerification.CertificateOption.WHOLE_CHAIN,
                    LtvVerification.Level.OCSP,
                    LtvVerification.CertificateInclusion.YES);
            v.merge();
        }
    }
    ps.timestamp(tsa, null);
}

共有1个答案

谢奇略
2023-03-14

代码中的概念性问题是,在添加LTV信息后,您希望通过时间戳完成流程。虽然这是您希望对已经在LTV工作流中的PDF执行的操作,但这不是您希望对所有签名都要由Adobe Reader声明为“已启用LTV”的PDF执行的操作。

(可以考虑Adobe的术语“启用LTV”来表示“准备进入LTV工作流”,即实际上还没有处于LTV工作流程中,但包含了不需要进一步的ADO输入的所有验证信息。

在您的方法中也存在其他问题,例如,您创建了两个独立的html" target="_blank">对象,它们写入dp,通过fos创建的PdfSigner ps和通过其PdfWriter创建的PdfDocer pdfDoc。最终,您可以在文件中找到其中一个对象的输出,也可以找到两者的混搭。

因此,这里是我的旧iText 5方法的工作端口addtlvNoTS(从这个答案)到iText 7:

void addLtvNoTS(InputStream src, OutputStream dest, IOcspClient ocsp, ICrlClient crl, LtvVerification.Level timestampLevel, LtvVerification.Level signatureLevel) throws IOException, GeneralSecurityException 
{
    PdfDocument pdfDoc = new PdfDocument(new PdfReader(src), new PdfWriter(dest), new StampingProperties().useAppendMode());

    LtvVerification v = new LtvVerification(pdfDoc);
    SignatureUtil signatureUtil = new SignatureUtil(pdfDoc);

    List<String> names = signatureUtil.getSignatureNames();
    String sigName = names.get(names.size() - 1);

    PdfPKCS7 pkcs7 = signatureUtil.verifySignature(sigName);

    if (pkcs7.isTsp())
    {
        v.addVerification(sigName, ocsp, crl, LtvVerification.CertificateOption.WHOLE_CHAIN,
                timestampLevel, LtvVerification.CertificateInclusion.YES);
    }
    else
    {
        for (String name : names)
        {
            v.addVerification(name, ocsp, crl, LtvVerification.CertificateOption.WHOLE_CHAIN,
                    signatureLevel, LtvVerification.CertificateInclusion.YES);
        }
    }

    v.merge();
    pdfDoc.close();
}

(EnableTlv方法addTlvNoTS

如您所见,我进行了ltv验证。级别时间戳和签名方法参数的值。

这是因为iText的方法LTV验证。addVerification仅为即时PDF签名和文档时间戳添加LTV信息,而不是为已经嵌入或现在添加的OCSP响应或CRL签名添加LTV信息。

通常这是没有问题的,通常用于签署OCSP响应的证书被标记为不需要撤销检查,用于签署CRL的证书通常是隐式受信任的CA证书本身。

但是,对于我的测试签名,OCSP响应由需要撤销检查的签名签名。为了使事情在没有大量额外编码的情况下工作,我到处使用CRL,并为此引入了参数。

实际上,我甚至不得不将CRL URL显式地提供给CrlClientOnline,因为默认情况下,iText只使用证书中的第一个CRL分发点,同时不支持LDAP URL。

底线是:您可能还需要调整您的代码,以绕过当前的iText限制,或者改进iText代码本身,以便在任意有效输入的情况下可靠地生成支持LTV的PDF...

 类似资料:
  • 对于IText5,添加数字签名相当容易。其留档的链接是:http://developers.itextpdf.com/examples/security/digital-signatures-white-paper/digital-signatures-chapter-2 有人可以在ITEXT 7中共享文档链接吗?我试过各种方法,但都没有用。在网上找不到任何链接。我可以取消签名并检查签名,但不能添

  • 我需要添加一些文本内容的底部现有的。带有iText的pdf文档。我有一个工作方法,但新内容显示在左上角,与现有内容重叠: 如何“移动”最后一页底部的,而不是第一页的开头?我对iText不熟悉,令人惊讶的是,在网上找不到解决方案。

  • 我正在制作长期签名。我试图将吊销信息(CRL、OCSP响应、证书链)作为未签名属性添加到签名中,但最终签名中未嵌入吊销信息。以下是代码片段: LTV验证。AddVerification()方法在响应中返回true。 请从以下链接找到签名文件:https://1drv.ms/b/s!AvIgyv7xAxxoihGn9aFbe9TQSps4? e=eKPdn8 在这方面的任何帮助都将受到高度赞赏。问候

  • 我正在尝试向PDF文档的第一页添加一些内容。这样做的合适方式是什么? 目前,我的代码可以工作,但它会在文档的第一页之前添加(插入)一个新页面。这里可以用什么来代替 因此,我正在阅读的文档中的内容将作为内容而不是新页面添加到现有的第一页

  • 我们正在尝试启用签名LTV。我正在使用下面的代码添加验证。签名时。isTsp()为false,PDF表示签名未启用LTV,但在另一种情况下(Signature.isTsp()为true),它显示为有效。当我们打开PDF并尝试通过右键单击签名手动添加验证信息时,它将启用LTV,而不会出现任何问题。不知道我们在这里遗漏了什么。任何输入都将非常有用。

  • 我需要将一个使用iText5进行PDF签名验证/创建的Java程序移植到iText7。 旧代码显然不能按原样工作,因为iText的大部分内容都经过了重组。 我找到的所有关于如何做到这一点的例子和教程都是针对iText5的。(非常好的)白皮书也是如此。它们依赖于通过方法返回的列表,在该方法上执行所有与签名相关的操作。 在iText7中,不再具有该方法。 有人知道iText7的例子/文档吗?