嵌入CMS签名后,签名无效。

时间:2019-08-27 11:52:47

标签: c# pdf itext7

我已经获取了文档哈希,并从签名服务器获取了签名,该服务器向我返回了CMS签名。 以下是代码段:

Stream resultStream = new MemoryStream();

Stream readerStream = new MemoryStream(documentBytes);
PdfReader pdfReader = new PdfReader(readerStream);
byte[] signedDocument;

PdfSigner pdfSigner = new PdfSigner(pdfReader, resultStream, new StampingProperties().UseAppendMode());

PdfAcroForm acroForm = PdfAcroForm.GetAcroForm(pdfSigner.GetDocument(), true);

PdfSignatureFormField signatureFormField = (PdfSignatureFormField)acroForm.GetField("Signature1");

var signatureRects = signatureFormField.GetPdfObject().GetAsRectangle(PdfName.Rect);

pdfSigner.SetFieldName("Signature1");

ImageData imageData = ImageDataFactory.Create(handSignatureBytes);

PdfSignatureAppearance sigAppearance = pdfSigner.GetSignatureAppearance();
sigAppearance.SetContact("ContactInfo");
sigAppearance.SetLocation("Location");
sigAppearance.SetPageNumber(1);
sigAppearance.SetReason("SigningReason");
sigAppearance.SetSignatureGraphic(imageData);
sigAppearance.SetSignatureCreator("Malik");
sigAppearance.SetPageRect(signatureRects);
sigAppearance.SetReuseAppearance(false);
pdfSigner.SetSignDate(signingTime);

pdfSigner.GetDocument().GetCatalog().SetModified();

int estimatedSize = 12480;

IExternalSignatureContainer signatureContainer = new ExternalContainer(document_id);

pdfSigner.SignExternalContainer(signatureContainer, estimatedSize);

signedDocument = ((MemoryStream)resultStream).ToArray();

签名容器实现:

public string documentId;
public ExternalContainer(string docId)
{
    documentId = docId;
}
public void ModifySigningDictionary(PdfDictionary signDic)
{
    signDic.Put(PdfName.Filter, PdfName.Adobe_PPKLite);
    signDic.Put(PdfName.SubFilter, PdfName.Adbe_pkcs7_detached);
}

public byte[] Sign(Stream data)
{
    //Send HTTP call to signing server and get CMS signature base64
    byte[] signedData = Convert.FromBase64String(result[0]);
    return signedData;
}

从IExternalSignatureContainer实现中获取签名文档后,Adobe说: 签名无效 应用签名以来,文档已被更改或损坏

0 个答案:

没有答案