CAdES-BES представляет собой профиль расширенных электронных подписей на основе CMS (Cryptographic Message Syntax), определённый в стандартах ETSI, и описывает базовый уровень подписи, в котором гарантируется целостность данных и идентификация подписанта без добавления временных меток, атрибутов долгосрочной валидации или архивных структур.
В экосистеме JavaScript работа с данным форматом реализуется через библиотеку jsrsasign, которая предоставляет низкоуровневые и высокоуровневые средства для формирования CMS/PKCS
CAdES-BES (Basic Electronic Signature) базируется на CMS SignedData и включает минимальный набор элементов, необходимых для признания электронной подписи:
Ключевым элементом является набор signed attributes, который делает подпись устойчивой к подмене контекста и обеспечивает криптографическую привязку подписи к конкретным данным и сертификату.
В CAdES-BES обязательно присутствуют:
Дополнительно могут присутствовать:
Библиотека jsrsasign опирается на объектную модель криптографии, где ключевые сущности представлены классами:
Генерация CAdES-BES подписи осуществляется через CMS SignedData builder, который формирует ASN.1 структуру, сериализует её в DER и затем кодирует в Base64 или бинарный формат.
Поддерживаемые алгоритмы включают:
В jsrsasign процесс формирования CAdES-BES подписи строится вокруг объекта CMS SignedData. Базовая структура включает данные, сертификат и приватный ключ подписанта.
Основной процесс можно разложить на этапы:
Пример формирования CMS подписи:
const jsrsasign = require("jsrsasign");
const msg = "Data to be signed";
const certPEM = `-----BEGIN CERTIFICATE-----
MIIC...IDAQAB
-----END CERTIFICATE-----`;
const privateKeyPEM = `-----BEGIN PRIVATE KEY-----
MIIE...AB
-----END PRIVATE KEY-----`;
const cmsSigned = new jsrsasign.KJUR.crypto.CMS.CMSSignedData({
content: { str: msg },
certs: [certPEM],
signerInfos: [{
sid: { cert: certPEM },
digestAlgorithm: "sha256",
signatureAlgorithm: "SHA256withRSA",
signingAttributes: [
{ type: "contentType" },
{ type: "messageDigest" },
{ type: "signingTime" },
{ type: "signingCertificate" }
],
sigKey: privateKeyPEM
}]
});
const pem = cmsSigned.getPEM();
В данной структуре CMSSignedData выполняет автоматическую генерацию ASN.1 контейнера, включая вычисление хешей и формирование подписанных атрибутов.
Signed attributes являются критическим элементом профиля. Они подписываются вместе с хешем документа, формируя защищённую область данных.
Основные атрибуты:
Содержит хеш исходного сообщения. Вычисляется перед подписью и включается в DER структуру.
Определяет тип подписываемого контента, обычно id-data для произвольных данных.
Содержит хеш сертификата подписанта. V2 используется для SHA-256 и выше.
Фиксирует локальное время подписи, но не является доверенным временем в юридическом смысле.
jsrsasign автоматически формирует данные атрибуты при использовании CMS API, однако возможно явное управление ими через структуру signerInfos.
CAdES-BES в терминах ASN.1 CMS имеет следующую логическую структуру:
ContentInfo
contentType: signedData
content: SignedData
SignerInfo содержит:
jsrsasign реализует сериализацию этой структуры через внутренние ASN.1 классы:
CAdES-BES требует включения сертификата подписанта в контейнер SignedData. jsrsasign предоставляет инструменты для работы с PEM/DER сертификатами:
const x509 = new jsrsasign.X509();
x509.readCertPEM(certPEM);
const serial = x509.getSerialNumberHex();
const issuer = x509.getIssuerString();
Сертификат используется для:
Проверка выполняется через CMS SignedData parser:
const cms = new jsrsasign.KJUR.crypto.CMS.CMSSignedData({
pem: cmsSignedPEM
});
const result = cms.verify();
Процесс проверки включает:
Ключевым моментом является проверка signed attributes, поскольку именно они защищают структуру от изменения контекста подписи.
CAdES-BES может использовать два режима:
Данные включаются внутрь CMS структуры (encapsulated content). В jsrsasign это выражается через content.str.
Данные не включаются в CMS, а передаются отдельно. В этом случае:
Пример detached режима:
const cms = new jsrsasign.KJUR.crypto.CMS.CMSSignedData({
content: { str: "" },
detached: true,
certs: [certPEM],
signerInfos: [{
sid: { cert: certPEM },
sigKey: privateKeyPEM
}]
});
CAdES-BES требует согласованности алгоритмов между хешированием и подписью. jsrsasign поддерживает:
Подпись формируется через PKCS#1 v1.5 или ECDSA:
Выбор алгоритма влияет на формирование signingCertificateV2 и структуру DigestInfo.
Реализация CAdES-BES в jsrsasign ориентирована на совместимость с PKCS#7/CMS, а не на полный стек ETSI расширений. Это означает:
Внутренняя модель строится на:
При использовании SHA-256 и выше применяется структура ESSCertIDv2:
jsrsasign автоматически формирует этот атрибут при наличии сертификата и корректного алгоритма подписи.
В процессе генерации CAdES-BES часто возникают структурные несоответствия:
CMS SignedData требует строгого соблюдения ASN.1 порядка, иначе верификация будет невозможна.
jsrsasign использует иерархию объектов DER:
Signed attributes кодируются как SET OF Attribute, где каждый атрибут представляет:
Подпись вычисляется не по сырому документу, а по DER-encoded signedAttrs, что критически важно для корректной реализации CAdES-BES.
CAdES-BES, сформированный через jsrsasign, совместим с системами, поддерживающими:
Совместимость определяется корректностью ASN.1 структуры и соответствием signed attributes стандарту ETSI.
CMS является базовым контейнером, на котором строится весь стек CAdES:
jsrsasign реализует первую ступень этой иерархии, обеспечивая фундамент для построения более сложных профилей поверх SignedData структуры