0

文書に署名したところです。署名者証明書には発行者中間証明書が 1 つあり、中間者の発行者がルート証明書です。

ドキュメントに署名すると、その証明書の完全なチェーンが表示されます。しかし、PDF エクスプローラーで見ると、署名者証明書しかありません。

ここに画像の説明を入力

その証明書チェーンが必要です。PDFbox を使用して取得するつもりですが、どこにあるのかわかりません。

4

1 に答える 1

0

証明書チェーンを表示するコードは、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) を含む証明書チェーン全体をチェックします。

于 2018-11-17T12:38:57.877 に答える