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

使用iText7将撤销信息添加到签名

方坚壁
2023-03-14

我正在制作长期签名。我试图将吊销信息(CRL、OCSP响应、证书链)作为未签名属性添加到签名中,但最终签名中未嵌入吊销信息。以下是代码片段:

        Stream outputStream = new MemoryStream();

        List<byte[]> ocspCollection = new List<byte[]>();
        List<byte[]> crlCollection = new List<byte[]>();
        List<byte[]> certsCollection = new List<byte[]>();

        Stream readerStream = new MemoryStream(signedDocument);
        PdfReader pdfReader = new PdfReader(readerStream);
        PdfSigner pdfSigner = new PdfSigner(pdfReader, outputStream, new StampingProperties().UseAppendMode());

        LtvVerification ltvVerification = new LtvVerification(pdfSigner.GetDocument());

        X509Chain chain = new X509Chain();
        chain.Build(signerCertificate);

        foreach (X509ChainElement item in chain.ChainElements)
        {
            byte[] certBytes = item.Certificate.Export(X509ContentType.Cert);
            certsCollection.Add(certBytes);
        }

        foreach (byte[] ocsp in revocationInfo.OCSPResponses)
        {
            ocspCollection.Add(ocsp);
        }

        foreach (byte[] crlBytes in revocationInfo.CRLs)
        {
            crlCollection.Add(crlBytes);
        }

        bool revocationInfoAdded = ltvVerification.AddVerification(signingRequest.FieldName, ocspCollection, crlCollection, certsCollection);

LTV验证。AddVerification()方法在响应中返回true。

请从以下链接找到签名文件:https://1drv.ms/b/s!AvIgyv7xAxxoihGn9aFbe9TQSps4? e=eKPdn8

在这方面的任何帮助都将受到高度赞赏。问候

共有1个答案

叶稳
2023-03-14

您使用了一个PdfSigner(这只有在应用签名或文档时间戳时才有意义,但是您只提供了已经签名的文件),并且有一些我这里没有的变量。因此,我基本上是基于一个纯粹的PdfDocument和你的共享文件编写了一个例子,没有这些额外的变量:

using (PdfReader pdfReader = new PdfReader("LTV Doc-Revocation Info Issue.pdf"))
using (PdfWriter pdfWriter = new PdfWriter("LTV Doc-Revocation Info Issue-WithRevocation.pdf"))
using (PdfDocument pdfDocument = new PdfDocument(pdfReader, pdfWriter, new StampingProperties().UseAppendMode()))
{
    List<byte[]> ocspCollection = new List<byte[]>();
    List<byte[]> crlCollection = new List<byte[]>();
    List<byte[]> certsCollection = new List<byte[]>();
    ocspCollection.Add(File.ReadAllBytes(@"Ocsp"));
    crlCollection.Add(File.ReadAllBytes(@"Crl.crl"));

    LtvVerification ltvVerification = new LtvVerification(pdfDocument);
    ltvVerification.AddVerification("SH_SIGNATURE_532546", ocspCollection, crlCollection, certsCollection);
    ltvVerification.Merge();
}

检查一个人看到的结果:

特别是,提供的OCSP响应和提供的CRL嵌入在PDF中,因此iTextLtd v验证类执行其工作。

首先你要说:

我试图将撤销信息(CRL、OCSP响应、证书链)作为未签名属性添加到签名中

这已经表明不匹配:您使用LtvVerification类,我也使用上面的工作代码。此类不会更改嵌入的CMS容器。它不会将撤销信息添加到嵌入式CMS容器的未签名属性中,而是添加到PDF的DSS(文档安全存储)结构中。

将撤销数据作为嵌入式CMS签名容器的无符号属性嵌入实际上是不可能的:您可以在CMS容器中使用有符号的adbe-recocationInfoArchival属性,或者在CMS容器外部使用DSS。

(一些验证器接受未签名属性中嵌入CAdES样式的撤销数据,但严格来说,这在PADS中是禁止的,在PDF 2.0中是不可互操作的。)

因此,如果你真的想在CMS容器中嵌入撤销数据,请将它们提供给你选择的PdfSigner签名方法,它们都显式或隐式地接受要嵌入的撤销数据,

public virtual void SignDetached(IExternalSignature externalSignature, X509Certificate[] chain,
    ICollection<ICrlClient> crlList, IOcspClient ocspClient, ITSAClient tsaClient,
    int estimatedSize, PdfSigner.CryptoStandard sigtype)

public virtual void SignDetached(IExternalSignature externalSignature, X509Certificate[] chain,
    ICollection<ICrlClient> crlList, IOcspClient ocspClient, ITSAClient tsaClient,
    int estimatedSize, PdfSigner.CryptoStandard sigtype, SignaturePolicyInfo signaturePolicy)

public virtual void SignDetached(IExternalSignature externalSignature, X509Certificate[] chain,
    ICollection<ICrlClient> crlList, IOcspClient ocspClient, ITSAClient tsaClient,
    int estimatedSize, PdfSigner.CryptoStandard sigtype, SignaturePolicyIdentifier signaturePolicy)

public virtual void SignExternalContainer(IExternalSignatureContainer externalSignatureContainer,
    int estimatedSize)

前三个显式接受CRL和OCSP客户端(可以实现为提供预先存在的CRL和OCSP),而后者从给定的IExteralSignatureContainer实现中获取完整的CMS容器,因此在该实现中,您可以向其添加所需的任何信息。

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

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

  • 问题内容: 我需要将SVG图形添加​​到PDF文件中。 使用iText7是否有可能? 使用iText5: 我在以下页面中发现了这一点: PdfPTable和PdfTemplate 有一种创建类似于Template的方法: 如何创建Graphics2D? 问题答案: 巧合的是,我们今天发布了SVG实现。我们目前尚不支持全部功能集,我们仍将在第二季度及以后的时间里进行开发,但是您已经可以使用它了。该工

  • 由于对WP 4.1的更改,他们使用了添加主题支持(“标题标签”);允许wordpress处理标题标签。大多数情况下这很好,但我遇到了一个需要编辑它的实例。 我创建了一个简单的页面,并通过使用api动态更改页面上的内容。但当谈到搜索引擎优化,他们都有相同的网页标题。例子:http://vitaferm.com/product/?id=372 是否有一种方法可以通过配置WP的方式将我的产品标题添加到页

  • 这个问题与另一个问题相连。 由于我想完全验证添加到PAdES签名(过期和撤销)中的时间戳,我还需要将crl文件或创建时间戳时捕获的TSA证书的ocsp响应添加到签名中。 据我所知,iText 5.4.1似乎没有提供此功能。特别是通过 com.itextpdf.text.pdf.security.TSAClientBouncyCastle和 com.itextpdf.text.pdf.securit

  • 在我的情况下,旧的apk文件名包含未对齐和未签名的签名信息。这些旧文件名在模块 gradle 文件中使用此方法重命名: 版本代码和版本名称设置如下: 在此重命名的结果中,签名信息(未对齐或未签名)位于变体版本代码之前。 现在我使用的是gradle:3.0.0-beta6。因此,我无法再使用旧方法,因为outputFile已更改为只读,无法重命名。现在我尝试向gradle添加一个新的重命名方法,如下