Автоматизация проверки электронной подписи с использованием КриптоАРМ Server
Автоматизация проверки электронной подписи является одной из наиболее востребованных задач в ИТ‑инфраструктуре, связанной с электронным документооборотом. С использованием КриптоАРМ Server и модуля trusted-crypto вы можете быстро интегрировать проверку электронной подписи в серверные приложения, обеспечивая надежную проверку подписанных документов в соответствии с законодательством.
В этой статье рассмотрим, как с помощью продукта КриптоАРМ Server и модуля trusted-crypto можно автоматизировать проверку электронной подписи.
КриптоАРМ Server и модуль trusted-crypto
КриптоАРМ Server — это продукт, состоящий из:
- КриптоАРМ SDK (набор модулей для Node.js), среди прочего обеспечивающий простую интеграцию проверки подписей;
- полной документации для разработчиков;
- примера сервиса для проверки подписей и визуализации штампов в PDF-документах.
Модуль trusted-crypto входит в состав КриптоАРМ SDK. В части проверки подписи поддержаны стандарты от CAdES-BES до CAdES-A, методы для построения цепочек и проверки сертификатов, работа с TSP и OCSP и многое другое.
Для работы модуля необходимо следующее окружение и лицензии:
- Node.js;
- КриптоПро CSP;
- лицензии на КриптоАРМ и КриптоПро (серверные);
- лицензии на КриптоПро TSP Client и КриптоПро OCSP Client, если нужна работа с усовершенствованной подписью.
Проверка электронной подписи на сервере
Процесс проверки электронной подписи с помощью модуля trusted-crypto включает несколько этапов: загрузка подписанного файла или импорт буфера, проверка подписи и сертификатов подписчиков. Рассмотрим каждый этап подробнее на примере.
- Загрузка подписанного файла
Первый шаг в процессе — это чтение подписанного файла. Для этого используем метод
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"; } }; - Проверка подписи
После загрузки файла следующим шагом будет проверка подписи с помощью метода
verify. Этот метод возвращает булево значение:true— если подпись действительна, иfalse— если возникла ошибка верификации.// Используем метод проверки подписи const res = cms.verify(); console.log(`Результат проверки: ${res}`); - Работа с отсоединенной подписью
Отсоединенная подпись (detached signature) — это подпись, которая передается отдельно от подписываемого контента. Для проверки такой подписи необходимо загрузить как файл с подписью, так и сам подписанный документ.
cms.load("./outfile.sig"); cms.content = { type: trusted.cms.SignedDataContentType.url, data: "./data.docx" }; const result = cms.verify(); console.log(`Открепленная подпись действительна: ${result}`); - Проверка конкретного подписчика
Если необходимо проверить подпись конкретного подписчика (соподпись), можно получить коллекцию подписчиков с помощью метода
signersи затем передать конкретного подписчика в методverify.const signers = cms.signers(); const signer = signers.items(0); // Выбираем первого подписчика const result = cms.verify(signer); console.log(`Подпись подписчика действительна: ${result}`); - Проверка сертификатов подписчика
Для проверки сертификата подписчика можно извлечь его из объекта 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}`); }
Использование в микросервисной архитектуре
В микросервисной архитектуре проверка электронной подписи с помощью КриптоАРМ Server и 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"
- Status 200: подпись валидна.
Примеры кода и документация
Для более глубокого изучения возможностей модуля trusted-crypto и его применения для автоматической проверки электронной подписи в форматах CAdES-BES, CAdES-T, CAdES-X Long Type 1 и CAdES-A на сервере рекомендуем ознакомиться с документацией и примерами кода. Они помогут вам интегрировать проверку подписей в серверные и микросервисные архитектуры. Сервис доступен по ссылке.
Документация на модуль trusted-crypto.
Попробуйте бесплатную демонстрацию возможностей КриптоАРМ Server и модуля trusted-crypto, загрузив SDK. Для получения триальной лицензии напишите в онлайн-чат.
Если у вас есть вопросы по интеграции модуля trusted-crypto в ваши серверные решения или вы хотите узнать больше о возможностях автоматической проверки электронной подписи, свяжитесь с нами по электронной почте sales@cryptoarm.ru. Мы также готовы предложить услуги по интеграции решений «под ключ».