我正在使用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(同一个证书,同一个服务器)
答案 0 :(得分:0)
我发现了问题。而不是为CMSAttributeTableGenerator.SIGNATURE的哈希加时间戳(在使用CMSAttributeTableGenerator与BC签名时已知),我正在为已解析签名的哈希(CMSSignedData.getEncoded())添加时间戳。也许,我的下一个目标是在CMSAttributeTableGenerator之外获取正确的数据,我在签名后测试保存和时间戳,并将时间戳放入SignerInformationStore(使用我上面写的源代码)并且Reader的验证正确。我希望你明白我的意思(这不是我的母语)。谢谢大家。