C# 通过ITextSharp进行Pdf客户端签名

C# 通过ITextSharp进行Pdf客户端签名,c#,pdf,itextsharp,C#,Pdf,Itextsharp,我想通过iTextSharp模拟客户端签名 我有有效的证书,它在两个文件中导出-.cer文件(公钥)和.pfx文件(带私钥),pfx文件用作密钥库。“服务器”上使用的公钥 我还有一个pdf文件,例如。我的代码在此摘要中复制: 简而言之,有3种方法: ServerSidePrepare(准备哈希,使用公钥) ClientSideSign(通过私钥签名) SaveSignedDocumentOnServer(在服务器上将签名合并为pdf) 但此代码生成pdf文档,该签名无效。当使用方法MakeS

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

我有有效的证书,它在两个文件中导出-.cer文件(公钥)和.pfx文件(带私钥),pfx文件用作密钥库。“服务器”上使用的公钥

我还有一个pdf文件,例如。我的代码在此摘要中复制:

简而言之,有3种方法:

  • ServerSidePrepare(准备哈希,使用公钥)
  • ClientSideSign(通过私钥签名)
  • SaveSignedDocumentOnServer(在服务器上将签名合并为pdf)
但此代码生成pdf文档,该签名无效。当使用方法MakeSignature.SignDistached时,pdf中的签名有效,一切正常


如何调试并发现问题?或者可能是pdf客户端签名的其他示例?带有服务器部分,使用c#

您在
GetEncodedPKCS7
调用中使用了错误的摘要

首次构建(正确)使用的已验证属性时

但稍后在实际构建PKCS7签名容器时

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


因此,您应该在DTO中包含
byte[]messageHash
,并在
saveSignedDocumentServer

中使用它。您是否可以共享一个示例结果PDFOf课程:使用客户端签名时文件错误:。使用MakeSignature.SignDistached时文件正确:。太好了!我更新了我的要点,也许对某人有用。
result.Sign.GetEncodedPKCS7(result.Hash, result.Now, null, null, null, CryptoStandard.CMS);