Автоматизация проверки электронной подписи с использованием КриптоАРМ Server

Александр Гаврилов · 23 окт 2024 · 278 · Поделиться

Автоматизация проверки электронной подписи является одной из наиболее востребованных задач в ИТ‑инфраструктуре, связанной с электронным документооборотом. С использованием КриптоАРМ Server и модуля trusted-crypto вы можете быстро интегрировать проверку электронной подписи в серверные приложения, обеспечивая надежную проверку подписанных документов в соответствии с законодательством.

В этой статье рассмотрим, как с помощью продукта КриптоАРМ Server и модуля trusted-crypto можно автоматизировать проверку электронной подписи.

КриптоАРМ Server и модуль trusted-crypto

КриптоАРМ Server — это продукт, состоящий из:

  • КриптоАРМ SDK (набор модулей для Node.js), среди прочего обеспечивающий простую интеграцию проверки подписей;
  • полной документации для разработчиков;
  • примера сервиса для проверки подписей и визуализации штампов в PDF-документах.

Модуль trusted-crypto входит в состав КриптоАРМ SDK. В части проверки подписи поддержаны стандарты от CAdES-BES до CAdES-A, методы для построения цепочек и проверки сертификатов, работа с TSP и OCSP и многое другое.

Для работы модуля необходимо следующее окружение и лицензии:

Проверка электронной подписи на сервере

Процесс проверки электронной подписи с помощью модуля trusted-crypto включает несколько этапов: загрузка подписанного файла или импорт буфера, проверка подписи и сертификатов подписчиков. Рассмотрим каждый этап подробнее на примере.

  1. Загрузка подписанного файла

    Первый шаг в процессе — это чтение подписанного файла. Для этого используем метод load или его асинхронный аналог loadAsync.

    
    // Инициализация объекта для работы с подписанными данными
    const cms = new trusted.cms.SignedData();
    
    // Чтение файла с электронной подписью
    cms.load("./outfile.sig");
                                        

    Метод загружает файл с расширением .sig, содержащий электронную подпись. Возможна работа с разными форматами кодировками, такими как DER или BASE64.

    Второй вариант, импорт буфера:

    
    // Метод определения кодировки для буфера
    export const getBufferEncoding = (cmsBuffer) => {
        const firstTwoSymbols = cmsBuffer.toString("utf8", 0, 2);
        if (firstTwoSymbols === "--" || firstTwoSymbols === "MI") {
            return "PEM";
        } else {
            return "DER";
        }
    };
                                        
  2. Проверка подписи

    После загрузки файла следующим шагом будет проверка подписи с помощью метода verify. Этот метод возвращает булево значение: true — если подпись действительна, и false — если возникла ошибка верификации.

    
    // Используем метод проверки подписи
    const res = cms.verify();
    console.log(`Результат проверки: ${res}`);
                                        
  3. Работа с отсоединенной подписью

    Отсоединенная подпись (detached signature) — это подпись, которая передается отдельно от подписываемого контента. Для проверки такой подписи необходимо загрузить как файл с подписью, так и сам подписанный документ.

    
    cms.load("./outfile.sig");
    cms.content = {
        type: trusted.cms.SignedDataContentType.url,
        data: "./data.docx"
    };
    const result = cms.verify();
    console.log(`Открепленная подпись действительна: ${result}`);
                                        
  4. Проверка конкретного подписчика

    Если необходимо проверить подпись конкретного подписчика (соподпись), можно получить коллекцию подписчиков с помощью метода signers и затем передать конкретного подписчика в метод verify.

    
    const signers = cms.signers();
    const signer = signers.items(0); // Выбираем первого подписчика
    const result = cms.verify(signer);
    console.log(`Подпись подписчика действительна: ${result}`);
                                        
  5. Проверка сертификатов подписчика

    Для проверки сертификата подписчика можно извлечь его из объекта Signer или передать сертификат отдельно. Далее строим цепочку и проверяем сертификат.

    
    function verifyCertificate(cert) {
        return new Promise((resolve, reject) => {
            trusted.utils.Csp.verifyCertificateChainAsync(cert, (errorMsg, result) => {
                if (errorMsg) {
                    return reject({
                        title: 'Не удалось проверить цепочку сертификатов для ' + cert?.subjectFriendlyName,
                        text: 'verifyCertificateChainAsync: ' + errorMsg,
                        timestamp: new Date().toISOString(),
                    });
                }
                resolve(result);
            });
        });
    }
    
    function buildChain(cert) {
        return new Promise((resolve, reject) => {
            trusted.utils.Csp.buildChainAsync(cert, (errorMsg, certCollection) => {
                if (errorMsg) {
                    return reject({
                        title: 'Не удалось построить цепочку сертификатов для ' + cert?.issuerFriendlyName,
                        text: 'buildChainAsync: ' + errorMsg,
                        timestamp: new Date().toISOString(),
                    });
                }
                resolve(certCollection);
            });
        });
    }
    
    const certificate = signer.certificate;
    const certChain = await buildChain(certificate);
    
    for (let i = 0; i < certChain?.length; i++) {
        const cert = certChain?.items(i);
        const result = await verifyCertificate(cert);
        console.log(`Статус сертификата: ${result}`);
    }
                                        

