Стандарт CAdES и уровни подписи

CAdES (CMS Advanced Electronic Signatures) представляет собой набор расширений к базовому стандарту CMS (Cryptographic Message Syntax), определённому в RFC 5652, которые позволяют создавать электронные подписи, соответствующие требованиям юридической значимости, долговременной проверяемости и криптографической устойчивости во времени.

Основой CAdES служит структура SignedData, в которой размещаются подписываемые данные, сертификаты подписанта, цепочки доверия и набор атрибутов подписи. Отличие CAdES от базового CMS заключается в строгой регламентации набора атрибутов, а также в добавлении временных меток, ответов OCSP/CRL и механизмов продления валидности подписи.


Подпись CMS формируется как ASN.1 структура:

  • SignedData

    • version
    • digestAlgorithms
    • encapContentInfo
    • certificates (опционально)
    • crls (опционально)
    • signerInfos

Внутри signerInfos содержится:

  • issuerAndSerialNumber или subjectKeyIdentifier
  • digestAlgorithm
  • signedAttributes
  • signatureAlgorithm
  • signature
  • unsignedAttributes

CAdES использует именно signedAttributes и unsignedAttributes как ключевые расширяемые области для повышения уровня подписи.


Уровни CAdES-подписей

CAdES определяет несколько уровней, каждый из которых добавляет новые криптографические и доказательные свойства.

CAdES-BES (Basic Electronic Signature)

Базовый уровень, расширяющий CMS подпись обязательными атрибутами:

  • content-type
  • message-digest
  • signing-certificate или signing-certificate-v2

Свойства:

  • фиксирует факт подписи
  • не содержит временной метки
  • не гарантирует доказательство существования подписи во времени

В 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();

CAdES-EPES (Explicit Policy-based Electronic Signature)

Расширение BES с добавлением политики подписи:

  • signature-policy-identifier (OID политики)
  • policy-hash (контрольный хэш политики)

Данный уровень фиксирует юридические правила формирования подписи.

В Jsrsasign политика добавляется как signed attribute:

cms.setSignedAttribute({
  type: "signaturePolicyIdentifier",
  value: {
    policyId: "1.2.3.4.5",
    policyHash: "abcdef123456..."
  }
});

CAdES-T (Timestamped)

Добавляется доверенная временная метка (TSA - Time Stamping Authority).

Формируется unsigned attribute:

  • signature-time-stamp

Содержит 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"
  })
});

CAdES-C (Complete)

Добавляет ссылки на:

  • OCSP ответы
  • CRL списки

Используются unsigned attributes:

  • complete-certificate-references
  • complete-revocation-references

Это позволяет проверять статус сертификата без обращения к внешним источникам.

В Jsrsasign часто реализуется через добавление цепочки сертификатов:

cms.addCertificates([cert1PEM, cert2PEM]);
cms.addCRLs([crlPEM]);

CAdES-X Long Type 1 / Type 2

Уровень расширенной валидации во времени:

  • включает OCSP ответы
  • включает CRL
  • включает хэшированные ссылки на сертификаты и статусные данные

Основное отличие Type 1 и Type 2:

  • Type 1 — хэшируются только ссылки
  • Type 2 — добавляется дополнительная защита структуры доказательств

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


CAdES-LT (Long Term)

Комбинация:

  • CAdES-T
  • CAdES-C
  • плюс архивирование OCSP/CRL ответов внутри подписи

Подпись становится автономной:

  • не требует внешних проверок для валидации в будущем

В Jsrsasign формируется путём включения всех revocation data внутрь unsigned attributes:

cms.setUnsignedAttribute({
  type: "archiveTimeStampV2",
  value: archiveTimestampStructure
});

CAdES-A (Archival)

Наиболее продвинутый уровень:

  • периодическое продление временных меток
  • добавление новых archive timestamps поверх старых

Позволяет продлить криптографическую доказательную силу подписи на десятилетия.

Структура напоминает слоёный пирог:

  • подпись
  • timestamp
  • архивный timestamp
  • повторное продление timestamp

Реализация CAdES в Jsrsasign

Библиотека Jsrsasign предоставляет инструменты для работы с CMS через пространство имён:

  • KJUR.crypto.CMS
  • KJUR.asn1.cms
  • KJUR.asn1.tsp
  • KJUR.crypto.X509

Основной объект формирования подписи:

const cms = new KJUR.crypto.CMS();

Формирование базовой CAdES-BES подписи

const cms = new KJUR.crypto.CMS();

cms.sign({
  content: "Document data",
  cert: certPEM,
  privateKey: privateKeyPEM,
  digestAlg: "sha256"
});

const cmsOutput = cms.getContentInfo();

Добавление временной метки (CAdES-T)

const tsp = new KJUR.asn1.tsp.TimeStampReq({
  hashAlg: "sha256",
  data: cms.getSignatureValue()
});

cms.setUnsignedAttribute({
  type: "signatureTimeStampToken",
  value: tsp.getTSToken("https://tsa.example.com")
});

Добавление OCSP/CRL данных (CAdES-C / LT)

cms.addCertificates([intermediateCertPEM]);
cms.addCRLs([crlPEM]);

cms.setUnsignedAttribute({
  type: "completeCertificateRefs",
  value: certificateRefsStructure
});

cms.setUnsignedAttribute({
  type: "completeRevocationRefs",
  value: revocationRefsStructure
});

Структурные особенности реализации

Jsrsasign работает с ASN.1 объектами напрямую, поэтому CAdES-расширения реализуются через:

  • DER encoding
  • SET OF Attribute
  • Object Identifiers (OID)
  • CMS SignedAttributes / UnsignedAttributes

Ключевые OID, используемые в CAdES:

  • id-aa-signingCertificate
  • id-aa-signingCertificateV2
  • id-aa-signatureTimeStampToken
  • id-aa-ets-revocationRefs
  • id-aa-ets-certValues

Проверка подписи CAdES

Процесс проверки включает:

  1. Проверку CMS структуры
  2. Проверку подписи (RSA/ECDSA)
  3. Проверку сертификата
  4. Проверку OCSP/CRL
  5. Проверку временной метки
  6. Проверку архивных атрибутов (если LT/A)

Jsrsasign предоставляет:

const cms = new KJUR.crypto.CMS();

const result = cms.verify({
  cms: cmsData,
  certs: trustedCertsArray
});

Ключевые особенности CAdES в Jsrsasign

  • ручное управление ASN.1 атрибутами
  • гибкость формирования уровней подписи
  • поддержка TSA через RFC 3161
  • работа с X.509 цепочками
  • возможность построения LT/A уровней через unsigned attributes

Архитектурная модель уровней подписи

Уровни CAdES можно представить как наращиваемую систему:

  • CMS SignedData

    • CAdES-BES: базовые signed attributes
    • CAdES-EPES: политика подписи
    • CAdES-T: + timestamp
    • CAdES-C: + revocation data
    • CAdES-LT: + встроенные доказательства
    • CAdES-A: + архивные временные метки

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


Практическая модель построения CAdES в Jsrsasign

Типичный жизненный цикл:

  1. Формирование CMS подписи
  2. Добавление обязательных signed attributes
  3. Подписание приватным ключом
  4. Добавление timestamp (T level)
  5. Добавление OCSP/CRL (C/LT level)
  6. Архивирование (A level)

Каждый шаг требует повторного пересчёта структуры ASN.1 без изменения исходного signed data, что обеспечивает криптографическую корректность расширений.