在过去的几周里,我一直在与iText合作对PDF文件进行数字签名,并且基于我所理解的,有两种方法可以将这些信息添加到PDF中,使其启用LTV:
尽管第一种方法产生了一个漂亮整洁的pdf文件,但问题是它修改pdf文件以创建/追加条目,从而导致认证签名无效,但第二种方法工作良好,但它在很大程度上增加了pdf大小,这取决于crl列表的大小(这也可能会增加加班时间)。
结束时,除了将信息嵌入签名本身之外,还有其他方法可以使认证签名LTV启用吗?有没有办法在签名时创建dds/vri字典?
编辑:以下是关于评论的更多信息:
用于添加ltv信息的代码:
public static void processDocumentLtv(String filePath) throws IOException, GeneralSecurityException, DocumentException {
long startTime = System.currentTimeMillis();
File original = new File(filePath);
File temp = new File(filePath + ".ltv");
PdfReader reader = new PdfReader(filePath);
PdfStamper stamper = new PdfStamper(reader, new FileOutputStream(temp), '\0', true);
LtvVerification ltvVerification = stamper.getLtvVerification();
OcspClient ocspClient = new OcspClientBouncyCastle();
AcroFields fields = stamper.getAcroFields();
List<String> signatureNames = fields.getSignatureNames();
String sigName = signatureNames.get(signatureNames.size() - 1);
PdfPKCS7 pkcs7 = fields.verifySignature(sigName);
Certificate[] chain = pkcs7.getSignCertificateChain();
X509Certificate x509certificate = pkcs7.getSigningCertificate();
byte[] ocspResponse = ocspClient.getEncoded(x509certificate, CertificateUtils.getParent(x509certificate, chain), null);
Collection<byte[]> crlBytes = CertificateUtils.fetchCrlBytes(x509certificate, chain);
Collection<byte[]> ocspBytes = null;
if (ocspResponse != null) {
ocspBytes = new ArrayList<>();
ocspBytes.add(ocspResponse);
}
ltvVerification.addVerification(sigName, ocspBytes, crlBytes, null);
ltvVerification.merge();
stamper.close();
reader.close();
Files.copy(temp.toPath(), original.toPath(), StandardCopyOption.REPLACE_EXISTING);
temp.delete();
logger.info("Took {}ms to do add the ltv information to the document.", (System.currentTimeMillis() - startTime));
}文档示例:在尝试添加LTV数据之前:https://www.dropbox.com/s/79ll23ndt9mbh3g/pdf-sample-pre-ltv.pdf?dl=0
在运行上述代码之后:https://www.dropbox.com/s/hjl73es6hrqspi3/pdf-sample-post-ltv.pdf?dl=0
我使用Adobe 15.017.20053作为我的PDF查看器。
发布于 2016-08-12 07:29:27
对示例文件的观察
我用OP的样本PDF做了一些测试。事实上,Acrobat (Reader)不喜欢由iText生成的不需要任何更改的PAdES-4 LTV添加--允许的认证,而且在这方面有一点大脑分裂,并称两者都有。
自应用此签名以来,对此文档所做的一些更改是文档作者不允许的。
和
自适用此签字以来,本文件未作任何改动。

( Acrobat签名属性对话框按下计算修改列表__)
即使当我删除任何超出添加的LTV信息的更改( (BaseVersion还调整了文档修改日期元数据),我最终还是删除了添加的Extensions entry ESIC 1.7,ExtensionLevel 5),该条目向PDF查看器指示可能存在PADS-4 LTV内容,只有DSS引用和内容仍然存在。
因此,Acrobat违反了
DocMDP限制(见ISO 32000-1 1条款12.8.2.2)不适用于对包含DSS字典和相关VRI、Certs、CRLs和OCSPs的PDF文档的增量更新。
(ETSI TS 102 778-4 V1.1.2 (2009-12)附件A.1文件安全库)
尽管Leonard (当时是Adobe的传道者)在iText邮件列表上得到了保证
我向我的工程师进行了检查,他们确实证实了DocMDP/Cert签名完全支持LTV。
(http://itext.2136553.n4.nabble.com/Verify-certified-with-transform-method-DocMDP-signatures-tt4300147.html#a4303431日期:2012年1月17日;下午3时15分)
不过,我没有检查两个选项,也许Acrobat只遵守上面的PAdES-4要求,如果证书签名是PADS-3签名,或者刚刚认证的版本中已经经过认证的文档至少包含一个(BaseVersion扩展条目ESIC 1.7,ExtensionLevel 5)。
手边的文档包含一个传统的ISO 32000-1签名(可以被认为是PADS-2签名,但也可以被认为是PAdES不知情的签名),并且没有ESIC扩展条目指示PDF-1.3。
在最后将其称为Acrobat之前,我会尝试使用PADS-3签名和ESIC扩展条目(或者根据PADS-4节的ADBE条目)进行更改。
问题本身
结束时,除了将信息嵌入签名本身之外,还有其他方法可以使认证签名LTV启用吗?有没有办法在签名时创建dds/vri字典?
帕德斯-4的补充被描述为指先前修订的文件中的签名,而不是同一修订本中添加的签名。因此,虽然在技术上可以在同一修订版中添加信息,但不能保证符合标准的PDF查看器将使用这些信息。
https://stackoverflow.com/questions/38856382
复制相似问题