CAdES-C, CAdES-X, CAdES-XL, CAdES-A: обзор

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:

  • ссылку на цепочку сертификатов (certificate references)
  • ссылки на данные об отзыве сертификатов (revocation references)
  • но не включает сами OCSP/CRL ответы

Ключевая идея уровня — отделить данные проверки от самой подписи, но обеспечить возможность их последующего получения из внешних источников.

В 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: усиление временной и доказательной базы

CAdES-X (Extended) расширяет CAdES-C за счёт добавления временных меток (timestamp tokens), которые фиксируют факт существования подписи и её проверочных данных в определённый момент времени.

Существует два основных варианта:

  • CAdES-X Type 1 — timestamp на подпись + ссылки
  • CAdES-X Type 2 — timestamp только на ссылки проверки

Главная цель — защититься от ретроспективных изменений статуса сертификатов (например, если 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: включение всех данных проверки внутрь подписи

CAdES-XL (Extended Long-term) добавляет ещё более сильную модель устойчивости:

  • включение всех сертификатов цепочки
  • включение CRL и/или OCSP ответов
  • включение timestamp на подпись и на данные проверки

В отличие от CAdES-C, где используются ссылки, CAdES-XL хранит полные доказательства внутри подписи.

Это делает подпись автономной: для проверки не требуется внешняя PKI-инфраструктура (за исключением корневых доверенных сертификатов).

Структурно CMS расширяется следующими unsigned attributes:

  • completeCertificateRefs
  • completeRevocationRefs
  • certificateValues
  • revocationValues
  • timestamps

Пример формирования логики (упрощённо):

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: архивная форма и долгосрочная устойчивость

CAdES-A (Archival) является финальным уровнем долговременной защиты подписей.

Его ключевая цель — обеспечить валидность подписи на горизонте десятилетий, когда:

  • сертификаты истекли
  • алгоритмы хеширования устарели
  • TSA-сервисы недоступны

Основной механизм CAdES-A — архивные timestamp-цепочки.

В отличие от CAdES-XL:

  • добавляются новые timestamp-токены поверх уже существующих
  • формируется цепочка продления доверия

Каждый новый timestamp подтверждает валидность предыдущего состояния подписи.


Архитектура CAdES-A в CMS-структуре

CAdES-A строится как итеративное расширение:

  1. базовая подпись (CAdES-BES)
  2. добавление CAdES-C данных
  3. добавление CAdES-X timestamp
  4. добавление CAdES-XL доказательств
  5. периодическое добавление archival timestamps

В 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-ы могут применяться многократно, создавая цепочку доверия поверх изменяющихся криптографических реалий.


Связь уровней CAdES в контексте Jsrsasign

В рамках CMS-модели Jsrsasign уровни CAdES не являются отдельными объектами — это надстройки над SignedData, реализуемые через расширение unsigned attributes.

Упрощённая иерархия:

  • CMS SignedData (база Jsrsasign)

    • CAdES-BES (базовая подпись)
    • CAdES-C (ссылки на проверку)
    • CAdES-X (timestamp на подпись и проверки)
    • CAdES-XL (встроенные данные проверки)
    • CAdES-A (архивные timestamp-цепочки)

Практические ограничения реализации в Jsrsasign

Несмотря на широкие криптографические возможности библиотеки:

  • нет полностью автоматического CAdES builder уровня “one-call”
  • ASN.1 структуры CAdES часто приходится собирать вручную
  • OCSP/CRL обработка требует внешних HTTP-запросов
  • TSA интеграция зависит от конкретного сервиса и формата ответа

Поэтому Jsrsasign чаще используется как:

  • низкоуровневый криптографический инструмент CMS/PKCS#7
  • библиотека для JWT/X.509 обработки
  • основа для кастомной реализации CAdES-профилей

Ключевые особенности перехода между уровнями

  • CAdES-C — минимальное расширение для отделённой валидации
  • CAdES-X — добавление временной фиксации доверия
  • CAdES-XL — полная автономность проверки
  • CAdES-A — долгосрочное архивирование и обновление доверия

Каждый следующий уровень не заменяет предыдущий, а накапливает его свойства, формируя многослойную модель доверия внутри CMS-структуры.