使用CoSign SAPI签名现有签名字段时无效的签名

问题描述 投票:1回答:1

我有一个带有多个签名字段的pdf。我正在使用iTextSharp来创建带有签名字段的pdf,并且尝试使用CoSign SAPI对每个签名字段进行签名。当我从调用响应中追加签名对象时,签名无效。

下面是我用来从具有许多(签名字段)的pdf文档中签名现有签名字段的代码示例:

public void SignDocument(string filePath, string fieldName, string username, string password)
        {
            byte[] fileBuffer = File.ReadAllBytes(filePath);
            DocumentType document = new DocumentType()
            {
                Item = new DocumentTypeBase64Data()
                {
                    Value = fileBuffer,
                    MimeType = "application/pdf"
                }
            };
            ClaimedIdentity claimedIdentity = new ClaimedIdentity()
            {
                Name = new NameIdentifierType()
                {
                    Value = username
                },
                SupportingInfo = new CoSignAuthDataType()
                {
                    LogonPassword = password
                }
            };
            SAPISigFieldSettingsType sigFieldSettings = new SAPISigFieldSettingsType()
            {
                Invisible = true,
                InvisibleSpecified = true,
                X = 145,
                XSpecified = true,
                Y = 125,
                YSpecified = true,
                Width = 160,
                WidthSpecified = true,
                Height = 45,
                HeightSpecified = true,
                Page = 1,
                PageSpecified = true,
                AppearanceMask = 11,
                AppearanceMaskSpecified = true,
                TimeFormat = new TimeDateFormatType()
                {
                    TimeFormat = "hh:mm:ss",
                    DateFormat = "dd/MM/yyyy",
                    ExtTimeFormat = ExtendedTimeFormatEnum.GMT,
                    ExtTimeFormatSpecified = true
                }
            };

            SignRequest signRequest = new SignRequest()
            {
                InputDocuments = new RequestBaseTypeInputDocuments()
                {
                    Items = new DocumentType[] { document }
                },
                OptionalInputs = new RequestBaseTypeOptionalInputs()
                {
                    SignatureType = "http://arx.com/SAPIWS/DSS/1.0/signature-field-sign",
                    ClaimedIdentity = claimedIdentity,
                    SAPISigFieldSettings = sigFieldSettings,
                    ReturnPDFTailOnly = true,
                    ReturnPDFTailOnlySpecified = true,
                    SignatureFieldName = fieldName
                }
            };
            DssSignResult response = _client.DssSign(signRequest);

            if (response.Result.ResultMajor.Equals(SIGN_SUCCESS_RESULT_MAJOR))
            {
                byte[] signatureBuffer = ((DssSignResultSignatureObjectBase64Signature)response.SignatureObject.Item).Value;
                using (var fileStream = new FileStream(filePath, FileMode.Append))
                {
                    fileStream.Write(signatureBuffer, 0, signatureBuffer.Length);
                }
            }
            else
            {
                throw new Exception(response.Result.ResultMessage.Value);
            }
        }

file

这是我要签名的文件。我正在尝试对签名字段“ sig2-9”进行签名,但是签名无效,并显示消息“对此文档进行了更改,使签名无效”。抱歉,没有发布签名的文档,但是证书所有者不想共享他的个人信息。

signed file

这是签名无效的签名文件。

signed file 2

这是我通过另一个CoSign api调用签名的文件。此调用将创建签名字段并使用与“签名文件”相同的证书对其进行签名。如您所见,该示例中的签名是有效的。在此示例中,我使用了“ http://arx.com/SAPIWS/DSS/1.0/signature-field-create-sign”签名类型。

itext digital-signature docusignapi cosign-api
1个回答
1
投票

布鲁诺和mkl。

我叫Aviv Simionovici,我是DocuSign的DSA(DocuSign签名设备)API专家。

您的代码似乎不错,尽管您可能忘记了以下内容:

Req.OptionalInputs.ReturnPDFTailOnlySpecified = true;
Req.OptionalInputs.ReturnPDFTailOnly = true;

为了方便起见,这是一个将签名附加到PDF的功能:

public bool PDFAttachSignature(string PDFFile, byte[] Signature, bool isDisplayErrorsGUI)
{
   if (Signature == null) return false;
   try
   {
      FileStream f = File.OpenWrite(PDFFile);
      f.Position = f.Length;  //seek to the end of file
      f.Write(Signature, 0, Signature.Length); //write the signature content
      f.Close();
   }
   catch (Exception ex)
   {
      if (isDisplayErrorsGUI)
         MessageBox.Show("Error Attaching the signature\n\nException:\n" + ex.Message, "Error");
         return false;
   }

   return true;
}

带有示例的整个Visual Studio项目为here

您说,当您使用PDF查看器打开PDF时,签名无效。由于证书链中不信任的证书以DSA根证书结尾,这也可能发生。或者因为无法对该链上的证书执行吊销。请查看为什么签名无效。

© www.soinside.com 2019 - 2024. All rights reserved.