CAdES-C представляет собой расширение базового формата CAdES-BES/EPES, в котором добавляется возможность отделённой валидации подписи за счёт включения ссылок на сертификаты и статуса их отзыва (CRL/OCSP), но без включения самих полных данных проверки в структуру подписи.
В контексте JavaScript-библиотеки jsrsasign работа с CAdES-уровнями
строится поверх CMS (Cryptographic Message Syntax), где основой
выступает SignedData структура. Jsrsasign предоставляет инструменты из
пространств имён KJUR.asn1.cms, KJUR.crypto,
X509, позволяя формировать и расширять подписи по модели
CAdES.
CAdES-C (Complete) добавляет к CAdES-BES:
Ключевая идея уровня — отделить данные проверки от самой подписи, но обеспечить возможность их последующего получения из внешних источников.
В CMS-структуре это реализуется через unsigned attributes внутри SignedData.
Пример логики формирования (упрощённо):
const cmsSignedData = new KJUR.asn1.cms.SignedData({
content: { type: "data", value: "546573742064617461" }, // "Test data"
certs: [certPem],
signerInfos: [{
sid: { type: "certs", value: signerCert },
digestAlgorithm: "sha256",
signatureAlgorithm: "SHA256withRSA"
}]
});
// добавление CAdES-C атрибутов (ссылки на валидацию)
cmsSignedData.signerInfos[0].unsignedAttrs = [
// CertificateRefs / RevocationRefs (упрощённая модель)
];
На практике Jsrsasign не всегда предоставляет готовый high-level builder именно для CAdES-C, поэтому формирование выполняется через CMS-структуры и ручное добавление ASN.1 атрибутов.
CAdES-X (Extended) расширяет CAdES-C за счёт добавления временных меток (timestamp tokens), которые фиксируют факт существования подписи и её проверочных данных в определённый момент времени.
Существует два основных варианта:
Главная цель — защититься от ретроспективных изменений статуса сертификатов (например, если OCSP ответ был изменён задним числом).
В Jsrsasign работа с timestamp обычно опирается на
KJUR.crypto.TSA или ручную интеграцию с TSA-сервисом.
Пример добавления timestamp (концептуально):
const tsa = new KJUR.crypto.TSA({url: "https://tsa.example.com/"});
tsa.getTimeStampToken(digestHex, "sha256", function(tsq, tsp) {
const unsignedAttrs = cmsSignedData.signerInfos[0].unsignedAttrs || [];
unsignedAttrs.push({
type: "signatureTimeStampToken",
value: tsp
});
cmsSignedData.signerInfos[0].unsignedAttrs = unsignedAttrs;
});
На уровне CMS это превращается в вложенный SignedData внутри unsigned attributes.
CAdES-XL (Extended Long-term) добавляет ещё более сильную модель устойчивости:
В отличие от CAdES-C, где используются ссылки, CAdES-XL хранит полные доказательства внутри подписи.
Это делает подпись автономной: для проверки не требуется внешняя PKI-инфраструктура (за исключением корневых доверенных сертификатов).
Структурно CMS расширяется следующими unsigned attributes:
Пример формирования логики (упрощённо):
const unsignedAttrs = [];
// Добавление сертификатов цепочки
unsignedAttrs.push({
type: "certificateValues",
value: [signerCert, intermediateCert]
});
// Добавление OCSP/CRL данных
unsignedAttrs.push({
type: "revocationValues",
value: [ocspResponse]
});
// Timestamp на всё
unsignedAttrs.push({
type: "signatureTimeStampToken",
value: tsToken
});
cmsSignedData.signerInfos[0].unsignedAttrs = unsignedAttrs;
Jsrsasign на низком уровне позволяет кодировать эти структуры через
ASN.1 генераторы (KJUR.asn1.ASN1Object), однако полноценная
автоматизация CAdES-XL часто требует ручной сборки блоков.
CAdES-A (Archival) является финальным уровнем долговременной защиты подписей.
Его ключевая цель — обеспечить валидность подписи на горизонте десятилетий, когда:
Основной механизм CAdES-A — архивные timestamp-цепочки.
В отличие от CAdES-XL:
Каждый новый timestamp подтверждает валидность предыдущего состояния подписи.
CAdES-A строится как итеративное расширение:
В Jsrsasign это реализуется через повторное обновление unsigned attributes:
function addArchivalTimestamp(cms, digestHex, tsaUrl) {
const tsa = new KJUR.crypto.TSA({url: tsaUrl});
tsa.getTimeStampToken(digestHex, "sha256", function(tsq, tsp) {
let attrs = cms.signerInfos[0].unsignedAttrs || [];
attrs.push({
type: "archiveTimeStampV2",
value: tsp
});
cms.signerInfos[0].unsignedAttrs = attrs;
});
}
Архивные timestamp-ы могут применяться многократно, создавая цепочку доверия поверх изменяющихся криптографических реалий.
В рамках CMS-модели Jsrsasign уровни CAdES не являются отдельными объектами — это надстройки над SignedData, реализуемые через расширение unsigned attributes.
Упрощённая иерархия:
CMS SignedData (база Jsrsasign)
Несмотря на широкие криптографические возможности библиотеки:
Поэтому Jsrsasign чаще используется как:
Каждый следующий уровень не заменяет предыдущий, а накапливает его свойства, формируя многослойную модель доверия внутри CMS-структуры.