CAdES (CMS Advanced Electronic Signatures) представляет собой набор расширений к базовому стандарту CMS (Cryptographic Message Syntax), определённому в RFC 5652, которые позволяют создавать электронные подписи, соответствующие требованиям юридической значимости, долговременной проверяемости и криптографической устойчивости во времени.
Основой CAdES служит структура SignedData, в которой размещаются подписываемые данные, сертификаты подписанта, цепочки доверия и набор атрибутов подписи. Отличие CAdES от базового CMS заключается в строгой регламентации набора атрибутов, а также в добавлении временных меток, ответов OCSP/CRL и механизмов продления валидности подписи.
Подпись CMS формируется как ASN.1 структура:
SignedData
Внутри signerInfos содержится:
CAdES использует именно signedAttributes и unsignedAttributes как ключевые расширяемые области для повышения уровня подписи.
CAdES определяет несколько уровней, каждый из которых добавляет новые криптографические и доказательные свойства.
Базовый уровень, расширяющий CMS подпись обязательными атрибутами:
Свойства:
В Jsrsasign формирование BES-подписи обычно осуществляется через KJUR.crypto.CMS.
const cms = new KJUR.crypto.CMS();
cms.sign({
content: "Hello world",
cert: userCertPEM,
privateKey: userPrivateKeyPEM,
econtentType: "data"
});
const signed = cms.getContentInfo();
Расширение BES с добавлением политики подписи:
Данный уровень фиксирует юридические правила формирования подписи.
В Jsrsasign политика добавляется как signed attribute:
cms.setSignedAttribute({
type: "signaturePolicyIdentifier",
value: {
policyId: "1.2.3.4.5",
policyHash: "abcdef123456..."
}
});
Добавляется доверенная временная метка (TSA - Time Stamping Authority).
Формируется unsigned attribute:
Содержит RFC 3161 ответ от TSA.
Ключевая цель:
Jsrsasign поддерживает работу с TSA через KJUR.asn1.tsp.
cms.setUnsignedAttribute({
type: "signatureTimeStampToken",
value: KJUR.asn1.tsp.TSPUtil.createTimeStampToken({
data: cms.getSignatureValue(),
tsaUrl: "https://tsa.example.com"
})
});
Добавляет ссылки на:
Используются unsigned attributes:
Это позволяет проверять статус сертификата без обращения к внешним источникам.
В Jsrsasign часто реализуется через добавление цепочки сертификатов:
cms.addCertificates([cert1PEM, cert2PEM]);
cms.addCRLs([crlPEM]);
Уровень расширенной валидации во времени:
Основное отличие Type 1 и Type 2:
Это уровень, обеспечивающий проверку подписи спустя длительное время даже при утрате внешних источников.
Комбинация:
Подпись становится автономной:
В Jsrsasign формируется путём включения всех revocation data внутрь unsigned attributes:
cms.setUnsignedAttribute({
type: "archiveTimeStampV2",
value: archiveTimestampStructure
});
Наиболее продвинутый уровень:
Позволяет продлить криптографическую доказательную силу подписи на десятилетия.
Структура напоминает слоёный пирог:
Библиотека Jsrsasign предоставляет инструменты для работы с CMS через пространство имён:
Основной объект формирования подписи:
const cms = new KJUR.crypto.CMS();
const cms = new KJUR.crypto.CMS();
cms.sign({
content: "Document data",
cert: certPEM,
privateKey: privateKeyPEM,
digestAlg: "sha256"
});
const cmsOutput = cms.getContentInfo();
const tsp = new KJUR.asn1.tsp.TimeStampReq({
hashAlg: "sha256",
data: cms.getSignatureValue()
});
cms.setUnsignedAttribute({
type: "signatureTimeStampToken",
value: tsp.getTSToken("https://tsa.example.com")
});
cms.addCertificates([intermediateCertPEM]);
cms.addCRLs([crlPEM]);
cms.setUnsignedAttribute({
type: "completeCertificateRefs",
value: certificateRefsStructure
});
cms.setUnsignedAttribute({
type: "completeRevocationRefs",
value: revocationRefsStructure
});
Jsrsasign работает с ASN.1 объектами напрямую, поэтому CAdES-расширения реализуются через:
Ключевые OID, используемые в CAdES:
Процесс проверки включает:
Jsrsasign предоставляет:
const cms = new KJUR.crypto.CMS();
const result = cms.verify({
cms: cmsData,
certs: trustedCertsArray
});
Уровни CAdES можно представить как наращиваемую систему:
CMS SignedData
Каждый следующий уровень не изменяет предыдущий, а расширяет его через unsigned attributes, что критически важно для сохранения криптографической целостности подписи.
Типичный жизненный цикл:
Каждый шаг требует повторного пересчёта структуры ASN.1 без изменения исходного signed data, что обеспечивает криптографическую корректность расширений.