...

Атрибуты сертификата ЭЦП в сценарии

Тема в разделе "Разработчикам", создана пользователем a.zahlebin, 17 апр 2019.

  1. a.zahlebin

    a.zahlebin New Member

    Добрый день!

    Пытаемся в бизнес-процессе сделать экспорт документа со штампом ЭЦП (что-то вроде прямоугольного штампа на печатной версии документа с указанием атрибутов ЭЦП: издатель, срок действия и тд). Штамп в PDF вставить получилось. Но не можем получить в сценарии атрибуты ЭЦП. Может, кто-то подскажет, в каком направлении копать?
     
  2. Алекс

    Алекс Member

    Добрый день!
    Реализовать данную задачу можно следующим образом: в базе данных имеется таблица DigitalSignature, в которой содержатся все подписи. ObjectOI указывает на id объекта, к которому эта подпись сделана (Id задачи согласования/ознакомления или Id DocumentAssignUser - в котором хранится Id на подписанную версию документа.
     
  3. a.zahlebin

    a.zahlebin New Member

    Добрый день!

    Спасибо за оперативный ответ. Но задача немного иная. Имеется сертификат квалифицированной ЭЦП, выданной удостоверяющим центром. Им подписан документ в ELMA. На этом документе в печатной версии (в PDF) нужно проставить штамп (картинку) с атрибутами (каким удостоверяющим центром выдан сертификат, сроки действия и т.д.). Как добавить картинку в документ PDF мы разобрались. Не можем понять, как вытащить атрибуты из сертификата. В самой ELMA при подписании эти атрибуты показываются (выделено). То, что выделено, и нужно получить в сценарии для добавления в картинку-прямоугольник штампа.

    upload_2019-4-18_12-39-6.png

    Подпись получаем таким образом:

    var ds = DocumentVersionExtManager.GetDigitalSignature(context.OutgoingLetterDoc.CurrentVersion.SignedUsers.FirstOrDefault(), PublicAPI.Enums.Documents.DigitalSignature.SignatureGeneratingType.Content);
     
  4. Алекс

    Алекс Member

    Если я все правильно понял, то данная информация хранится в БД в виде бинарных данных. Поэтому я думаю, что взять просто так скриптом их не получится.
    Можно уточнить, а почему не использовать просто подписание документа? Я полагаю данный штамп добавляется при подписании документа ЭЦП? Или я ошибаюсь?
     
  5. a.zahlebin

    a.zahlebin New Member

    Если я правильно понял Ваш вопрос, то да, действительно, ЭЦП к документу добавляется при подписании, но чтобы отправить документ контрагенту, его нужно или распечатать (отправка обычной почтой), или выгрузить в виде PDF (отправка электронной почтой), юридически этот документ должен быть заверен живой подписью и печатью, но если он был подписан квалифицированной ЭЦП, то достаточно поместить на печатный документ визуализированную ЭЦП (штампик с информацией), например:

    [​IMG]

    Документы,подписанные усиленным ключем ЭЦП в ELMA, отображают эту информацию. Сама ELMA ее откуда-то вытаскивает. Вопрос - как и откуда?
     
  6. Алекс

    Алекс Member

    В БД есть таблица DigitalSignature в ней есть поле DigitalSignature. Я полагаю вся информация о цифровой подписи хранится там. Но там только бинарный код должен быть судя по типу данного поля. Посмотрите что содержится в этом поле в БД.
     
  7. pushkarev

    pushkarev Active Member

    Может быть я конечно ошибаюсь, но на сколько я знаю, штамп на документе это совсем не обязательный атрибут. Некоторые компания делают печатные копии документов, и чтобы понять что документ был подписан электронно добавляют печать. Это делается только для удобства и никакой юридической силы не несет.
    А для того, чтобы документ имел юридическую силу, вместе с файлом необходимо передавать файл подписи (расширение sgn), который подтверждает, что конкретно такой документ в такой редакции был подписан, таким-то владельцем подписи.
     
  8. a.zahlebin

    a.zahlebin New Member

    Добрый день! Спасибо всем, кто участвовал в обсуждении поставленного нами вопроса. Задачу получения атрибутов ЭЦП в сценарии мы решили. Вот часть кода:

    // Получаем сигнатуру ЭЦП для текущей версии документа (если подписей несколько - берем последнюю)
    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;
     
    1 это нравится
  9. Марина

    Марина New Member

    Спасибо, что поделились.
     

Поделиться: