过去几周我一直在使用iText对PDF文件进行数字签名,并根据我的理解,有两种方法可以将信息添加到PDF中以使其启用LTV:
使用iText示例中提供的代码添加信息,此方法需要签名已经存在,因为DSS&它创建的VRI词典引用了签名。
嵌入crl字节&签名时签名中的ocsp响应。
尽管第一种方法导致了一个漂亮而整洁的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 Reader DC v15.017.20053作为我的PDF查看器。
答案 0 :(得分:0)
我使用OP的样本PDF进行了一些测试。实际上,Adobe Acrobat(Reader)不喜欢iText生成的PAdES-4 LTV添加到PDF中,并且没有允许更改的认证,并且它有点大脑分裂,并说两者都
文档作者不允许在应用此签名后对本文档所做的一些更改。
和
自应用此签名以来,此文档未进行任何更改。
(按计算修改列表后的Adobe Acrobat签名属性对话框)
即使我删除了超过添加LTV信息的任何更改(iText另外调整了文档修改日期元数据),这种情况仍然存在,我最终甚至删除了添加的扩展条目 ESIC ( BaseVersion 1.7, ExtensionLevel 5)向PDF查看器显示可能存在PAdES-4 LTV内容,仅 DSS < / strong>参考和内容仍然存在。
因此,Adobe Acrobat违反了需要
的PAdES-4规范DocMDP限制(参见ISO 32000-1 1条款12.8.2.2)不适用于包含DSS字典和相关VRI,Certs,CRL和OCSP的PDF文档的增量更新。
(ETSI TS 102 778-4 V1.1.2(2009-12)附件A.1文件安全商店)
即使Leonard Rosenthol(当时的Adobe PDF传播者)在iText邮件列表上保证
我与我的工程师核实过他们确实证实了DocMDP / Cert签名完全支持LTV。
(Reply to "Verify certified (with transform method DocMDP) signatures"日期为2012年1月17日;下午3:15)
我没有检查两个选项,但是,如果证书签名是PAdES-3签名,或者如果已经在认证版本中的认证文档至少包含一个PAdES-4,则Adobe Acrobat可能只遵守上述PAdES-4要求扩展程序条目 ESIC ( BaseVersion 1.7, ExtensionLevel 5)。
手头的文件包含传统的ISO 32000-1签名(可以被视为PAdES-2签名但也可以被视为PAdES-unaware签名)并且表示没有 ESIC的PDF版本1.3 扩展条目。
在最终称之为Adobe Acrobat错误之前,我尝试使用PAdES-3签名和 ESIC 扩展条目(或根据 ADBE )进行更改到PAdES-4第4.4节。
总结一下,除了在签名本身中嵌入信息之外,还有其他方法可以启用认证签名LTV吗?有没有办法在签约时创建dds / vri词典?
PAdES-4的添加被描述为参考文档的先前修订版中的签名,而不是指在同一修订版中添加的签名。因此,尽管在技术上可以在同一版本中添加信息,但不能保证它们将由符合标准的PDF查看器使用。