我正在使用iText
用数字证书签署pdf。现在我可以签名并添加LTV,但是CertificateLevel可以是:
signatureAppearance.setCertificationLevel(PdfSignatureAppearance.CERTIFIED_FORM_FILLING_AND_ANNOTATIONS);
我只想设置PdfSignatureAppearance.CERTIFIED_NO_CHANGES_ALLOWED
。最终结果应如下所示:
sap.setCertificationLevel(PdfSignatureAppearance.CERTIFIED_NO_CHANGES_ALLOWED);
MakeSignature.signDetached(signatureAppearance, privateKey, "SHA-512", chain, null, ocspClient, tsaClient, 0, MakeSignature.CryptoStandard.CADES);
如果我使用上面的代码签名,则使用AdobeLtvEnabling.java添加LTV会在使用ACROBAT检查时提示签名无效,因为添加LTV时文件正在修改不可修改的PDF文件。因此,我该怎么做才能达到最终效果。
答案 0 :(得分:2)
要获得类似快照中的结果,即“不允许更改”和“启用了LTV签名”而没有任何更高版本的签名或文档时间戳,则必须
不幸的是,Adobe Acrobat Reader似乎尚未正确支持后一种变体。
有关详细信息,请参见以下部分。
首先,这并不总是可能的。如果您希望LTV素材具有原始签名版本,则它必须是签名数据的一部分,因此必须在签名之前收集。但是,在许多使用远程签名服务的设置中,您不知道在实际请求签名之前将确切使用哪个签名证书。
但是,如果可以的话,即如果您事先知道签名证书,则可以使用this stack overflow answer中的类AdobeLtvEnabling
来包含如下信息:
PdfStamper stamper = PdfStamper.createSignature(...);
AdobeLtvEnabling adobeLtvEnabling = new AdobeLtvEnabling(stamper);
OcspClient ocsp = new OcspClientBouncyCastle();
CrlClient crl = new CrlClientOnline();
adobeLtvEnabling.addLtvForChain(YOUR_SIGNER_CERTIFICATE, ocsp, crl, PdfName.A);
adobeLtvEnabling.outputDss();
[...preparing your signature...]
MakeSignature.signDetached(...);
(CreateSignatureComodo测试testCreateLtvNoChangesAllowedCertification
)
您可能必须为此公开AdobeLtvEnabling
方法addLtvForChain
和outputDss
,因为最初AdobeLtvEnabling
并不打算这样使用。
结果:
或者,您可以通过一种方式对PDF进行签名,尽管获得了“不允许更改”认证,但仍允许以后添加LTV材料。
首先,如果要在应用签名后将LTV素材添加到PDF,必须使用首先为PAdES签名指定的机制。虽然此机制已包含在ISO 32000-2中,但在普通的ISO 32000-1环境中不可用。不过,由于您的屏幕快照是Adobe Acrobat的,所以这对您来说不是问题。
此机制是文档安全存储区。 iText类LtvVerification
和this stack overflow answer中的AdobeLtvEnabling
类都以PDF填充此类存储。
尽管有“不允许更改”认证,是否仍允许添加这些文档安全性存储库? —这取决于...
如果您的PDF是PDF-2.0:是。 ISO 32000-2表征了某些认证所允许或不允许的更改,例如:
对PDF的更改是增量更新,其中仅包含将DSS的12.8.4.3,“文档安全存储(DSS)”和/或文档时间戳12.8.5,“文档时间戳(DTS)字典”添加到其中所必需的数据该文件不应被视为对以下选择中定义的文件的更改。
(ISO 32000-2,表257 — DocMDP转换参数字典中的条目)
如果您的PDF是启用了PAdES扩展名的PDF-1.x:是。 ETSI EN 319 142-1要求
DocMDP限制(请参阅ISO 32000-1 1,第12.8.2.2条)不适用于PDF文档的增量更新 包含DSS词典以及相关的VRI,证书,CRL和OCSP。
...
在评估DocMDP限制时(请参阅ISO 32000-1 1,第12.8.2.2条),文档是否存在 时间戳字典项将被忽略。
(ETSI EN 319 142-1 V1.1.1,第5.4节验证数据和归档验证数据属性)
如果您的PDF是纯PDF-1.x,则:否!
因此,如果要使用此选项并在签名后添加LTV信息,请确保最初认证的PDF是PDF-2或至少启用了PAdES扩展名。
尽管iText 5不支持PDF-2,但是使用它创建PAdES样式签名会添加PAdES扩展名。
因此,如果您对PAdES样式进行认证,那么即使认证是“不允许更改”,您也应该能够启用LTV签名。
已经进行了一些测试,以扩展仅更改LTV信息的允许不变的经过认证的PDF,或者将PDF标记为带有适当ETSI和Adobe扩展名的PDF-1.7或PDF-2.0,看来Adobe Acrobat不支持ETSI尚未完全符合EN 319 142-1或ISO 32000-2:在所有测试中,它均认为认证不合格,请参见CreateSignatureComodo测试testCreateNoChangesAllowedCertificationAndLtv
。
因此,就目前而言,要获得具有启用了LTV的无更改允许认证的文档并让Adobe Acrobat识别此文件,则只有上面的第一个选项,即将所有LTV资料包括在原始签名的修订版中。
一种解决方法可能是创建允许填写表格的证书,然后添加LTV信息,然后使用另一个(批准)签名进行签名,该签名通过其字段锁定字典将文档更改为不允许更改。其FieldMDP转换,请参阅。 CreateSignatureComodo测试testCreateCertificationAndLtvAndNoChangesAllowed
。但是,由于该签名的增量更新可以由博学的人员删除,因此,这远非完美。
解决方法的结果
答案 1 :(得分:0)
我正在使用itextsharp,我想以下内容也将对您的Java代码有用。
如果使用int main() {
struct node * r = NULL;
int key = 10;
int value = 100;
struct node ele = {&key, &value, NULL, NULL};
map_tree_put(r, &ele);
printf("%d\n", *(int*)r->key); /* I get segmentation fault over here with the first approach but work fine with the second approach */
return 0;
}
和MakeSignature.SignDetached
调用CrlClient
(而不是传递OcspClient
作为参数),则在第一步之后,您将获得启用LTV的签名。然后,您无需执行第二步即可在其后添加文档时间戳。
null
希望这对您有用。