Java PDF中的证书链在哪里

Java PDF中的证书链在哪里,java,pdf,adobe,digital-signature,pdfbox,Java,Pdf,Adobe,Digital Signature,Pdfbox,我刚刚签署了一份文件。签名者证书有一个颁发者中间证书,中间证书的颁发者是根证书 我签署了文件,我看到了证书的完整链条。但当我在PDF资源管理器中看到时,只有签名者证书: 我需要那个证书链。我将使用PDFbox获取它们,但我不知道它在哪里。您可以在PDFbox源代码的examples子项目的ShowSignature.java示例或中找到显示证书链的代码 下面是一些从那里缩减的代码,这些代码仅适用于某些签名子类型(adbe.pkcs7.detached和ETSI.CAdES.detached,其

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

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


我需要那个证书链。我将使用PDFbox获取它们,但我不知道它在哪里。

您可以在PDFbox源代码的examples子项目的ShowSignature.java示例或中找到显示证书链的代码

下面是一些从那里缩减的代码,这些代码仅适用于某些签名子类型(adbe.pkcs7.detached和ETSI.CAdES.detached,其他代码可以在上述示例中看到):

try(PDDocument=PDDocument.load(文件))
{
对于(PDSignature sig:document.getSignatureDictionaries())
{
COSDictionary sigDict=sig.getCOSObject();
costring contents=(costring)sigDict.getDictionaryObject(COSName.contents);
CMSSignedData signedData=新的CMSSignedData(contents.getBytes());
存储证书存储=signedData.getCertificates();
JcaX509CertificateConverter certificateConverter=新的JcaX509CertificateConverter();
集合匹配项=CertificateStore.getMatches(null);
System.out.println(“链中的证书:+matches.size());
System.out.println();
int n=0;
对于(X509CertificateHolder certificateHolder:匹配项)
{
++n;
X509Certificate=certificateConverter.getCertificate(certificateHolder);
System.out.println(“证书”+n+“:”);
系统输出打印LN(证书);
System.out.println();
}
}
}

ShowSignature.java示例提供了更多功能:它检查签名的有效性,签名是否覆盖整个文档,以及(2.0.13中新增的)检查整个证书链,包括吊销(OCSP或CRL)。

在哪里可以看到完整的链?在AdobeReader中?这可能是因为读卡器在自己的存储中有证书。或者从操作系统的存储中检索它们。或者通过LDAP从用户证书中指定的某个远程目录服务器检索它们。。。如果您想确定,请提供有问题的PDF。但是,如果您想嵌入所有必需的证书,您通常必须利用其他资源,而不仅仅是有问题的PDF。但是,如果您还控制原始签名例程,您可能会在那里强制执行完整的证书链嵌入。我在org.bouncycastle.cms.cmssignedata的存储中创建了我的证书。
cmssignedata
只是一个帮助器类,允许解析和构建包含密钥的签名。因此,证书实际上就是您在图形中所指的位置……;)
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();
        }
    }
}