首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >itextsharp中的Pades验证抛出Uri前缀是不被识别的。

itextsharp中的Pades验证抛出Uri前缀是不被识别的。
EN

Stack Overflow用户
提问于 2017-01-03 14:07:54
回答 1查看 1K关注 0票数 3

我已经成功地签署了一个pdf与LTV的支持。我可以通过和外部验证器检查pdf和LTV签名。

我正在尝试使用iTextSharp 5.5.10进行同样的验证。

我正在遵循iText示例代码06

但是当我给ltvVerifier.Verify打电话时,我得到了一个System.NotSupportedException, The Uri Prefix is not Recognized。我正在加载用于签署pdf en cert参数的证书。

验证代码:

代码语言:javascript
复制
   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;
   }

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

代码语言:javascript
复制
    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();
    }

一个自定义验证器,刚刚从样本中复制:

代码语言:javascript
复制
 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>();
    }
}

这是相关的堆栈跟踪:

代码语言:javascript
复制
  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)

谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-01-04 19:06:05

问题是签名者证书链中的证书显示了两个用于CRL下载的URI,首先是一个ldap URI,然后是一个http URI,cf。@Egl对您的问题的评论,但iText假设它只需接受第一个给定的URI并使用System.Net.WebRequest请求其内容。

不幸的是,WebRequest开箱即用只支持http:、https:、ftp:和file:(cf )。此msdn页面。因此,它失败了iText使用Exception请求CRL的尝试,而iText并没有捕捉到它。

你可以通过

  • 或者注册ldap WebRequest处理程序(cf )。此msdn页面。 注意:虽然msdn页面建议这样做是可能的,但我还没有这样做。此外,“任择议定书”无法轻易地遵循这条道路。因此,可能会有超出msdn文档描述的限制。可能只有web协议(ftp:,file:,http:,https:)可以使用吗?
  • 或更改iText验证器(实际上更改iText类或复制/派生自己的CrlVerifierLtvVerifier变体)以使用http。 这可以通过捕获此类异常,然后继续使用下一个CRL请求URI来实现,或者(就像OP所做的那样)完全忽略ldap (在CertificateUtil.GetCRLURL中过滤它)。
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41445353

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档