我想通过iTextSharp模拟客户端签名。
我有有效的证书,它被导出为2个文件 - .cer文件(公钥)和.pfx文件(带私钥),pfx文件用作密钥库。公共密钥用于"服务器"。
我也有一个pdf文件 - 例如https://yadi.sk/i/6vuDlEPXi7oYz。我的代码复制在这个要点中:https://gist.github.com/alex-t0/f446ccb5ca5e8936b778。
简而言之,有3种方法:
但是此代码生成pdf文档,该签名无效。当pdf中使用的方法MakeSignature.SignDetached签名有效时,一切正常。
如何调试此问题并查找问题?或者可能是pdf客户端签名的其他示例?使用服务器部分,在c#中。
答案 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
中使用它。