iText证书验证

时间:2019-05-24 14:34:45

标签: itext digital-signature

我正在关注iText证书验证示例(这是第三个示例:https://itextpdf.com/en/resources/examples/itext-7/digital-signatures-chapter-5)。

我不太了解以下代码(我将iTextsharp与C#一起使用,但是Java的代码与此类似):

PdfPKCS7 pkcs7 = base.VerifySignature(fields, name);
X509Certificate[] certs = pkcs7.SignCertificateChain;
DateTime cal = pkcs7.SignDate;
Object[] errors = CertificateVerification.VerifyCertificates(certs, certificates, null, cal);

certificates是用于验证certscertificates是受信任的证书)的列表。在示例中,它是从以下文件创建的:

public const String ADOBE = "../../../../resources/adobeRootCA.cer";
public const String CACERT = "../../../../resources/CACertSigningAuthority.crt";
public const String BRUNO = "../../../../resources/bruno.crt";

我不确定在尝试自己实施该文件时应该从哪里获取这些文件。
我正在考虑针对Windows存储区中的受信任证书来验证签名证书,但是由于我不知道示例为何使用这些文件,因此我不确定是否可以针对Windows存储区来进行验证。

3 个答案:

答案 0 :(得分:0)

方法CertificateVerification.VerifyCertificates中的certificates参数属于BouncyCastle类型列表,因此您需要将Windows证书存储区证书转换为BouncyCastle类型证书。

以下代码可能会有用:

        public void Test()
        {
            List<Org.BouncyCastle.X509.X509Certificate> certificates = new List<Org.BouncyCastle.X509.X509Certificate>();
            foreach (X509Certificate2 netCert in (new X509Store()).Certificates)
            {
                certificates.Add(Org.BouncyCastle.Security.DotNetUtilities.FromX509Certificate(netCert));
            }
        }

答案 1 :(得分:0)

请参阅Digital Signatures for PDF documents的第一章和第二章(您在网站上找到的示例均来自此出版物;可以在Web上轻松找到它们,也可以在iText的网站上免费索取)。

您可以找到如何使用Java的keytool创建证书。

例如,对于bruno.crt,代码如下:

keytool -export -alias demo -file bruno.crt -keystore ks -storepass password

答案 2 :(得分:0)

正如评论中确认的那样,您最想知道将哪些证书用作受信任的证书

这取决于您的用例。

例如:

  • 如果要像Adobe Reader一样进行验证,则必须信任Adobe Approved Trust ListEuropean Union Trust Lists上的所有证书,以及来自于OS信任的证书(取决于您的配置)商店。

  • 如果您想在印度验证个人签名,则很可能希望信任Aadhaar CA证书。

  • 在公司内部应用程序中,您可能希望信任该公司PKI的根证书。

  • 在一个人的签名API的示例代码中,一个人可能希望信任一个自签名证书,该证书是为在这些示例中用于签名而生成的(例如上面的bruno.crt在iText签名API的示例代码中)。

  • 等等等