当前位置: 首页 > 知识库问答 >
问题:

使用iText向PDF添加单独的签名和单独的ocsp字节

孟鹤龄
2023-03-14

我有一个带有签名字节的数组和一个带有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字典并将其添加到文档中,但失败了。有谁能帮忙吗?提前谢谢

共有1个答案

宋运锋
2023-03-14

作为ISO-32000-2的ISO委员会成员,我可以访问该规范,因此请允许我解释几件事。

PDF文档中可以有3种类型的签名(*):

  • 最多一个认证签名(也称为作者签名),
  • 一个或多个批准签名(又名收件人签名),
  • 任意数量的文档时间戳签名(其子过滤器值为ETSI.RFC3161)

(*)还有第四种类型,称为使用权签名,但在PDF 2.0中不推荐使用。

来源:ISO 32000-2(草案)第12.8节“数字签名”中第12.8.1节“概述”

您正在谈论文档时间戳签名(由于LTV原因而添加),但您也在谈论DocMDP(MDP代表修改检测和预防)。

MDP仅适用于认证签名:

DocMDP转换方法应用于检测与文件作者(应用认证签名的人)签名的签名字段相关的修改。文档只能包含一个包含DocMDP转换方法的签名字段。它使作者能够指定允许对文件进行哪些更改,以及哪些更改会使作者的签名无效。

资料来源: ISO 32000-2(草案)题为DocMDP12.8.2.2中题为一般的第12.8.2.2.1节

当然,您可以向包含“签名参考字典html" target="_blank">数组”的签名字典添加参考条目。

签名引用字典可以有一个带有以下值的Transformmethod条目:

  • DocMDP:用于检测文档相对于由文档发起人签名的签名字段的修改

来源:ISO 32000-1第12.8.1节表259“签名参考词典中的条目”

如果MDP是您想要的,您可以在认证签名的情况下使用DocMDP,在其他签名的情况下使用FieldMDP。但是,如果我们查看表255中的引用条目:签名字典中的条目,我们会看到“如果子过滤器是ETSI. RFC3161,则不应使用该条目。”

换句话说,文档时间戳不能有DocMDP或FieldMDP。这很正常,因为正如我们在第12.8.5节“文档时间戳(DTS)词典”的第12.8.5.1节“概述”中所读到的:

文档时间戳词典在时间戳标记中指定的时间建立完整PDF文件的确切内容。

它没有提到将标志设置为“认证级别1(不允许更改)”的能力。这不是文件时间戳的作用。代码失败是正常的。

设置认证级别只能通过第一个签名来完成,以防该签名是认证签名。无论是谁告诉你使用文档时间戳签名(ETSI. RFC3161)设置认证级别,都是在要求你做一些根据即将到来的PDF 2.0国际标准化组织标准不可能做的事情。

如果你的后续问题是:那么它是如何在ISO 32000-1中完成的,那么答案很简单:文档时间戳签名在ISO 32000-1中不存在。

 类似资料:
  • 我们有一个包含现有字段的PDF表单,我们正在尝试使用默认值向表单添加新字段,但没有成功。基本上,我们正在做以下工作: 字段idClient使用新值更新,但新字段idDocTrackType没有内容。我做错了什么?

  • 我是iText的新手。我想签署一个PDF并添加LTV到它。签署PDF是好的但当我想添加LTV到PDF时,它不显示我的OCSP和时间戳证书的CRL信息。首先,我想描述一下我是如何签约的。-我的证书链:签名证书,签名证书根,时间戳证书,时间戳证书根。(我忘了锁链上有什么东西吗?) 要签名PDF,我使用的是: 之后,我将为签名和时间戳添加LTV。 谢谢你。

  • 出身背景 我使用iTextSharp已经有一段时间了。我已经创建了一个带有两个可签名的PdfFormFields的pdf文档。如果我打开pdf文档,我可以手动对每个字段进行手动签名。我希望通过iTextSharp完成这件事。 我目前正在从X509Store检索证书。直到现在,我都能弄明白。 问题 有人能告诉我如何使用X509Certificate2签署一个已经存在的签名字段吗。 工具书类 以下参考

  • 我想问一个问题,如果我想在多页pdf中添加数字签名,每页都有相同的印章,我是否可以在第一页只添加一次数字签名,然后其他页面只需要引用第一个印章的外观。因为使用这种方法可以减少添加邮票的时间。 我使用了mkl给出的代码,但我有一个问题。我用其他代码替换了以下代码。 原件: 现在: 原始代码在加盖印花时有效,但修改后的代码将使印花无效。我使用Adobe Acrobat Pro DC打开已签名的文档。此

  • 我使用PdfWriter setEncryption对PDF文档进行了加密/解密。一切正常,解密也正常。 当我为数字签名的PDF文档做同样的事情时,我的数字信息与消息一起损坏(SigDict/Contents非法数据) 是否可以在不影响数字签名信息的情况下加密PDF?

  • 我正在开发一个需要调用一些Jenkins实例的应用程序,为此我使用jenkins-cli. jar 我可以使用命令行调用jar以轻松提取其输出。然而,我需要自己解析异常。 为了正确处理异常,我现在通过反射调用jar的main方法: 但现在,我需要以某种方式将jar打印的输出获取到系统中。我知道我可以使用这个系统。放样()。问题是,我有其他线程同时记录。我在这里读到了这个系统。out是特定于类加载器