CAdES (CMS Advanced Electronic Signatures) в контексте реализации через jsrsasign опирается на структуру CMS/PKCS
Основная модель CAdES в jsrsasign реализуется через ASN.1-структуры CMS, где подпись представлена как SignedData, содержащая набор подписанных атрибутов (signed attributes) и неподписанных атрибутов (unsigned attributes). Именно атрибуты превращают «сырую» CMS-подпись в формат, соответствующий требованиям CAdES.
В jsrsasign CMS-структура обычно создаётся через пространство имён
KJUR.asn1.cms. Внутри SignedData ключевым элементом
является SignerInfo, где и располагаются атрибуты:
Подпись вычисляется не над исходными данными напрямую, а над DER-кодированным набором signedAttributes, что является фундаментальной особенностью CAdES.
Signed attributes формируют криптографически защищённое описание контекста подписи. Их изменение после подписания приводит к полной недействительности подписи.
Один из ключевых атрибутов — хеш исходного сообщения:
В jsrsasign этот атрибут формируется автоматически при создании CMS-структуры.
Пример логики формирования:
var cms = new KJUR.asn1.cms.CMSUtil();
var signedData = cms.newSignedData({
content: {str: "Hello CAdES"},
certs: [certPem],
signerInfo: [{
hashAlg: "sha256",
sattrs: {
contentType: "data",
signingTime: new Date()
}
}]
});
Атрибут определяет тип подписываемого содержимого:
Этот атрибут фиксирует семантику содержимого CMS.
Фиксирует время создания подписи:
В jsrsasign он часто задаётся явно или генерируется автоматически:
sattrs: {
signingTime: new Date()
}
Важно, что этот атрибут не является доверенным временем в юридическом смысле без использования timestampToken.
Ключевой CAdES-атрибут, связывающий подпись с конкретным сертификатом.
Он содержит хеш сертификата подписанта, а не сам сертификат.
В jsrsasign этот атрибут может формироваться через цепочку сертификатов:
sattrs: {
signingCertificateV2: certPem
}
На практике библиотека может автоматически строить структуру ESSCertIDv2, соответствующую RFC 5035.
Используется в расширенных профилях CAdES для указания политики подписи.
В jsrsasign поддержка зависит от уровня ручной сборки ASN.1 структуры.
Unsigned attributes не участвуют в вычислении подписи, но критически важны для доверенной инфраструктуры.
Один из наиболее значимых атрибутов в CAdES-T и выше.
В jsrsasign может добавляться как внешний атрибут:
uattrs: {
timestampToken: tsaResponse
}
Он позволяет доказать, что подпись существовала в момент времени, подтверждённый сторонним сервером времени.
Используются в CAdES-C и CAdES-X Long.
Эти атрибуты уменьшают зависимость от внешних источников при проверке подписи.
Содержат:
В jsrsasign такие структуры обычно формируются вручную при построении расширенных CMS-подписей.
jsrsasign предоставляет низкоуровневую и среднеуровневую работу с CMS
через KJUR.asn1.cms.CMSUtil.
Типовой процесс включает:
var cmsUtil = new KJUR.asn1.cms.CMSUtil();
var signed = cmsUtil.newSignedData({
content: {str: "Document content"},
certs: [certPem],
signerInfo: [{
hashAlg: "sha256",
sattrs: {
contentType: "data",
signingTime: new Date()
}
}]
});
var pem = KJUR.asn1.cms.CMSUtil.getPEM(signed);
Здесь signedAttributes формируются автоматически, но могут быть расширены вручную при необходимости реализации строгого CAdES-профиля.
Все signed attributes кодируются в DER-формате перед подписанием. Это означает:
jsrsasign автоматически обеспечивает DER-кодирование через ASN.1
реализацию KJUR.asn1.
Каждый атрибут в CAdES идентифицируется OID. jsrsasign использует внутренние таблицы OID:
При расширении функциональности новые OID добавляются вручную в ASN.1 структуру.
Ключевой момент CAdES:
Таким образом подпись привязана не к документу напрямую, а к метаданным атрибутов.
На практике встречаются типовые проблемы:
jsrsasign не всегда валидирует CAdES-уровень строго, поэтому ответственность за корректность структуры часто лежит на разработчике.
CAdES определяется уровнем добавленных атрибутов:
В jsrsasign эти уровни не выделены как отдельные API, но реализуются комбинацией signedAttributes и unsignedAttributes.
Внутренне атрибуты представлены как ASN.1 структуры:
jsrsasign использует классы:
для построения каждого элемента.
При валидации CMS:
Таким образом атрибуты выступают не метаданными, а частью криптографического ядра подписи.