PDF中的证书链在哪里

时间:2013-07-22 09:02:41

标签: java pdf adobe digital-signature pdfbox

我刚签了一份文件。签名者证书有一个颁发者中间证书,中间人的签发者是根证书。

我签署了文件,我看到了该证书的完整链条。但是当我在PDF资源管理器中看到时,只有Signer证书:

enter image description here

我需要证书链。我打算用PDFbox来获取它们,但我不知道它在哪里。

1 个答案:

答案 0 :(得分:0)

您可以在PDFBox源代码download的示例子项目或repository的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)。