Неверная подпись при подписании существующего поля сигнатуры с помощью 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", но подпись недействительна с сообщением "В этот документ были внесены изменения, которые делают подпись недействительной". Извините, что не опубликовал подписанный документ, но владелец сертификата не хочет делиться своей личной информацией.
Это подписанный файл с неверной подписью.
Это файл, который я подписал с помощью другого вызова 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. Или потому, что отзыв сертификатов в этой цепочке не может быть выполнен. Пожалуйста, посмотрите, почему подпись не действительна.