【发布时间】: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 服务器和签署者证书,这些都可以。
提前谢谢你。
-- 添加-- 例子:
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 在尝试打开容器时遇到了运行时错误,并且还显示了 Adobe 生成的容器的多个错误。此外,Adobe 的签名是巨大的!
-
好的,使用较新的 guidumpasn 版本,我可以正确解析两个 CMS 容器。乍一看,它们看起来还不错。主要区别在于 Adobe 嵌入了一个巨大的 CRL,因此使 PDF 大小爆炸式增长。剩下的一个主要区别是您创建的是 ETSI.CAdES.detached 签名,而 Adobe 创建的是老式的 adbe.pkcs7.detached。您是否也尝试过首先使用 adbe.pkcs7.detached 签名? Reader 可能对这些不同的类型有不同的验证。并且:您确实包含 ETSI.CAdES.detached 禁止的签名时间属性。尝试不使用。