如何使用itext7将外部生成的签名应用于PDF?

如何使用itext7将外部生成的签名应用于PDF?,pdf,itext,itext7,Pdf,Itext,Itext7,我正在尝试将第三方服务生成的签名应用于PDF 我觉得我几乎正确地调用了所有内容,但毫不奇怪,当我查看签名文档时,我被告知签名无效。在这个过程中,有很多步骤可能会出错,正如我所了解的,这种绊脚石是意料之中的 您的类ThirdPartySignatureContainer实现IExternalSignatureContainer;因此,它的sign方法将返回一个CMS签名容器,以便按原样嵌入到PDF中。但是,通过检查,您的远程签名服务(以及sign方法)会返回裸签名字节 因此,您应该实现IExter

我正在尝试将第三方服务生成的签名应用于PDF


我觉得我几乎正确地调用了所有内容,但毫不奇怪,当我查看签名文档时,我被告知签名无效。在这个过程中,有很多步骤可能会出错,正如我所了解的,这种绊脚石是意料之中的 您的
类ThirdPartySignatureContainer
实现
IExternalSignatureContainer
;因此,它的
sign
方法将返回一个CMS签名容器,以便按原样嵌入到PDF中。但是,通过检查,您的远程签名服务(以及
sign
方法)会返回裸签名字节

因此,您应该实现
IExternalSignature
sign
方法,该方法应返回裸签名字节。要签名,您将使用
signer.signDetached
重载,而不是
signer.signExternalContainer


这也意味着回答了您的问题,即如何将CRL/OCSP信息添加到PDF中。
signDetached
重载也有
ICrlClient
IOcspClient
参数,这些参数可以提供CRL和OCSP响应以供嵌入。

您能否共享一个由代码签名的示例PDF进行分析?通常,如果知道结果验证失败的确切原因,就更容易确定代码问题。@mkl-添加了一个PDF链接供您签出,谢谢!太神了好吧,看起来好像签了字,所以我离得不远。关于我在何处/如何指定CRL、OCSP和ITSA客户端,您是否有任何参考资料?我看到示例提供了
…,null,null,null,…
。这是说无,还是“使用默认值”
null
表示无。有关Java示例,请查看github上的itext 7示例,特别是
C3_09_SignWithTSA.Java
C3_07_SignWithOCSP.Java
C3_04_SignWithCRLOnline.Java
,以及
C3_05_SignWithCRLOffline.Java
。它们是来自白皮书的iText 5样本的端口。明白了,所以我需要更多阅读!有一个算法不匹配。签名容器中的SignerInfo选择SHA256,加密的DigestInfo包含适当的SHA256散列值,但它声称它是SHA512散列值。可能您必须更改对相关签名服务器的调用,以包含您选择的哈希算法,或者您必须切换到SHA512。我已经开始编写一个工具来挖掘sich问题--必须知道如何读取输出;)。