SignerInfo является центральным элементом структуры CMS (Cryptographic Message Syntax), определённой в RFC 5652, и используется для описания информации о подписи конкретного подписанта в подписанном сообщении. В контексте Jsrsasign работа с SignerInfo осуществляется на уровне ASN.1-структур, где каждый экземпляр представляет отдельную цифровую подпись внутри контейнера SignedData.
SignerInfo не существует изолированно: он всегда входит в состав
массива SignerInfos, который может содержать несколько
подписей, если документ подписан несколькими участниками.
Классическая ASN.1-структура SignerInfo имеет следующий вид:
SignerInfo ::= SEQUENCE {
version INTEGER,
sid SignerIdentifier,
digestAlgorithm DigestAlgorithmIdentifier,
signedAttrs [0] IMPLICIT SignedAttributes OPTIONAL,
signatureAlgorithm SignatureAlgorithmIdentifier,
signature OCTET STRING,
unsignedAttrs [1] IMPLICIT UnsignedAttributes OPTIONAL
}
Каждое поле выполняет строго определённую криптографическую и идентификационную функцию.
Поле version определяет версию структуры SignerInfo. На
практике встречаются два основных значения:
Jsrsasign автоматически определяет корректное значение в зависимости от типа идентификатора ключа.
SignerIdentifier определяет, какой сертификат использовался для формирования подписи. Существует два варианта представления:
Используется связка:
Такой вариант наиболее распространён в классических PKCS#7 структурах.
Представляет идентификатор ключа субъекта сертификата. Этот вариант более современный и используется в CMS.
В Jsrsasign этот элемент формируется на основе объекта X509Certificate и внутренних методов извлечения идентификаторов.
Поле digestAlgorithm указывает алгоритм хеширования,
применённый к подписываемым данным.
Наиболее распространённые значения:
В Jsrsasign алгоритм задаётся через OID, например:
2.16.840.1.101.3.4.2.1 — SHA-256Важно учитывать, что digestAlgorithm относится не к самой подписи, а к предварительному хешированию данных перед подписанием.
SignedAttributes — это критически важная часть структуры SignerInfo, определяющая данные, которые фактически подписываются.
Если signedAttrs присутствуют, то подпись формируется не над исходным контентом, а над DER-кодированным набором атрибутов.
Это означает:
В Jsrsasign signedAttrs формируются через ASN.1 конструкторы и автоматически включаются при создании CMS SignedData при включённой опции атрибутной подписи.
Поле signatureAlgorithm определяет криптографический
алгоритм, используемый для создания цифровой подписи.
Примеры:
OID алгоритма определяет как сам метод подписи, так и параметры (например, padding для RSA-PSS).
В Jsrsasign выбор алгоритма связан с приватным ключом и явно переданными параметрами при вызове функций подписи.
Поле signature содержит фактическое значение цифровой
подписи в виде OCTET STRING.
Содержимое зависит от алгоритма:
Важный момент: в CMS подпись создаётся над DER-кодированным значением signedAttrs (если они используются), а не над исходным документом.
Jsrsasign выполняет двойной уровень обработки:
UnsignedAttributes — это дополнительные атрибуты, которые не входят в область криптографической защиты подписи.
Они могут быть добавлены после формирования подписи и не нарушают её валидность.
Типичные примеры:
В Jsrsasign unsignedAttrs обычно добавляются на этапе постобработки CMS структуры.
В библиотеке Jsrsasign создание SignerInfo происходит через внутренние классы CMS, чаще всего через:
KJUR.asn1.cms.SignerInfoKJUR.asn1.cms.SignedDataПроцесс формирования включает несколько этапов:
SignerInfo строго следует DER-правилам кодирования:
Ошибки в DER-кодировании signedAttrs приводят к невозможности валидации подписи, даже если криптографически подпись корректна.
Jsrsasign использует внутренний ASN.1 encoder для обеспечения совместимости с CMS-совместимыми системами.
SignerInfo всегда является частью SignedData:
SignedData
├── version
├── digestAlgorithms
├── encapContentInfo
├── certificates
└── signerInfos → [ SignerInfo, SignerInfo, ... ]
Каждый SignerInfo независим и может использовать:
Это позволяет реализовывать многоподписные документы с разными криптографическими профилями.
Валидация SignerInfo включает несколько уровней:
Jsrsasign предоставляет инструменты для поэтапной проверки, включая извлечение и декодирование ASN.1 структуры SignerInfo для диагностики ошибок.
На практике встречаются следующие проблемы:
Каждая из этих ошибок приводит к невозможности криптографической проверки, даже при корректной структуре CMS-контейнера.