【问题标题】:Pdf timestamped signature: timestamp authority not availablepdf时间戳签名:时间戳权限不可用
【发布时间】:2014-02-06 00:18:48
【问题描述】:

我正在使用 iText 2.1.7 和 BC 1.49 即使我可以对文件进行签名和时间戳记,但当我使用 adobe reader 打开它时,我会得到“时间戳权限不可用”状态(签名没问题,阅读器告诉我文件已加时间戳)。 这是时间戳后的代码:

...
byte[] tstoken = timeStampClient.getTimeStampToken(tsdata);
Attribute signatureTimeStamp = new Attribute(PKCSObjectIdentifiers.id_aa_signatureTimeStampToken, new DERSet(ASN1Primitive.fromByteArray(tstoken)));
SignerInformationStore signerStore = cmsSignedData.getSignerInfos();
ArrayList<SignerInformation> siArray = new ArrayList<SignerInformation>();
Iterator<SignerInformation> infos = signerStore.getSigners().iterator();
while (infos.hasNext()) {
    SignerInformation si = infos.next();
    Hashtable<ASN1ObjectIdentifier, Attribute> unsignedAttrHash = si.getUnsignedAttributes().toHashtable();
    unsignedAttrHash.put(PKCSObjectIdentifiers.id_aa_signatureTimeStampToken, signatureTimeStamp);
    siArray.add(SignerInformation.replaceUnsignedAttributes(si, new AttributeTable(unsignedAttrHash)));
}
SignerInformationStore newSignerStore = new SignerInformationStore(siArray);
return CMSSignedData.replaceSigners(cmsSignedData, newSignerStore);
...

返回的 CmsSignedData (.getEncoded()) 是我嵌入到 pdf 中的内容。我已经使用 Acrobat 测试了 TSA 服务器和签署者证书,这些都可以。

提前谢谢你。

-- 添加-- 例子:

My signed pdf

Acro signed pdf(相同的证书,相同的 tsa 服务器)

【问题讨论】:

  • 请提供使用您的代码签名并加盖时间戳的示例 PDF;顺便说一句,iText 2.1.7 和 BC 1.49 看起来像是一个有趣的组合,因为它自己的代码中的旧 iText 版本依赖于大 BC API 突破 1.46/1.47 之前的 BC 版本。啊,您的代码中有一个问题可见;我会创建一个答案...
  • 我认为我发现了一个在您的代码中可见的问题在我查看了规范后证明是错误的。
  • mkl,我忘了提到我对 iText 源代码进行了一些更改以使其与 BC 1.49 兼容。 AFAIK 更改与我的问题无关,使用相同的代码,我成功签署了不同格式的多个文档(xml、doc 等)
  • 我已经开始在办公室查看您的样品,但我没有足够的时间。不过,这很奇怪。 .. 提取了 cms 容器后,dumpasn1 在尝试打开容器时遇到了运行时错误,并且还显示了 Adob​​e 生成的容器的多个错误。此外,Adobe 的签名是巨大的!
  • 好的,使用较新的 guidumpasn 版本,我可以正确解析两个 CMS 容器。乍一看,它们看起来还不错。主要区别在于 Adob​​e 嵌入了一个巨大的 CRL,因此使 PDF 大小爆炸式增长。剩下的一个主要区别是您创建的是 ETSI.CAdES.detached 签名,而 Adob​​e 创建的是老式的 adbe.pkcs7.detached。您是否也尝试过首先使用 adbe.pkcs7.detached 签名? Reader 可能对这些不同的类型有不同的验证。并且:您确实包含 ETSI.CAdES.detached 禁止的签名时间属性。尝试不使用。

标签: java pdf timestamp itext


【解决方案1】:

我发现了问题。我没有为 CMSAttributeTableGenerator.SIGNATURE 的哈希加时间戳(在使用 CMSAttributeTableGenerator 与 BC 签名时已知),而是为解析签名的哈希加时间戳(CMSSignedData.getEncoded())。也许,我的下一个目标是在 CMSAttributeTableGenerator 之外获取正确的数据,我测试了在签名后保存该数据和时间戳,并将时间戳放入 SignerInformationStore(使用我上面编写的源代码)并且读者的验证是正确的。我希望你明白我的意思(这不是我的母语)。谢谢大家。

【讨论】:

  • 太好了。不幸的是,您一开始就没有发布那部分代码,否则问题可能已被更早地发现。话虽如此,您还应该解决上述 cmets 中确定的小问题(签名时间属性与 ETSI.CAdES.detached 冲突、重复的证书条目...)。
  • 你是对的 mkl。如果我对这个问题有所了解,我会发布代码,但我的怀疑完全被误导了。顺便说一句,我已经删除了 PAdES-T 的签名时间属性和重复的证书。非常感谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-11
  • 2017-12-21
  • 1970-01-01
  • 1970-01-01
  • 2017-12-09
  • 2016-04-05
相关资源
最近更新 更多