签名PDF的可靠性如何。(c#,Itextsharp)

签名PDF的可靠性如何。(c#,Itextsharp),c#,pdf,itextsharp,adobe,C#,Pdf,Itextsharp,Adobe,我用从GlobalSign收到的USB令牌签署PDF文件。但是,我看不到Adobe显示证书有效的任何图标 我从GlobalSign收到的USB令牌是一个可信任(安全/信任)证书。但我不确定为什么看不到受信任/安全证书图标 签名PDF如下所示: 我还可以从Adobe Acrobat DC看到此图标的签名: ICollection crlList=new List{new CrlClientOnline(chain)}; ICrlClient crl=新的CrlClientOnline(链);

我用从GlobalSign收到的USB令牌签署PDF文件。但是,我看不到Adobe显示证书有效的任何图标

我从GlobalSign收到的USB令牌是一个可信任(安全/信任)证书。但我不确定为什么看不到受信任/安全证书图标

签名PDF如下所示:

我还可以从Adobe Acrobat DC看到此图标的签名:


ICollection crlList=new List{new CrlClientOnline(chain)};
ICrlClient crl=新的CrlClientOnline(链);
IOCSP客户端ocsp;
ocsp=新的OcspClientBouncyCastle();
//var sdf0=ocsp.GetEncoded(链[0],链[1],”http://ocsp2.globalsign.com/gsalphag2");
PdfReader r=新的PdfReader(hedefPDFpath+“Emre.pdf”);
FileStream fos=新的FileStream(hedefPDFpath+“Emre”+fi.Name,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、 添加验证(签名名称、ocsp、crl、LtvVerification.CertificateOption.SIGNING\u CERTIFICATE、LtvVerification.Level.ocsp\u crl、LtvVerification.CertificateInclusion.YES);
else foreach(名称中的字符串名称)
v、 添加验证(名称、ocsp、crl、LtvVerification.CertificateOption.WHOLE_CHAIN、LtvVerification.Level.ocsp_crl、LtvVerification.CertificateInclusion.YES);
PDFSignaturePearance sap=pdfStamper.SignaturePearance;
MakeSignature.SignDistached(签名外观、外部签名、链、crlList、ocsp、TSAClient、estimatedSize、CryptoStandard.CMS);

在注释中明确了OP:


签名PDF的可靠性/可信程度如何?蓝色丝带如何放置在pdf globalsign.com/en/resources/CDS_OCSP_Services.pdf中

因此,OP基本上是按照GlobalSign在该传单中的要求:

在他用全球信号装置和iTextSharp签署的文件上找不到确切的挂件


这里有三个方面需要考虑:

  • 不同类型的PDF签名
  • 不同的Adobe Reader版本
  • 一般信任签名
PDF签名的类型 根据PDF规范:

PDF文档可能包含以下标准类型的签名:

  • 一个或多个批准签名。[……]
  • 最多一个认证签名(PDF 1.5)。[……]
  • 最多两个使用权签名(PDF 1.5)
此处对使用权签名不感兴趣,因为它们本质上只是一种工具,通过该工具,可以为使用特定软件包生成的PDF激活PDF查看器中的额外功能,例如,为某些Adobe软件生成的PDF激活Adobe Reader中的功能

另一方面,您可能对批准和认证签名都感兴趣。区别在于:

认证签名

  • 如果PDF应有一个签名,则必须是其中的第一个签名
  • 特别是指文件的作者/来源宣布其作者身份,并携带稍后允许的信息
  • 某些PDF查看器可能会选择对用于认证的证书的安全性要求高于用于批准的证书的安全性要求
批准签字

  • 除非PDF中的认证签名禁止,否则其中可能有任意数量的批准签名
  • 它可以用于不同的目的;作者不需要使用认证签名,他也可以使用批准签名和签名“原因”,如“我编写了此文档”;这也只能意味着相关人员阅读了文件;或者介于两者之间的任何东西。因此,请务必使用签名“原因”来表示您想用签名表达什么
考虑到OP的图像,此图像代表批准签名:

这是一个认证签名:


iTextSharp可以创建这两种类型,请参见PdfSignatureAppearance.CertificationLevel

但是,考虑到您的代码,很明显您已经将PDF作为输入进行了签名,现在希望为这些先前的签名添加验证信息,然后自己进行签名。因此,您的签名不是文档中的第一个签名,因此不能是认证签名

在Adobe Reader中显示验证结果 就像AdobeReader的通用UI每隔几个主要版本就会更改一次一样,它用来表示签名验证结果的特定UI元素也是如此

例如,对于您链接的GlobalSign文档,您至少可以看到Adobe Reader 9上的蓝色丝带条和它所宣传的蓝色玫瑰花结:

但在AdobeReaderDC中,它看起来不同

由于GlobalSign传单可以追溯到2007年,他们显然不知道近9年后Adobe现在将如何展示ribbon和rosette

GlobalSign当然可以更新他们的文档。特别是,如果他们将OP指向传单,他们会做得很糟糕

信任数字签名 OP奇迹


签名PDF的可靠性/可信程度

与GlobalSign传单上告诉我们的相反,通常不能用“在Adobe Reader中打开文件并查找这个或那个符号”来回答信任哪个签名的问题

你可以信任哪些签名,这在很大程度上取决于法律背景。您通常只希望信任数字签名(如果事件发生)
            ICollection<ICrlClient> crlList = new List<ICrlClient> { new               CrlClientOnline(chain) };
            ICrlClient crl = new CrlClientOnline(chain);
            IOcspClient ocsp;

            ocsp = new OcspClientBouncyCastle();
            //var sdf0= ocsp.GetEncoded(chain[0] , chain[1], "http://ocsp2.globalsign.com/gsalphag2");
            PdfReader r = new PdfReader(hedefPDFpath + "Emre.pdf");
            FileStream fos = new FileStream(hedefPDFpath + "Emre" + fi.Name, 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, ocsp, crl, LtvVerification.CertificateOption.SIGNING_CERTIFICATE, LtvVerification.Level.OCSP_CRL, LtvVerification.CertificateInclusion.YES);
            else foreach (String name in names)
                    v.AddVerification(name, ocsp, crl, LtvVerification.CertificateOption.WHOLE_CHAIN, LtvVerification.Level.OCSP_CRL, LtvVerification.CertificateInclusion.YES);
            PdfSignatureAppearance sap = pdfStamper.SignatureAppearance;

            MakeSignature.SignDetached(signatureAppearance, externalSignature, chain, crlList, ocsp, TsaCliente, estimatedSize, CryptoStandard.CMS);