Автоматизация проверки электронной подписи с использованием КриптоАРМ Сервер - Документация
Перейти к содержанию

Документация

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

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

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

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

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

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

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

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

  • Node.js;
  • КриптоПро CSP;
  • Лицензии на КриптоАРМ и КриптоПро (серверные);
  • Лицензии на КриптоПро TSP Client и КриптоПро OCSP Client, если нужна работа с усовершенствованной подписью.

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

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

Рассмотрим каждый этап подробнее на примере.

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

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

// Инициализация объекта для работы с подписанными данными
const cms = new trusted.cms.SignedData();

// Чтение файла с электронной подписью
cms.load("./outfile.sig");

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

Второй — импорт буфера:

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

//Получим кодировку прочитав первые байты сообщения
const encoding = getBufferEncoding(cmsBuffer);

//Импорт буфера в объект подписи
cms.import(cmsBuffer, trusted.DataFormat[encoding!]);

2. Проверка подписи

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

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

Для асинхронной работы можно использовать метод verifyAsync.

cms.verifyAsync((error, result) => {
    if (error) {
        console.error(`Ошибка проверки подписи: ${error}`);
    } else {
        console.log(`Результат проверки: ${result}`);
    }
});

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.

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

Запросите триальную лицензию заполнив форму на сайте cryptoarm.ru.

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

Для повышения удобства работы и хранения данных веб-сайт TRUSTED.RU использует файлы COOKIE. Продолжая работу с веб-сайтом, Вы даете свое согласие на работу с этими файлами.