php pdf 加密 签名 时间戳,pdf – 如何为时间戳签名启用LTV?

您所在的位置:网站首页 pdf签名验证 php pdf 加密 签名 时间戳,pdf – 如何为时间戳签名启用LTV?

php pdf 加密 签名 时间戳,pdf – 如何为时间戳签名启用LTV?

2023-12-10 08:19| 来源: 网络整理| 查看: 265

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

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 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的文档时间戳已经连续应用,则可以应用先前时间戳包括的验证信息).这就是为什么Adobe 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 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的最佳实践,而不是Adobe的LTV最佳实践.

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

保护的生命周期可以进一步延长超过上一个文档的生命周期时间戳,通过添加更多DSS信息来验证上一个上一个文档时间戳以及新文档时间戳.这在图3中示出.

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,您必须具有启用LTV的DSS才能显示.没有时间戳

(常规或文件级别)是必需的.

由于这种分歧,根据ETSI的带有LTV的PDF文档通常由Adobe软件提供,以具有一个不具有LTV的文档时间戳.

也可以看看



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3