Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/279.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用LTV进行iText和PDF签名不';t显示时间戳的OCSP和CRL_C#_Pdf_Itext_Signing - Fatal编程技术网

C# 使用LTV进行iText和PDF签名不';t显示时间戳的OCSP和CRL

C# 使用LTV进行iText和PDF签名不';t显示时间戳的OCSP和CRL,c#,pdf,itext,signing,C#,Pdf,Itext,Signing,我是iText的新手。我想签署一份PDF文件并添加LTV。签名PDF很好,但当我想将LTV添加到PDF时,它不会显示时间戳证书的OCSP和CRL信息。 首先,我想描述一下我是如何做签名的。 -我的证书链:签名证书,签名证书根,时间戳证书,时间戳证书根。(我是不是忘了链上的东西?) 为了签署PDF,我使用了: MakeSignature.SignDetached(signatureAppearance, externalSignature, chain, crlList, ocsp2, tsa1,

我是iText的新手。我想签署一份PDF文件并添加LTV。签名PDF很好,但当我想将LTV添加到PDF时,它不会显示时间戳证书的OCSP和CRL信息。 首先,我想描述一下我是如何做签名的。 -我的证书链:签名证书,签名证书根,时间戳证书,时间戳证书根。(我是不是忘了链上的东西?)

为了签署PDF,我使用了:

MakeSignature.SignDetached(signatureAppearance, externalSignature, chain, crlList, ocsp2, tsa1, 0, CryptoStandard.CMS);
之后,我将添加LTV作为签名和时间戳

            PdfReader r = new PdfReader(this.Source);
            FileStream fos = new FileStream(this.Output, FileMode.Create);
            PdfStamper stp = PdfStamper.CreateSignature(r, fos, '\0', null, true);
            LtvVerification v = stp.LtvVerification;
            AcroFields fields = stp.AcroFields;
            List<String> names = fields.GetSignatureNames();
            String sigName = names[names.Count - 1];
            PdfPKCS7 pkcs7 = fields.VerifySignature(sigName);


            if (pkcs7.IsTsp)
                v.AddVerification(sigName, this.ocspClient, this.crlClient, LtvVerification.CertificateOption.SIGNING_CERTIFICATE, LtvVerification.Level.OCSP_CRL, LtvVerification.CertificateInclusion.NO);
            else
            foreach (String name in names)
                    v.AddVerification(name, this.ocspClient, this.crlClient, LtvVerification.CertificateOption.WHOLE_CHAIN, LtvVerification.Level.OCSP_CRL, LtvVerification.CertificateInclusion.NO);
            PdfSignatureAppearance sap = stp.SignatureAppearance;

            LtvTimestamp.Timestamp(sap, this.tsaClient, null);
PdfReader r r=新的PdfReader(this.Source);
FileStream fos=新FileStream(this.Output,FileMode.Create);
PdfStamper stp=PdfStamper.CreateSignature(r,fos,'\0',null,true);
LTV验证v=stp.LTV验证;
AcroFields=stp.AcroFields;
列表名称=字段。GetSignatureNames();
字符串sigName=names[names.Count-1];
PdfPKCS7 pkcs7=字段。验证签名(sigName);
如果(pkcs7.IsTsp)
v、 AddVerification(sigName、this.ocspClient、this.crlClient、ltvverify.CertificateOption.SIGNING\u CERTIFICATE、ltvverify.Level.OCSP\u CRL、ltvverify.CertificateInclusion.NO);
其他的
foreach(名称中的字符串名称)
v、 AddVerification(名称,this.ocspClient,this.crlClient,LtvVerification.CertificateOption.WHOLE_CHAIN,LtvVerification.Level.OCSP_CRL,LtvVerification.CertificateInclusion.NO);
PDFSignaturePearance sap=stp.SignaturePearance;
LtvTimestamp.Timestamp(sap,this.tsaClient,null);
我执行了两次,一次用于签名,第二次用于时间戳。这是Adobe的结果:

正如您所看到的,对证书进行签名没有问题。我可以看到PDF中嵌入的OCSP信息。但当我控制时间戳证书时,我可以看到没有要显示的OCSP-CRL信息

第二张图片表示时间戳证书。 如何为时间戳证书嵌入OCSP和CRL

PDF链接:

多谢各位

签名PDF很好,但当我想将LTV添加到PDF时,它不会显示时间戳证书的OCSP和CRL信息

当我控制时间戳证书时,我可以看到没有要显示的OCSP-CRL信息

如何为时间戳证书嵌入OCSP和CRL

您的图像表明,it指的是Adobe Reader。而且,不会向您显示OCSP和CRL信息,这使您认为它们没有嵌入到文档中

然而,这个结论是错误的。如果你仔细看这条信息

你会认识到它是这么说的

  • 未执行吊销检查,因为
  • 证书是一个信任锚点或一个以上的锚点,并且
  • Adobe Reader从不检查此类证书的吊销,因为
  • 它认为他们天生值得信赖
它并没有说它错过了撤销信息

因此Adobe Reader甚至不会为您的证书查找吊销信息,因此,无论您为该证书添加了多少吊销信息,Adobe Reader都不会显示该信息,除非您重新配置读卡器

如果您想查看该证书的吊销信息,则必须将其从Adobe Reader信任锚中删除,并信任其颁发者

如果是自己签名的,那你就倒霉了。但在这种情况下,撤销信息通常毫无意义

如果您想实际分析是否嵌入了撤销信息,请提供有问题的PDF

增编:守则 关于代码的一些观察:

  • 如果PDF的最外层签名是文档时间戳,则代码假定内部签名的所有必需验证相关信息都存在。情况并非如此:

    a。文档时间戳可能仅应用于PDF的时间戳,无需先添加完整的VRI

    b。LTV的充分验证相关信息不是绝对的,它可能因上下文而异,特别是基于哪些证书是信任锚

    因此,您对带有最外层文档时间戳的PDF的处理是非常乐观的(关于PDF中是否存在验证信息)

  • 如果最外层的签名不是文档时间戳,那么代码假定PDF中没有可用的验证相关信息,并且还假定它仍然可以在线检索所有必需的信息。情况并非如此:

    a。文档可能包含多个签名,然后包含所有签名的时间戳验证相关信息,然后是一个附加签名。在这种情况下,您会尝试嵌入不必要的内容

    b。即使没有文档时间戳的PDF也可能包含使用旧的pre-PAdES机制所需的所有验证信息。在这种情况下,您还尝试嵌入不必要的内容

    c。您不必要地尝试嵌入的信息可能不再在线可用。这将使代码的行为与预期不同

    因此,您对没有最外层文档时间戳的PDF的处理是非常悲观的(关于PDF中是否存在验证信息)和非常乐观的(关于此类信息的在线可用性)

  • 您的代码似乎没有在CRLs和OCSP响应中嵌入签名的验证相关信息。这可能会导致验证器无法通过LTV验证

  • 作为最终操作的代码会在文档上添加时间戳。这显然会导致ce缺乏验证信息