Неверная подпись при подписании существующего поля сигнатуры с помощью CoSign SAPI

У меня есть 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);
            }
        }

файл

Это файл, который я хочу подписать. Я пытаюсь подписать поле подписи "sig2-9", но подпись недействительна с сообщением "В этот документ были внесены изменения, которые делают подпись недействительной". Извините, что не опубликовал подписанный документ, но владелец сертификата не хочет делиться своей личной информацией.

подписанный файл

Это подписанный файл с неверной подписью.

подписанный файл 2

Это файл, который я подписал с помощью другого вызова CoSign API. Этот вызов создает поле подписи и подписывает его тем же сертификатом, что и "подписанный файл". Как видите, подпись в этом примере действительна. В этом примере я использовал тип подписи " http://arx.com/SAPIWS/DSS/1.0/signature-field-create-sign".

1 ответ

Бруно и мкл.

Меня зовут Авив Симионович, я являюсь специалистом по API DSA (DocuSign Signature Appliance) из DocuSign.

Ваш код выглядит нормально, хотя вы можете забыть следующее:

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;
}

Весь визуальный студийный проект с образцом находится здесь.

Вы указали, что подпись недействительна при открытии PDF-файла с помощью средства просмотра PDF. Это также может произойти из-за ненадежного сертификата в цепочке сертификатов, заканчивающегося корневым сертификатом DSA. Или потому, что отзыв сертификатов в этой цепочке не может быть выполнен. Пожалуйста, посмотрите, почему подпись не действительна.

Другие вопросы по тегам