我刚刚签了一份文件。签名者证书有一个颁发者中间证书,中间的颁发者是根证书。
我签署了文件,我看到了该证书的完整链。但是当我在 PDF 资源管理器中看到时,只有签名者证书:
我需要那个证书链。我将使用 PDFbox 获取它们,但我不知道它在哪里。
我刚刚签了一份文件。签名者证书有一个颁发者中间证书,中间的颁发者是根证书。
我签署了文件,我看到了该证书的完整链。但是当我在 PDF 资源管理器中看到时,只有签名者证书:
我需要那个证书链。我将使用 PDFbox 获取它们,但我不知道它在哪里。
您可以在 PDFBox 源代码下载的示例子项目或存储库中的 ShowSignature.java 示例中找到显示证书链的代码。
这是从那里减少的一些代码,仅适用于某些签名子类型(adbe.pkcs7.detached 和 ETSI.CAdES.detached,其他可以在提到的示例中看到):
try (PDDocument document = PDDocument.load(file))
{
for (PDSignature sig : document.getSignatureDictionaries())
{
COSDictionary sigDict = sig.getCOSObject();
COSString contents = (COSString) sigDict.getDictionaryObject(COSName.CONTENTS);
CMSSignedData signedData = new CMSSignedData(contents.getBytes());
Store<X509CertificateHolder> certificatesStore = signedData.getCertificates();
JcaX509CertificateConverter certificateConverter = new JcaX509CertificateConverter();
Collection<X509CertificateHolder> matches = certificatesStore.getMatches(null);
System.out.println("Certificates in chain: " + matches.size());
System.out.println();
int n = 0;
for (X509CertificateHolder certificateHolder : matches)
{
++n;
X509Certificate certificate = certificateConverter.getCertificate(certificateHolder);
System.out.println("Certificate " + n + ":");
System.out.println(certificate);
System.out.println();
}
}
}
ShowSignature.java 示例提供了更多功能:它检查签名有效性、签名是否覆盖整个文档以及(2.0.13 中的新功能)检查整个证书链,包括撤销(OCSP 或 CRL)。