我有一个关于计算用于数字签名的PDF文档摘要的快速问题(与我之前的一个问题有点相关,我试图弄清楚为什么你需要知道客户的证书才能创建正确的摘要).在Adobe有关PDF格式的文档中,指定了以下内容:
应在文件中的字节范围内计算字节范围摘要,该字节范围摘要应由签名字典中的ByteRange条目指示.此范围应该是整个文件,包括签名字典,但不包括签名值本身(内容条目).
所以在这一点上事情似乎相当简单,只是消化/ Sig字典中除/ Contents条目之外的所有内容./ Contents条目中的实际数据指定如下:
对于公钥签名,Contents应该是DER编码的PKCS#1二进制数据对象或DER编码的PKCS#7二进制数据对象.
所以仍然没有问题,我可以(可能)生成摘要,为/ Contents条目保留空间并稍后附加此PKCS#7对象.当我阅读以下内容时,混乱就开始了:
撤销信息是签名属性,这意味着签名软件必须在签名之前捕获吊销信息.类似的要求适用于证书链.签名软件必须在签名之前捕获并验证证书链.
所以我没有得到的东西:显然/ Contents条目(包含证书和签名摘要)没有消化,但证书链是一个签名属性(因此需要被消化?).
如果有人能够进一步确定消化的内容,我会很感激,也许更好地向我解释已签名的属性.我想回答的主要问题是:我是否可以在事先不知道某人的证书的情况下创建一个可签名的摘要?(我正在使用pkcs7分离签名)
我正在尝试构建一个发生以下情况的应用程序:
我遇到的问题是:服务器似乎不可能在事先没有客户端证书的情况下生成要签名的哈希值.我真的更喜欢创建一个解决方案,其中服务器不需要知道客户端的证书就可以创建文档摘要.
到目前为止,我发现的所有示例都使用PdfPKCS7.getAuthenticatedAttributeBytes函数来获取待签名的哈希值,但这需要知道客户端证书.我看过Bruno Lowagie撰写的"PDF文档的数字签名"白皮书,但我没有看到确切消化的信息.
这是我当前尝试的代码片段:
public byte[] simplePresign(String src, String digestAlgorithm) throws IOException, DocumentException, GeneralSecurityException {
this.digestAlgorithm = digestAlgorithm;
tsaClient = new CustomTSAClient();
PdfReader reader = new PdfReader(src);
os = new ByteArrayOutputStream();
PdfAStamper stamper = PdfAStamper.createSignature(reader, os, '\0', PdfAConformanceLevel.PDF_A_1B);
appearance = stamper.getSignatureAppearance();
PdfSignature dic = new PdfSignature(PdfName.ADOBE_PPKLITE, PdfName.ADBE_PKCS7_DETACHED);
appearance.setCryptoDictionary(dic);
HashMap<PdfName, Integer> exc = new HashMap<PdfName, Integer>();
exc.put(PdfName.CONTENTS, getEstimatedSize(null, tsaClient) * 2 + 2);
appearance.preClose(exc);
InputStream data = appearance.getRangeStream();
MessageDigest mDigest = DigestAlgorithms.getMessageDigest(digestAlgorithm, null);
return DigestAlgorithms.digest(data, mDigest); …Run Code Online (Sandbox Code Playgroud)