Работа с подписями

В системе реализовано взаимодействие с криптографическими провайдерами, выполняющими функции подписания пользовательских данных: НУЦ, КриптоПро и др. Кроме того, пользовательские сценарии позволяют выполнять подписание данных с помощью других облачных крипто-провайдеров. Для работы с данным функционалом необходимо, настроить.

Внутренняя подпись

Для получения данных и контроля изменений в системе возможно получить внутреннюю подпись данных. Данная подпись не является юридически значимой. Ее предназначение - контроль изменений в приложении и фиксация версии данных приложения. С подписью предоставляются также и данные, вычисленные по настройкам подписи приложения. В системе предусмотрено получение внутренней подписи для атрибутов для всех приложений и внутренней подписи файла для приложений типа документ. Для получения внутренней подписи необходимо в сценарий иметь приложение или найти его с помощью объектов [[Global]], [[Namespace]]:

async function workWithDataSigns(): Promise<void> {
    // получение приложения из контекста
    // document - проиложение типа "документ"
    const app = Context.data.document!;

    // получение данных приложения
    const appData = await app.fetch();

    // получение подписей
    const innerSigns = await appData.getDataSigns();

    // найдем внутреннюю подпись атрибутов, что бы подписать данные с помощью провайдера
    const attributesInnerSign = innerSigns.find(innerSign => innerSign.type === SignType.Attributes);
    if (!attributesInnerSign) {
        throw new Error('внутренняя подпись не найдена');
    }
}

Загрузка полученной подписи в систему

В предыдущем примере была получена внутренняя подпись для атрибутов приложения. Каждая внутрення содержит хэш - отпечаток данных и данные, которые были подписаны. В дальнейшем такие данные возможно использовать для отправки провайдеру подписывающему данные:

async function saveSign(): Promise<void> {
    // SignProvider - не существующий провайдер для примера
    // включает в себя 1 метод вычисления подписи из данных
    const signProvider = new SignProvider();
    
    // получение подписи для атрибутов
    const signData = signProvider.sign(attributesInnerSign.body);
    
    const newSign: NewSign = {
        // подпись в формате base64
        sign: signData;
        // Тип подписи, может быть attributes, file соотв. для того, что подписываем
        signType: attributesInnerSign.type;
        // код провайдера
        codeProvider: 'signProvider';
        // ИД файла в формате base64
        body: attributesInnerSign.body,
        // Hash подписанных данных, необходим для идентификации версии подписываемых данных
        hash: attributesInnerSign.hash,
    }
     
    await appData.uploadSign(newSign);
}

Получение файла подписанных атрибутов и файла подписи

Для получения содержимого подписанных атрибутов и самой подписи, возможно использовать метод createAttributesFile и EntitySign.createSignFile. Для того, что бы получить EntitySign необходимо получить историю подписей у приложения. Для нахождения необходимой версии подписи в истории возможно использоваться внутренней подписью приложения:

async function getSignsFiles(): Promise<void> {
    // получение приложения типа "документ" из контекста пользовательского сценария
    const app = Context.data.document!;
    // получение данных приложения
    const appData = await app.fetch();
    // получение истории подписей приложения
    const signsHistory = await appData.getSignsHistory();
    // получение внутренних подписей
    const innerSigns = await appData.getDataSigns();

    // найдем внутреннюю подпись атрибутов, что бы подписать данные с помощью провайдера
    const attributesInnerSign = innerSigns.find(innerSign => innerSign.type === SignType.Attributes);
    if (!attributesInnerSign) {
        throw new Error('внутренняя подпись не найдена');
    }

    // найдем в архиве подпсией, подписи последней версии приложения
    const signs = signsHistory.find(signs => signs.hash === attributesInnerSigns.hash);
    if (!signs) {
        throw new Error('Данная версия не подписана');
    }

    const dataSign = signs.signs[0];

    const attributesFile = await dataSign.createAttributesFile();
    const signFile = await dataSign.createSignFile();
}

Получение детальной информации о подписи

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

  • инфорацию о самой подписи
  • содержимое подписи
  • информацию о публичном ключе с помощью, которого выполнена подпись данных
  • подписанные данные

Для получения данных необходимо вызвать метод EntitySign.getDetails, данный метод позволяет получить детальные данные о подписи. Рассмотрим ситуацию, когда в пользовательском сценарии, необходимо определить Юридическим или Физическим лицом выполнена подпись. Для этого, необходимо получить подпись из истории вызвать метод указанный выше. После получения данных необходимо проанализировать содержимое сертификата:

async function whoMadeSign(): Promise<void> {
    // получение приложения типа "документ" из контекста пользовательского сценария
    const app = Context.data.document!;
    // получение данных приложения
    const appData = await app.fetch();
    // получение истории подписей приложения
    const signsHistory = await appData.getSignsHistory();
    // получение последней подписи
    const sign = signsHistory[0].signs[0];
    // получение информации о подписи
    const signDetails = await sign.getDetails();
    
    // если указано одно из этих полей - то подпись выполнена юридическим лицом
    // также для таких проверок возможно использовать и другие поля сертификата в зависимости
    // от провайдера выдавшего цифровую подпись
    const orgField = signDetails.subject['O'] || signDetails.subject['OU'];
    
    if (orgField !== '') {
        // подпись для юридического лица
    } else {
        // подпись для физического лицм
    }
    
}