iText 证书验证
iText certificate verification
我正在关注 iText 证书验证示例(这是在此处找到的第 3 个示例:https://itextpdf.com/en/resources/examples/itext-7/digital-signatures-chapter-5)。
我不太明白以下代码(我在 C# 中使用 iTextsharp,但 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 商店进行验证好的
方法CertificateVerification.VerifyCertificates中的certificates参数属于BouncyCastle类型列表,因此您需要将Windows Certificate Store证书转换为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));
}
}
请参考Digital Signatures for PDF documents
的第一章和第二章(您在网站上找到的示例来自该出版物;可以在网上轻松找到或在iText网站上免费索取).
在那里您可以找到如何使用 java 的 keytool
创建证书。
例如bruno.crt
的代码如下:
keytool -export -alias demo -file bruno.crt -keystore ks -storepass password
正如评论中所确认的那样,您最想知道的是哪些证书可用作受信任的证书。
这取决于您的具体用例。
例如:
如果您想像 Adobe Reader 一样进行验证,您必须信任 Adobe Approved Trust List and the European Union Trust Lists 上的所有证书以及(取决于您的配置)来自 OS信任库。
如果您想在印度验证个人签名,您很可能会希望信任 Aadhaar CA 证书。
在公司内部应用程序中,您可能希望信任该公司 PKI 的根证书。
在一个人的签名示例代码中 API 一个人可能想要信任一个 self-signed 证书,该证书是为在这些示例中用于签名而生成的(如上面的 bruno.crt
在 iText 签名的示例代码中 API).
等等等等等等
我正在关注 iText 证书验证示例(这是在此处找到的第 3 个示例:https://itextpdf.com/en/resources/examples/itext-7/digital-signatures-chapter-5)。
我不太明白以下代码(我在 C# 中使用 iTextsharp,但 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 商店进行验证好的
方法CertificateVerification.VerifyCertificates中的certificates参数属于BouncyCastle类型列表,因此您需要将Windows Certificate Store证书转换为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));
}
}
请参考Digital Signatures for PDF documents
的第一章和第二章(您在网站上找到的示例来自该出版物;可以在网上轻松找到或在iText网站上免费索取).
在那里您可以找到如何使用 java 的 keytool
创建证书。
例如bruno.crt
的代码如下:
keytool -export -alias demo -file bruno.crt -keystore ks -storepass password
正如评论中所确认的那样,您最想知道的是哪些证书可用作受信任的证书。
这取决于您的具体用例。
例如:
如果您想像 Adobe Reader 一样进行验证,您必须信任 Adobe Approved Trust List and the European Union Trust Lists 上的所有证书以及(取决于您的配置)来自 OS信任库。
如果您想在印度验证个人签名,您很可能会希望信任 Aadhaar CA 证书。
在公司内部应用程序中,您可能希望信任该公司 PKI 的根证书。
在一个人的签名示例代码中 API 一个人可能想要信任一个 self-signed 证书,该证书是为在这些示例中用于签名而生成的(如上面的
bruno.crt
在 iText 签名的示例代码中 API).等等等等等等