Использование в микросервисной архитектуре

В микросервисной архитектуре проверка электронной подписи с помощью КриптоАРМ Сервер и trusted‑crypto может быть вынесена в отдельный сервис, который будет отвечать исключительно за криптографические операции. Такой подход упрощает масштабирование системы и повышает безопасность, так как каждый микросервис имеет ограниченный доступ к различным компонентам системы.

Пример возможного REST API

Проверка подписи документа

  • Метод: POST /api/v1/signature/verify;
  • Описание: проверяет электронную подпись документа;
  • Запрос:

    Content-Type: application/json или multipart/form-data (если файлы передаются через форму);

  • Параметры:
    • document (обязательный, Base64, File): документ, для которого нужно проверить подпись.
    • signature (обязательный, Base64, File): подпись в формате CMS.
    • certificate (опциональный, Base64, File): сертификат, используемый для проверки подписи (если не встроен в подпись).
    • type (опциональный, string): тип подписи (CAdES, CMS, XLT1). По умолчанию — автоопределение.
    • detached (опциональный, boolean): указывает, является ли подпись открепленной от документа (detached).
  • Ответ:
    • Status 200: подпись валидна.
      
      "status": "valid",
      "details": {
          "issuer": "Issuer CN",
          "subject": "Subject CN",
          "valid_from": "2024-01-01T00:00:00Z",
          "valid_to": "2026-01-01T00:00:00Z",
          "signing_time": "2024-10-14T12:30:00Z"
      }
                                                  
    • Status 400: ошибка валидации подписи.
      
      "status": "invalid",
      "error": "Signature does not match the document"
                                                  

Примеры кода и документация

Для более глубокого изучения возможностей модуля trusted-crypto и его применения для автоматической проверки электронной подписи в форматах CAdES-BES, CAdES-T, CAdES-X Long Type 1 и CAdES-A на сервере рекомендуем ознакомиться с документацией и примерами кода. Они помогут вам интегрировать проверку подписей в серверные и микросервисные архитектуры. Сервис доступен по ссылке.

Документация на модуль trusted-crypto.

Попробуйте бесплатную демонстрацию возможностей КриптоАРМ Сервер и модуля trusted-crypto, загрузив SDK. Запросите триальную лицензию, заполнив форму.

Если у вас есть вопросы по интеграции модуля trusted-crypto в ваши серверные решения или вы хотите узнать больше о возможностях автоматической проверки электронной подписи, свяжитесь с нами по электронной почте sales@cryptoarm.ru. Мы также готовы предложить услуги по интеграции решений «под ключ».



Вернуться к списку новостей

Подпишитесь и получайте новые статьи по почте

Заполните поле Подписаться

Подписываясь, вы соглашаетесь на получение информационных сообщений от компании
ООО «Цифровые технологии» на условиях Политики конфиденциальности

Спасибо, что подписались
на нашу рассылку!

Узнавайте новости первыми —
подпишитесь на нашу новостную рассылку

Заполните поле
Подписаться

Подписываясь, вы соглашаетесь на получение информационных сообщений от компании
ООО «Цифровые технологии» на условиях Политики конфиденциальности

Спасибо, что подписались
на нашу рассылку!