Автоматизация проверки электронной подписи является одной из наиболее востребованных задач в ИТ‑инфраструктуре, связанной с электронным документооборотом. С использованием КриптоАРМ Server и модуля trusted-crypto вы можете быстро интегрировать проверку электронной подписи в серверные приложения, обеспечивая надежную проверку подписанных документов в соответствии с законодательством.
В этой статье рассмотрим, как с помощью продукта КриптоАРМ Server и модуля trusted-crypto можно автоматизировать проверку электронной подписи.
КриптоАРМ Server — это продукт, состоящий из:
Модуль trusted-crypto входит в состав КриптоАРМ SDK. В части проверки подписи поддержаны стандарты от CAdES-BES до CAdES-A, методы для построения цепочек и проверки сертификатов, работа с TSP и OCSP и многое другое.
Для работы модуля необходимо следующее окружение и лицензии:
Процесс проверки электронной подписи с помощью модуля 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}`);
}
В микросервисной архитектуре проверка электронной подписи с помощью КриптоАРМ Сервер и trusted‑crypto может быть вынесена в отдельный сервис, который будет отвечать исключительно за криптографические операции. Такой подход упрощает масштабирование системы и повышает безопасность, так как каждый микросервис имеет ограниченный доступ к различным компонентам системы.
Проверка подписи документа
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": "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": "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. Мы также готовы предложить услуги по интеграции решений «под ключ».