我有一个带有签名字节的数组和一个带有ocsp字节的数组,用于将ltv信息添加到我的pdf中。签名是时间戳签名。现在我尝试将此信息添加到与
一起使用的pdf文件中//add signature
PdfLiteral pdfLiteral = (PdfLiteral) pdfSignature.get( PdfName.CONTENTS );
byte[] outc = new byte[ ( pdfLiteral.getPosLength( ) - 2 ) / 2 ];
Arrays.fill( outc, (byte) 0 );
System.arraycopy( externalSignature, 0, outc, 0, externalSignature.length );
PdfDictionary dic2 = new PdfDictionary( );
PdfString pdfString = new PdfString( outc ).setHexWriting( true );
dic2.put( PdfName.CONTENTS, pdfString );
pdfSignatureAppearance.close( dic2 );
...
//add LTV
for ( String sigName : stamper.getAcroFields( ).getSignatureNames( ) ) {
addVerification = validation.addVerification(
sigName, // Signature Name
ocspColl, // OCSP
crlColl, // CRL
null // certs
);
}
validation.merge( );
stamper.close( );
好的,这很有效。但在签名中我必须设置标志认证级别1(不允许更改),我的应用程序将无法正常工作。因为添加LTV我改变了文档。我尝试创建自己的DSS字典并将其添加到我的文档但它失败了。 有人可以提供帮助吗?提前致谢
答案 0 :(得分:0)
作为ISO-32000-2的ISO委员会成员,我可以访问规范,所以请允许我解释一些事情。
PDF文档中可以有三种类型的签名(*):
- 最多一个认证签名(又名作者签名),
- 一个或多个批准签名(又名收件人签名),
- 任意数量的文档时间戳签名(SubFilter值为ETSI.RFC3161)。
(*)有第四种类型,称为使用权签名,但是 这将在PDF 2.0中弃用。
资料来源:第12.8.1节题为"一般"在第12.8节标题为"数字签名" ISO 32000-2(草案)
您正在谈论文档时间戳签名(由于LTV原因而添加),但您也在谈论DocMDP(MDP代表修改检测和预防)。
MDP仅适用于认证签名:
DocMDP转换方法应用于检测修改 相对于由作者签名的签名字段 文件(申请认证签名的人)。一个文件 只能包含一个包含DocMDP转换的签名字段 方法。它使作者能够指定应该进行哪些更改 允许对文档进行更改以及哪些更改使文档无效 作者的签名。
来源:第12.8.2.2.1节题为"一般"在第12.8.2.2节题为" DocMDP" ISO 32000-2(草案)
当然,您可以在包含"签名参考词典数组"的签名词典中添加参考条目。
签名参考字典可以包含 TransformMethod 条目,其值为:
- DocMDP:用于检测文档相对于文档创建者签名的签名字段的修改。
- FieldMDP:用于检测对TransformParams中指定的表单字段列表的修改。
来源:表259"签名参考字典中的条目"在ISO 32000-1的第12.8.1节中
如果MDP是您想要的,您可以在认证签名的情况下使用DocMDP,在其他签名的情况下使用FieldMDP。但是,如果我们查看表255:签名词典中的条目中的参考条目,我们会看到"如果SubFilter是ETSI.RFC3161,则此条目应为不被使用。"
换句话说,您无法使用DocMDP或FieldMDP作为文档时间戳。这是正常的,因为正如我们在第12.8.5.1节中所述,"一般"第12.8.5节"文件时间戳(DTS)字典":
文档时间戳字典在时间戳令牌中指示的时间建立完整PDF文件的确切内容。
它没有说明将标志设置为"认证级别1(不允许更改)"的能力。这不是文档时间戳的用途。代码失败是正常的。
如果签名是证书签名,则只能使用第一个签名设置认证级别。无论谁告诉您使用文档时间戳签名(ETSI.RFC3161)设置认证级别,都要求您根据即将推出的PDF 2.0 ISO标准做一些不可能的事情。
如果您的后续问题是:那么如何在ISO 32000-1中完成,那么答案很简单:文档时间戳签名在ISO 32000-1中不存在。