使用 pdfbox 查找签名时间戳属性中存在的时间戳令牌的证书信息

Find Certificate information of timestamp token present in signature timestamp attribute using pdfbox

提问人:Tanmay Sharma 提问时间:10/5/2023 更新时间:10/5/2023 访问量:47

问:

对文档进行数字签名。在对文档进行签名时,时间戳令牌将作为签名时间戳属性嵌入。如何使用pdfbox找到该时间戳令牌的证书信息

证书 PDFBOX 数字签名 时间戳

评论


答:

2赞 mkl 10/5/2023 #1

PDFBox 允许您提取嵌入在 PDF 中的签名容器。若要分析该签名容器,请使用其他库。PDFBox 示例使用 BouncyCastle。这也是你的选择吗?

如果是,只需查看 PDFBox 示例 ShowSignature

  • showSignature加载 PDF,识别签名词典,并提取嵌入的签名容器和签名数据;和
  • verifyPKCS7使用 BouncyCastle 分析签名容器,并验证签名本身和(如果存在)签名时间戳。

用于查找该时间戳令牌的证书信息的相关代码为:verifyPKCS7

private void verifyPKCS7(InputStream signedContentAsStream, byte[] contents, PDSignature sig) throws ...
{
    CMSProcessable signedContent = new CMSProcessableInputStream(signedContentAsStream);
    CMSSignedData signedData = new CMSSignedData(signedContent, contents);
    ...
    Collection<SignerInformation> signers = signedData.getSignerInfos().getSigners();
    SignerInformation signerInformation = signers.iterator().next();
    ...
    TimeStampToken timeStampToken = SigUtils.extractTimeStampTokenFromSignerInformation(signerInformation);
    X509Certificate certFromTimeStamp = SigUtils.getCertificateFromTimeStampToken(timeStampToken);

certFromTimeStamp是您要查找的证书。

但请注意,根据向其 TSA 请求时间戳的方式,证书可能不会嵌入到时间戳中。在这种情况下,上面的代码找不到它,您应该已经拥有证书。(有关详细信息,请参阅 RFC 3161 中结构字段的说明。certReqTimeStampReq