首先,虽然我关注 StackOverflow 已经有一段时间了,但这是我第一次发帖,所以如果我做错了或不符合规则,请随时指出正确的方向。
我正在开发一个 PDF 数字签名应用程序,使用 iText5,在我准备好签名的 PDF 后,它依赖于外部服务来提供签名的散列。
如iText 文档中所述,在第一阶段我准备了 PDF(在最终实现中,所有 PDF 都可能是多签名的,所以我使用附加模式),如下所示:
public static byte[] GetBytesToSign(string unsignedPdf, string tempPdf, string signatureFieldName, List<Org.BouncyCastle.X509.X509Certificate> certificateChain) {
// we create a reader and a stamper
using (PdfReader reader = new PdfReader(unsignedPdf)) {
using (FileStream baos = File.OpenWrite(tempPdf)) {
List<Org.BouncyCastle.X509.X509Certificate> chain = certificateChain;
PdfStamper pdfStamper = PdfStamper.CreateSignature(reader, baos, '\0', null, true);
sap = pdfStamper.SignatureAppearance;
sap.Certificate = certificateChain[0];
sap.SetVisibleSignature(new iTextSharp.text.Rectangle(36, 720, 160, 780), 1, signatureFieldName);
//sap.SetVisibleSignature(signatureFieldName);
sap.SignDate = DateTime.Now;
PdfSignature dic …Run Code Online (Sandbox Code Playgroud) 我有一个关于计算用于数字签名的PDF文档摘要的快速问题(与我之前的一个问题有点相关,我试图弄清楚为什么你需要知道客户的证书才能创建正确的摘要).在Adobe有关PDF格式的文档中,指定了以下内容:
应在文件中的字节范围内计算字节范围摘要,该字节范围摘要应由签名字典中的ByteRange条目指示.此范围应该是整个文件,包括签名字典,但不包括签名值本身(内容条目).
所以在这一点上事情似乎相当简单,只是消化/ Sig字典中除/ Contents条目之外的所有内容./ Contents条目中的实际数据指定如下:
对于公钥签名,Contents应该是DER编码的PKCS#1二进制数据对象或DER编码的PKCS#7二进制数据对象.
所以仍然没有问题,我可以(可能)生成摘要,为/ Contents条目保留空间并稍后附加此PKCS#7对象.当我阅读以下内容时,混乱就开始了:
撤销信息是签名属性,这意味着签名软件必须在签名之前捕获吊销信息.类似的要求适用于证书链.签名软件必须在签名之前捕获并验证证书链.
所以我没有得到的东西:显然/ Contents条目(包含证书和签名摘要)没有消化,但证书链是一个签名属性(因此需要被消化?).
如果有人能够进一步确定消化的内容,我会很感激,也许更好地向我解释已签名的属性.我想回答的主要问题是:我是否可以在事先不知道某人的证书的情况下创建一个可签名的摘要?(我正在使用pkcs7分离签名)
我有一个签名的PDF。我想在文档中显示此签名。我可以这样添加一个新的签名字段:
Stamper.addSignature("My Signature", 1, 20f, 10f, 100f, 100f);
Run Code Online (Sandbox Code Playgroud)
但是我找不到将其与文档中已经存在的签名关联的方法。
如何关联?