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

无法识别itextsharp中的Pades LTV验证抛出Uri前缀

程毅
2023-03-14

我已成功签署了一份带有LTV支持的pdf。我可以通过Adobe Acrobat Reader和外部验证器检查pdf和LTV签名是否有效。

我试图与iTextSharp 5.5.10进行相同的验证。

我遵循的是iText示例代码C5_06

但是当我调用ltvVerifer时。验证,我得到一个System.没有识别Uri前缀。我正在加载用于签署pdf en cert参数的证书。

验证代码:

   public static bool Validate(byte[] pdfIn, X509Certificate2 cert)
    {
        using (var reader = new PdfReader(pdfIn))
        {
            var fields = reader.AcroFields;
            var signames = fields.GetSignatureNames();

            if (!signames.Any(n => fields.SignatureCoversWholeDocument(n)))
                throw new Exception("None signature covers all document");

            var verifications = signames.Select(n => fields.VerifySignature(n));

            var invalidSignature = verifications.Where(v => !v.Verify());
            var invalidTimeStamp = verifications.Where(v => !v.VerifyTimestampImprint());

            if (invalidSignature.Any())
                throw new Exception("Invalid signature found");
        }

        using (var reader = new PdfReader(pdfIn))
        {
            var ltvVerifier = new LtvVerifier(reader)
            {
                OnlineCheckingAllowed = false,
                CertificateOption = LtvVerification.CertificateOption.WHOLE_CHAIN,
                Certificates = GetChain(cert).ToList(),
                VerifyRootCertificate = false,
                Verifier = new MyVerifier(null)
            };

            var ltvResult = new List<VerificationOK> { };
            ltvVerifier.Verify(ltvResult);

            if (!ltvResult.Any())
                throw new Exception("Ltv verification failed");
        }
        return true;
   }

从证书链构建X509证书列表的辅助函数:

    private static X509.X509Certificate[] GetChain(X509Certificate2 myCert)
    {
        var x509Chain = new X509Chain();
        x509Chain.Build(myCert);

        var chain = new List<X509.X509Certificate>();
        foreach(var cert in x509Chain.ChainElements)
        {
            chain.Add(
                DotNetUtilities.FromX509Certificate(cert.Certificate)
                );
        }

        return chain.ToArray();
    }

一个自定义验证器,只是从示例复制:

 class MyVerifier : CertificateVerifier
{
    public MyVerifier(CertificateVerifier verifier) : base(verifier) { }

    override public List<VerificationOK> Verify(
        X509.X509Certificate signCert, X509.X509Certificate issuerCert, DateTime signDate)
    {
        Console.WriteLine(signCert.SubjectDN + ": ALL VERIFICATIONS DONE");
        return new List<VerificationOK>();
    }
}

这是相关的堆栈跟踪:

  in System.Net.WebRequest.Create(Uri requestUri, Boolean useUriBase)
   in System.Net.WebRequest.Create(String requestUriString)
   in iTextSharp.text.pdf.security.CrlVerifier.GetCrl(X509Certificate signCert, X509Certificate issuerCert)
   in iTextSharp.text.pdf.security.CrlVerifier.Verify(X509Certificate signCert, X509Certificate issuerCert, DateTime signDate)
   in iTextSharp.text.pdf.security.OcspVerifier.Verify(X509Certificate signCert, X509Certificate issuerCert, DateTime signDate)
   in iTextSharp.text.pdf.security.LtvVerifier.Verify(X509Certificate signCert, X509Certificate issuerCert, DateTime sigDate)
   in iTextSharp.text.pdf.security.LtvVerifier.VerifySignature()
   in iTextSharp.text.pdf.security.LtvVerifier.Verify(List`1 result)

谢谢

共有1个答案

何涵育
2023-03-14

问题是,签名者证书链中的证书为CRL下载提供了两个URI,首先是ldap URI,然后是http URI,参见@Egl对您的问题的评论,但iText假设它可以简单地获取第一个给定的URI并使用系统。网WebRequest请求其内容。

不幸的是,开箱即用只支持超文本传输协议:、https:、ftp:和file:(参见这个msdn页面)。因此,它会使iText通过ldap请求CRL的尝试失败,因为iText没有捕获异常

你可以通过

>

  • 注册一个ldapWebRequest处理程序(参见这个msdn页面)。

    注意:虽然msdn页面建议做这样的事情是可能的,但我还没有做过。此外,OP不容易遵循这一路径。因此,可能存在超出msdn留档描述的限制。可能只有html" target="_blank">web协议(ftp:, file:,超文本传输协议:, https:)可以使用?

    或者更改iText验证器(实际更改iText类或复制/派生自己的CrlVerifierLtvVerifier变体)以使用http URI。

    这可以通过捕获此类异常然后继续下一个CRL请求URI来实现,也可以通过完全忽略ldap URI(在CertificateUtil.GetCRLURL中对其进行过滤)来实现。

  •  类似资料:
    • 我按照这个教程https://spring framework . guru/spring-boot-restful-API-documentation-with-swagger-2/生成了一个swagger文档。它可以工作,但是当我试图在bean中添加一些验证时,我在文档中找不到信息: 带有验证注释的我的实体: 这里,https://github.com/springfox/springfox/

    • 本文向大家介绍Python验证码识别的方法,包括了Python验证码识别的方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了Python验证码识别的方法。分享给大家供大家参考。具体实现方法如下: 希望本文所述对大家的Python程序设计有所帮助。

    • 我的验证器类 当我没有选择任何选项就提交表单时, 无法将类型java.lang.String的属性值转换为属性类别所需的类型com.main.java.category;嵌套异常为java.lang.IllegalStateException:无法将类型[java.lang.String]的值转换为属性类别所需的类型[com.main.java.category]:找不到匹配的编辑器或转换策略 这

    • 22.1 滑动验证码的识别介绍 本节目标:用程序识别极验滑动验证码的验证,包括分析识别思路、识别缺口位置、生成滑块拖动路径、模拟实现滑块拼合通过验证等步骤。 准备工作:本次案例我们使用Python库是Selenium,浏览器为Chrome。请确保已安装Selenium库和ChromeDriver浏览器驱动。 了解极验滑动验证码: 极验滑动验证码官网为:http://www.geetest.com/

    • 在测试中,我使用的是mockobject: 我试图验证其方法的使用: 但它抛出以下异常: 组织。莫基托。例外情况。滥用。UnfinishedVerificationException:此处缺少验证(模拟)的方法调用: 这一行的例外点是: setMaxRows接受一个int。 当我注释掉这一行时,测试成功了。调试程序时,我可以看到正在设置的setMaxRows方法: BrandLabels是一个Li

    • 本文向大家介绍Python网站验证码识别,包括了Python网站验证码识别的使用技巧和注意事项,需要的朋友参考一下 0x00 识别涉及技术 验证码识别涉及很多方面的内容。入手难度大,但是入手后,可拓展性又非常广泛,可玩性极强,成就感也很足。 验证码图像处理 验证码图像识别技术主要是操作图片内的像素点,通过对图片的像素点进行一系列的操作,最后输出验证码图像内的每个字符的文本矩阵。 读取图片 图片降噪