ASN.1 CMS в Jsrsasign реализует работу с Cryptographic Message Syntax (CMS, ранее PKCS
CMS строится вокруг структуры ContentInfo, внутри которой хранится конкретный тип данных: SignedData, EnvelopedData, DigestedData или EncryptedData. В контексте Jsrsasign основной интерес сосредоточен на SignedData и базовой инфраструктуре ASN.1 кодирования.
CMS всегда начинается с обёртки ContentInfo:
В Jsrsasign это представляется через объекты, создаваемые в
пространстве KJUR.asn1.cms.
Пример логической структуры:
ContentInfo ::= SEQUENCE {
contentType OBJECT IDENTIFIER,
content [0] EXPLICIT ANY DEFINED BY contentType
}
SignedData — ключевая структура CMS, используемая для цифровых подписей.
Она включает:
Jsrsasign формирует эту структуру через высокоуровневые функции, скрывающие ручную работу с ASN.1 узлами.
Данные, которые подписываются, помещаются в EncapsulatedContentInfo:
В Jsrsasign возможно формировать как встроенную (attached), так и отделённую подпись.
Библиотека предоставляет API уровня CMS builder, который упрощает создание структуры:
const cms = new KJUR.asn1.cms.SignedData({
content: "616263", // hex строки "abc"
certs: [certPEM],
signerPrvKey: prvKeyPEM,
signerCert: certPEM,
hashAlg: "sha256"
});
const cmsData = cms.getContentInfo();
Внутри происходит:
SignerInfo содержит информацию о подписи конкретного участника:
Jsrsasign автоматически формирует signedAttributes, включая:
Это соответствует CMS Advanced Electronic Signature (CAdES) базовому уровню.
Упрощённая ASN.1 модель:
SignerInfo ::= SEQUENCE {
version INTEGER,
sid SignerIdentifier,
digestAlgorithm AlgorithmIdentifier,
signedAttrs [0] IMPLICIT SET OPTIONAL,
signatureAlgorithm AlgorithmIdentifier,
signature OCTET STRING,
unsignedAttrs [1] IMPLICIT SET OPTIONAL
}
Jsrsasign скрывает детализацию DER-кодирования, но структура остаётся идентичной.
Проверка выполняется через парсинг ContentInfo и извлечение SignedData:
const cms = new KJUR.asn1.cms.SignedData({ cmsContent: cmsBase64 });
const result = cms.verify();
Процесс включает:
CMS может содержать цепочку сертификатов:
Jsrsasign помещает их в поле certificates как SET OF Certificate.
При проверке выполняется:
CMS SignedData поддерживает два режима:
Данные включены внутрь CMS:
Данные не включены:
Jsrsasign позволяет управлять этим через параметры content / detached mode.
Хотя основное использование asn1cms связано с подписями, CMS также поддерживает шифрование через EnvelopedData:
Структура включает:
Вся CMS-структура строится на ASN.1 DER encoder:
KJUR.asn1.DERSequenceKJUR.asn1.DERSetKJUR.asn1.DEROctetStringKJUR.asn1.DERObjectIdentifierCMS модуль является надстройкой над этими базовыми примитивами.
Поддерживаемые алгоритмы:
Комбинации:
Выбор алгоритма влияет на digestAlgorithm и signatureAlgorithm внутри SignerInfo.
При декодировании возможны типовые ошибки:
Jsrsasign возвращает структурированные ошибки при парсинге ASN.1 узлов.
CMS модуль работает как с:
Преобразование происходит автоматически через утилиты:
X509.pemToHexKJUR.asn1.ASN1Util.hexToPemОсновные OID, используемые в CMS:
1.2.840.113549.1.7.1 — data1.2.840.113549.1.7.2 — signedData1.2.840.113549.1.7.3 — envelopedData1.2.840.113549.1.9.4 — messageDigest1.2.840.113549.1.9.3 — contentTypeJsrsasign использует их для маршрутизации парсинга ContentInfo.
SignedAttributes критически важны для защиты структуры подписи:
В Jsrsasign они сериализуются как DER SET и включаются в вычисление подписи.
CMS структуры Jsrsasign совместимы с:
Основное требование — корректный DER и совпадение алгоритмов.
Пример декодирования:
const cms = new KJUR.asn1.cms.SignedData({
cmshex: cmsHex
});
const signerInfos = cms.getSignerInfos();
const certs = cms.getCertificates();
const content = cms.getContent();
Парсер выполняет рекурсивный разбор ASN.1 дерева.
CMS часто используется как:
Jsrsasign обеспечивает генерацию такой структуры без необходимости ASN.1 ручного кодирования.