签名的 PDF 有多可靠。 (c#, Itextsharp)
how reliable the signed PDF. (c#, Itextsharp )
我使用从 GlobalSign 收到的 USB 令牌签署了一个 PDF 文件。但是我看不到 Adobe 的任何图标表明证书有效。
我从 GlobalSign 收到的 USB 令牌是一个可信的 (secure/trust) 证书。但是我不确定为什么我看不到 trusted/secure 证书图标。
签名后的PDF如下图:
我也可以从 Adobe Acrobat DC 看到这个图标的签名:
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, '[=10=]', 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);
OP 在评论中澄清:
how reliable/trusted the signed PDF? how the blue ribbon placed in the pdf globalsign.com/en/resources/CDS_OCSP_Services.pdf
因此,OP 基本上是在尝试按照 GlobalSign 在该传单中要求他做的:
并且在他使用 GlobalSign 设备和 iTextSharp 签名的文件上找不到确切的吊坠。
这里要考虑三个方面:
- 不同类型的 PDF 签名
- 不同的 Adobe Reader 版本
- 总体上信任签名
PDF 签名的类型
根据 PDF 规范ISO 32000-1:
A PDF document may contain the following standard types of signatures:
- One or more approval signatures. [...]
- At most one certification signature (PDF 1.5). [...]
- At most two usage rights signatures (PDF 1.5).
此处对使用权签名不感兴趣,因为它们本质上只是一种工具,可以通过该工具为使用特定软件包生成的 PDF 激活 PDF 查看器中的额外功能,例如为某些 Adobe 软件生成的 PDF 激活了 Adobe Reader 中的功能。
另一方面,您可能对批准和认证签名都感兴趣。差异:
认证签名
- 如果一个 PDF 应该有一个,它必须是其中的第一个签名。
- 它特别适用于文档的作者/来源来宣布作者身份并携带以后 changes to the document 应被允许的信息。
- 一些 PDF 查看器可能会选择对用于认证的证书的安全要求高于用于批准的证书。
同意签字
- 除非 PDF 中的认证签名禁止,否则其中可以有任意数量的批准签名。
- 它可以用于不同的目的;作者不需要使用证明签名,他可以选择使用批准签名并使用签名“原因”,如“我创作了这份文件”;它也可以仅表示相关人员阅读了该文件;或介于两者之间的任何东西。所以,一定要用签名的“理由”来表明你想用签名表达什么。
考虑到 OP 的图片,这一张代表批准签名:
这是一个认证签名:
iTextSharp 可以创建这两种类型,请参见。 PdfSignatureAppearance.CertificationLevel
.
尽管如此,考虑到您的代码,很明显您已经签署了 PDF 作为输入,现在想要为那些先前的签名添加验证信息,然后自己签名。因此,您的签名不是文档中的第一个签名,因此不能是认证签名。
在 Adobe 中显示验证结果 Reader
就像 Adobe Reader 的通用 UI 每隔几个主要版本就会更改一样,它用来表示签名验证结果的特定 UI 元素也会更改。
例如对于您链接的 GlobalSign 文档,您至少可以看到 Adobe Reader 9 的蓝色丝带栏和它宣传的蓝色玫瑰花结:
但在 Adobe Reader DC 中看起来不同
由于 GlobalSign 的传单可以追溯到 2007 年,他们显然不知道 Adobe 现在将如何展示丝带和玫瑰花结,将近 9 年后。
GlobalSign 当然可以更新他们的文档。特别是,如果他们将 OP 指向传单,他们就会做得很糟糕。
信任数字签名
OP 奇迹
how reliable/trusted the signed PDF
与 GlobalSign 传单告诉我们的相反,信任哪个签名的问题通常不能通过说“在 Adobe Reader 中打开文件并查找这个或那个符号”来回答。
您可以信任哪些签名,很大程度上取决于法律背景。您通常只想相信数字签名(如果最终在法庭上处理此事)将被接受为证据。
Adobe 长期以来默认只信任某些美国 CA 颁发的证书的签名。
因此,很长一段时间在德国,你知道签名是一个有趣的噱头,但如果你看到 Adobe Reader 完全接受它,它就毫无价值。另一方面,如果 Adobe Reader 表示文档未被操纵,但 Reader 无法信任签名者身份,则值得多检查一些以查看签名者证书是否由根据德国签名法合格的 CA。
同时,Adobe 还接受 CA 在 EUTL(欧洲可信证书颁发机构列表)上颁发的证书。因此,如今人们必须将 Adobe 显示的内容视为其信任来源。
因此,要回答您手头案件的问题,需要知道您的 PDF 收件人评估签名的法律背景是什么。
我使用从 GlobalSign 收到的 USB 令牌签署了一个 PDF 文件。但是我看不到 Adobe 的任何图标表明证书有效。
我从 GlobalSign 收到的 USB 令牌是一个可信的 (secure/trust) 证书。但是我不确定为什么我看不到 trusted/secure 证书图标。
签名后的PDF如下图:
我也可以从 Adobe Acrobat DC 看到这个图标的签名:
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, '[=10=]', 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);
OP 在评论中澄清:
how reliable/trusted the signed PDF? how the blue ribbon placed in the pdf globalsign.com/en/resources/CDS_OCSP_Services.pdf
因此,OP 基本上是在尝试按照 GlobalSign 在该传单中要求他做的:
并且在他使用 GlobalSign 设备和 iTextSharp 签名的文件上找不到确切的吊坠。
这里要考虑三个方面:
- 不同类型的 PDF 签名
- 不同的 Adobe Reader 版本
- 总体上信任签名
PDF 签名的类型
根据 PDF 规范ISO 32000-1:
A PDF document may contain the following standard types of signatures:
- One or more approval signatures. [...]
- At most one certification signature (PDF 1.5). [...]
- At most two usage rights signatures (PDF 1.5).
此处对使用权签名不感兴趣,因为它们本质上只是一种工具,可以通过该工具为使用特定软件包生成的 PDF 激活 PDF 查看器中的额外功能,例如为某些 Adobe 软件生成的 PDF 激活了 Adobe Reader 中的功能。
另一方面,您可能对批准和认证签名都感兴趣。差异:
认证签名
- 如果一个 PDF 应该有一个,它必须是其中的第一个签名。
- 它特别适用于文档的作者/来源来宣布作者身份并携带以后 changes to the document 应被允许的信息。
- 一些 PDF 查看器可能会选择对用于认证的证书的安全要求高于用于批准的证书。
同意签字
- 除非 PDF 中的认证签名禁止,否则其中可以有任意数量的批准签名。
- 它可以用于不同的目的;作者不需要使用证明签名,他可以选择使用批准签名并使用签名“原因”,如“我创作了这份文件”;它也可以仅表示相关人员阅读了该文件;或介于两者之间的任何东西。所以,一定要用签名的“理由”来表明你想用签名表达什么。
考虑到 OP 的图片,这一张代表批准签名:
这是一个认证签名:
iTextSharp 可以创建这两种类型,请参见。 PdfSignatureAppearance.CertificationLevel
.
尽管如此,考虑到您的代码,很明显您已经签署了 PDF 作为输入,现在想要为那些先前的签名添加验证信息,然后自己签名。因此,您的签名不是文档中的第一个签名,因此不能是认证签名。
在 Adobe 中显示验证结果 Reader
就像 Adobe Reader 的通用 UI 每隔几个主要版本就会更改一样,它用来表示签名验证结果的特定 UI 元素也会更改。
例如对于您链接的 GlobalSign 文档,您至少可以看到 Adobe Reader 9 的蓝色丝带栏和它宣传的蓝色玫瑰花结:
但在 Adobe Reader DC 中看起来不同
由于 GlobalSign 的传单可以追溯到 2007 年,他们显然不知道 Adobe 现在将如何展示丝带和玫瑰花结,将近 9 年后。
GlobalSign 当然可以更新他们的文档。特别是,如果他们将 OP 指向传单,他们就会做得很糟糕。
信任数字签名
OP 奇迹
how reliable/trusted the signed PDF
与 GlobalSign 传单告诉我们的相反,信任哪个签名的问题通常不能通过说“在 Adobe Reader 中打开文件并查找这个或那个符号”来回答。
您可以信任哪些签名,很大程度上取决于法律背景。您通常只想相信数字签名(如果最终在法庭上处理此事)将被接受为证据。
Adobe 长期以来默认只信任某些美国 CA 颁发的证书的签名。
因此,很长一段时间在德国,你知道签名是一个有趣的噱头,但如果你看到 Adobe Reader 完全接受它,它就毫无价值。另一方面,如果 Adobe Reader 表示文档未被操纵,但 Reader 无法信任签名者身份,则值得多检查一些以查看签名者证书是否由根据德国签名法合格的 CA。
同时,Adobe 还接受 CA 在 EUTL(欧洲可信证书颁发机构列表)上颁发的证书。因此,如今人们必须将 Adobe 显示的内容视为其信任来源。
因此,要回答您手头案件的问题,需要知道您的 PDF 收件人评估签名的法律背景是什么。