我正在关注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
是用于验证certs
(certificates
是受信任的证书)的列表。在示例中,它是从以下文件创建的:
public const String ADOBE = "../../../../resources/adobeRootCA.cer";
public const String CACERT = "../../../../resources/CACertSigningAuthority.crt";
public const String BRUNO = "../../../../resources/bruno.crt";
我不确定在尝试自己实施该文件时应该从哪里获取这些文件。
我正在考虑针对Windows存储区中的受信任证书来验证签名证书,但是由于我不知道示例为何使用这些文件,因此我不确定是否可以针对Windows存储区来进行验证。
答案 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 List和European Union Trust Lists上的所有证书,以及来自于OS信任的证书(取决于您的配置)商店。
如果您想在印度验证个人签名,则很可能希望信任Aadhaar CA证书。
在公司内部应用程序中,您可能希望信任该公司PKI的根证书。
在一个人的签名API的示例代码中,一个人可能希望信任一个自签名证书,该证书是为在这些示例中用于签名而生成的(例如上面的bruno.crt
在iText签名API的示例代码中)。
等等等