Pdf客户端通过ITextSharp签名

时间:2015-07-27 16:01:56

标签: c# pdf itextsharp

我想通过iTextSharp模拟客户端签名。

我有有效的证书,它被导出为2个文件 - .cer文件(公钥)和.pfx文件(带私钥),pfx文件用作密钥库。公共密钥用于"服务器"。

我也有一个pdf文件 - 例如https://yadi.sk/i/6vuDlEPXi7oYz。我的代码复制在这个要点中:https://gist.github.com/alex-t0/f446ccb5ca5e8936b778

简而言之,有3种方法:

  • ServerSidePrepare(准备哈希,使用公钥)
  • ClientSideSign(通过私钥签名)
  • SaveSignedDocumentOnServer(将签名合并到服务器上的pdf中)。

但是此代码生成pdf文档,该签名无效。当pdf中使用的方法MakeSignature.SignDetached签名有效时,一切正常。

如何调试此问题并查找问题?或者可能是pdf客户端签名的其他示例?使用服务器部分,在c#中。

1 个答案:

答案 0 :(得分:2)

您在GetEncodedPKCS7电话中使用了错误的摘要。

首次构建经过身份验证的属性时,您(正确地)使用

sgn.getAuthenticatedAttributeBytes(messageHash, now, null, null, CryptoStandard.CMS)

但稍后在实际构建PKCS7签名容器时,您可以

result.Sign.GetEncodedPKCS7(result.Hash, result.Now, null, null, null, CryptoStandard.CMS);

这两个调用的参数必须相同(后一个调用中的附加ITSAClient参数除外)。否则,最终经过身份验证的属性(内置于GetEncodedPKCS7)与原始属性(内置于getAuthenticatedAttributeBytes)不同,并且需要不同的签名值。

因此,您应该在DTO中加入byte[] messageHash并在SaveSignedDocumentOnServer中使用它。