Добрый день! Пытаемся в бизнес-процессе сделать экспорт документа со штампом ЭЦП (что-то вроде прямоугольного штампа на печатной версии документа с указанием атрибутов ЭЦП: издатель, срок действия и тд). Штамп в PDF вставить получилось. Но не можем получить в сценарии атрибуты ЭЦП. Может, кто-то подскажет, в каком направлении копать?
Добрый день! Реализовать данную задачу можно следующим образом: в базе данных имеется таблица DigitalSignature, в которой содержатся все подписи. ObjectOI указывает на id объекта, к которому эта подпись сделана (Id задачи согласования/ознакомления или Id DocumentAssignUser - в котором хранится Id на подписанную версию документа.
Добрый день! Спасибо за оперативный ответ. Но задача немного иная. Имеется сертификат квалифицированной ЭЦП, выданной удостоверяющим центром. Им подписан документ в ELMA. На этом документе в печатной версии (в PDF) нужно проставить штамп (картинку) с атрибутами (каким удостоверяющим центром выдан сертификат, сроки действия и т.д.). Как добавить картинку в документ PDF мы разобрались. Не можем понять, как вытащить атрибуты из сертификата. В самой ELMA при подписании эти атрибуты показываются (выделено). То, что выделено, и нужно получить в сценарии для добавления в картинку-прямоугольник штампа. Подпись получаем таким образом: var ds = DocumentVersionExtManager.GetDigitalSignature(context.OutgoingLetterDoc.CurrentVersion.SignedUsers.FirstOrDefault(), PublicAPI.Enums.Documents.DigitalSignature.SignatureGeneratingType.Content);
Если я все правильно понял, то данная информация хранится в БД в виде бинарных данных. Поэтому я думаю, что взять просто так скриптом их не получится. Можно уточнить, а почему не использовать просто подписание документа? Я полагаю данный штамп добавляется при подписании документа ЭЦП? Или я ошибаюсь?
Если я правильно понял Ваш вопрос, то да, действительно, ЭЦП к документу добавляется при подписании, но чтобы отправить документ контрагенту, его нужно или распечатать (отправка обычной почтой), или выгрузить в виде PDF (отправка электронной почтой), юридически этот документ должен быть заверен живой подписью и печатью, но если он был подписан квалифицированной ЭЦП, то достаточно поместить на печатный документ визуализированную ЭЦП (штампик с информацией), например: Документы,подписанные усиленным ключем ЭЦП в ELMA, отображают эту информацию. Сама ELMA ее откуда-то вытаскивает. Вопрос - как и откуда?
В БД есть таблица DigitalSignature в ней есть поле DigitalSignature. Я полагаю вся информация о цифровой подписи хранится там. Но там только бинарный код должен быть судя по типу данного поля. Посмотрите что содержится в этом поле в БД.
Может быть я конечно ошибаюсь, но на сколько я знаю, штамп на документе это совсем не обязательный атрибут. Некоторые компания делают печатные копии документов, и чтобы понять что документ был подписан электронно добавляют печать. Это делается только для удобства и никакой юридической силы не несет. А для того, чтобы документ имел юридическую силу, вместе с файлом необходимо передавать файл подписи (расширение sgn), который подтверждает, что конкретно такой документ в такой редакции был подписан, таким-то владельцем подписи.
Добрый день! Спасибо всем, кто участвовал в обсуждении поставленного нами вопроса. Задачу получения атрибутов ЭЦП в сценарии мы решили. Вот часть кода: // Получаем сигнатуру ЭЦП для текущей версии документа (если подписей несколько - берем последнюю) var ds = DocumentVersionExtManager.GetDigitalSignature(context.OutgoingLetterDoc.CurrentVersion.SignedUsers.LastOrDefault(), PublicAPI.Enums.Documents.DigitalSignature.SignatureGeneratingType.Content).Signature; X509Certificate2 sign = new X509Certificate2(ds); // Получение нужных полей и последующий парсинг для получения атрибутов ЭЦП при необходимости string signSerialNumber = sign.SerialNumber.ToUpper(); // Серийный номер сертификата ЭЦП string signNotBebore = sign.NotBefore.ToShortDateString(); // Срок действия ЭЦП: от string signNotAfter = sign.NotAfter.ToShortDateString(); // Срок действия ЭЦП: до string dn = sign.Subject; string pattern = string.Empty; string signSubjOrgItem = string.Empty; // Должность владельца ЭЦП pattern = @"T=([^,]*)"; Regex re = new Regex(pattern); Match m = re.Match(dn); if (m.Success) { signSubjOrgItem = Regex.Replace(m.Groups[1].Value, @"(\"")\1+", @"""").TrimStart('"').ToUpper(); // Парсинг. Элементс с индексом 1 содержит первое совпадение из группы } string signSubjSurname = string.Empty; // Фамилия владельца ЭЦП pattern = @"SN=([^,]*)"; re = new Regex(pattern); m = re.Match(dn); if (m.Success) { signSubjSurname = Regex.Replace(m.Groups[1].Value, @"(\"")\1+", @"""").TrimStart('"').ToUpper(); // Парсинг. Элементс с индексом 1 содержит первое совпадение из группы } string signSubjName = string.Empty; // ИО владельца ЭЦП pattern = @"G=([^,]*)"; dn = sign.Subject; re = new Regex(pattern); m = re.Match(dn); if (m.Success) { signSubjName = Regex.Replace(m.Groups[1].Value, @"(\"")\1+", @"""").TrimStart('"').ToUpper(); // Парсинг. Элементс с индексом 1 содержит первое совпадение из группы } Для работы с криптографией и регулярными выражениями необходимо также подключить пространства имен: using System.Text.RegularExpressions; using System.Security.Cryptography.X509Certificates; using System.Security.Cryptography.Pkcs; using System.Security.Cryptography;