gpt4 book ai didi

pdf - 如何为时间戳签名启用 LTV?

转载 作者:行者123 更新时间:2023-12-04 22:45:36 25 4
gpt4 key购买 nike

我正在使用 iText 5.5.3 签署 PDF 文档。我需要为这些文档添加时间戳并启用 LTV。我按照说明操作并使用了 addLtv 方法(Lowagie 白皮书中的代码示例 5.9,第 137 页)。我得到一个有 2 个签名的 PDF,这是正常的:第一个是我自己的签名,第二个是文档级时间戳。

但是,Acrobat 告诉我我的签名启用了 LTV,但时间戳签名不是:

Image from Acrobat Pro XI http://img15.hostingpics.net/pics/727285so2.jpg

这是因为时间戳证书的吊销信息未嵌入文档中:

Missing revocation info 1 http://img15.hostingpics.net/pics/491507so2a.jpg

Missing revocation info 2 http://img15.hostingpics.net/pics/312720so2b.jpg

根据我的理解,addLtv 方法 应该获取所有需要的撤销信息并将其嵌入到文档中。这是正确的,还是我必须“手动”获取并嵌入这些信息?

最佳答案

这是这个问题的示例代码:

public void addLtv(String src, String dest, OcspClient ocsp, CrlClient crl, TSAClient tsa) throws IOException, DocumentException, GeneralSecurityException
{
PdfReader r = new PdfReader(src);
FileOutputStream fos = new FileOutputStream(dest);
PdfStamper stp = PdfStamper.createSignature(r, fos, '\0', null, true);
LtvVerification v = stp.getLtvVerification();
AcroFields fields = stp.getAcroFields();
List<String> names = fields.getSignatureNames();
String sigName = names.get(names.size() - 1);
PdfPKCS7 pkcs7 = fields.verifySignature(sigName);
if (pkcs7.isTsp())
{
v.addVerification(sigName, ocsp, crl,
LtvVerification.CertificateOption.SIGNING_CERTIFICATE,
LtvVerification.Level.OCSP_CRL,
LtvVerification.CertificateInclusion.NO);
}
else
{
for (String name : names)
{
v.addVerification(name, ocsp, crl,
LtvVerification.CertificateOption.WHOLE_CHAIN,
LtvVerification.Level.OCSP_CRL,
LtvVerification.CertificateInclusion.NO);
}
}
PdfSignatureAppearance sap = stp.getSignatureAppearance();
LtvTimestamp.timestamp(sap, tsa, null);
}

此代码标识 PDF 中最近填充的签名字段,并检查它是文档时间戳还是普通签名。

如果是文档时间戳,则代码仅针对该文档时间戳添加验证信息。否则,代码会为所有签名添加验证信息。

(这背后的假设工作流程是首先对文档进行多次签名(用于认证和/或批准),然后文档进入 LTV 周期,添加验证信息和文档时间戳,但不再需要通常的签名。您的工作流程可能会有所不同,因此您的程序逻辑也会有所不同。)

只有在完成所有这些之后,才会添加新的文档时间戳。

对于这个最终添加的时间戳,没有向 PDF 显式添加验证信息(如果来自同一 TSA 的文档时间戳已在短时间内应用,则包含先前时间戳的验证信息可能适用)。这就是 Adob​​e Reader/Acrobat 通常不考虑启用此文档时间戳 LTV 的原因。

如果您也需要此最终文档时间戳的验证信息,只需将此方法(与上述方法相同,只是不添加文档时间戳)应用于具有文档时间戳的文件:
public void addLtvNoTS(String src, String dest, OcspClient ocsp, CrlClient crl) throws IOException, DocumentException, GeneralSecurityException
{
PdfReader r = new PdfReader(src);
FileOutputStream fos = new FileOutputStream(dest);
PdfStamper stp = new PdfStamper(r, fos, '\0', true);
LtvVerification v = stp.getLtvVerification();
AcroFields fields = stp.getAcroFields();
List<String> names = fields.getSignatureNames();
String sigName = names.get(names.size() - 1);
PdfPKCS7 pkcs7 = fields.verifySignature(sigName);
if (pkcs7.isTsp())
{
v.addVerification(sigName, ocsp, crl,
LtvVerification.CertificateOption.SIGNING_CERTIFICATE,
LtvVerification.Level.OCSP_CRL,
LtvVerification.CertificateInclusion.NO);
}
else
{
for (String name : names)
{
v.addVerification(name, ocsp, crl,
LtvVerification.CertificateOption.WHOLE_CHAIN,
LtvVerification.Level.OCSP_CRL,
LtvVerification.CertificateInclusion.NO);
}
}
stp.close();
}

背景

iText addLtv 示例没有(必然)创建支持 LTV 的 PDF 的原因是它更接近于 ETSI 在 PAdES 规范中提出的 LTV 最佳实践,而不是 Adob​​e 的 LTV 最佳实践。

根据 ETSI TS 102 778-4 V1.1.2 (2009-12),应用 LTV 的 PDF 文档的结构如图 2 所示。

Figure 2: Illustration of PDF Document with LTV

通过添加进一步的 DSS 信息来验证先前的最后一个文档时间戳以及一个新的文档时间戳,可以进一步延长保护的生命周期,超过最后一个文档时间戳的生命周期。如图 3 所示。

Figure 3: Illustration of PDF Document with repeated LTV

另一方面, 根据 Adob​​e ( as written by their PDF evangelist Leonard Rosenthol on the iText mailing list in January 2013 ),

LTV enabled means that all information necessary to validate the file (minus root certs) is contained within. So this statement of yours would be true.

the PDF is signed correctly and contains all necessary certificates, a valid CRL or OSCP response for every certificate



但是因为该陈述为真的唯一方法是存在
的 DSS,您必须有 DSS 才能显示启用 LTV。 无时间戳
(常规或文档级别)是必需的。


由于这种差异,根据 ETSI 具有 LTV 的 PDF 文档通常由 Adob​​e 软件呈现,以具有一个不支持 LTV 的文档时间戳。

也可以看看
  • enable LTV in iText
  • LTV enabled signature in PDF
  • Digital signature with timestamp in Java
  • 关于pdf - 如何为时间戳签名启用 LTV?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27892960/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com