文書に署名したところです。署名者証明書には発行者中間証明書が 1 つあり、中間者の発行者がルート証明書です。
ドキュメントに署名すると、その証明書の完全なチェーンが表示されます。しかし、PDF エクスプローラーで見ると、署名者証明書しかありません。
その証明書チェーンが必要です。PDFbox を使用して取得するつもりですが、どこにあるのかわかりません。
文書に署名したところです。署名者証明書には発行者中間証明書が 1 つあり、中間者の発行者がルート証明書です。
ドキュメントに署名すると、その証明書の完全なチェーンが表示されます。しかし、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) を含む証明書チェーン全体をチェックします。