КриптоПро CSP  

Особенности создания подписанных CMS сообщений в "КриптоПро CSP 5.0"

Для того, чтобы создаваемые с помощью CryptoAPI сообщения могли быть впоследствии дополнены до форматов усовершенствованной ЭЦП (CAdES-T, CAdES-X Long Type 1 и других), они должны как минимум соответствовать базовому формату усовершенствованной ЭЦП (CAdES BES).

Формат электронной подписи CAdES BES требует наличия в подписанном сообщении подписанного атрибута, идентифицирующего сертификат подписывающего:

Поскольку после создания подписи нельзя добавлять или изменять подписанные атрибуты, КриптоПро CSP при создании подписанного сообщения с использованием алгоритма ГОСТ Р 34.10/34.11 добавляет к нему подписанный атрибут SigningCertificateV2.

Также в сообщение добавляется отметка о времени создания подписи в виде подписанного атрибута signingTime (время в атрибуте указывается по часам локального компьютера).

Особенности добавления атрибутов

Добавление атрибутов SigningCertificateV2 и signingTime затрагивает работу следующих функций: CryptMsgOpenToEncode, CryptMsgControl, CryptMsgCalculateEncodedLength и CryptSignMessage.

Атрибуты SigningCertificateV2 и signingTime не будут добавлены в подписанное сообщение, если выполняется хотя бы одно из следующих условий:

Поиск сертификата ключа электронной подписи

В функцию CryptSignMessage сертификат ключа электронной подписи передаётся в качестве аргумента, в то время как при использовании функций CryptMsgOpenToEncode, CryptMsgCalculateEncodedLength, CryptMsgControl производится его поиск в следующих местах:

Для поиска сертификата используется имя издателя и серийный номер, заданный в качестве идентификатора подписывающего при вызове функции. Если в качестве идентификатора подписывающего указан идентификатор ключа, поиск сертификата не ведётся и атрибуты в сообщение не добавляются.

Отключение добавления атрибутов

Существуют следующие способы отключить добавление атрибутов SigningCertificateV2 и signingTime в подписанное сообщение:

Параметр dwFlags для функций CryptMsgOpenToEncode, CryptMsgCalculateEncodedLength, CryptMsgControl может содержать дополнительные флаги, определённые в файле WinCryptEx.h:

ФлагОписание
CPCMSG_CADES_DISABLE Отключает добавление атрибутов. Данный флаг не может быть указан одновременно с CPCMSG_CADES_STRICT.
CPCMSG_CADES_STRICT Если не удалось добавить атрибуты, функция вернёт ошибку. Данный флаг не может быть указан одновременно с CPCMSG_CADES_DISABLE.
CPCMSG_CADES_DISABLE_CERT_SEARCH Отключает поиск сертификата подписывающего в хранилищах "Личные" ("My") текущего пользователя и локального компьютера.

Параметр dwFlags для функции CryptSignMessage может содержать дополнительные флаги, определённые в файле WinCryptEx.h:

ФлагОписание
CPCRYPT_MESSAGE_CADES_DISABLE Отключает добавление атрибутов. Данный флаг не может быть указан одновременно с CPCRYPT_MESSAGE_CADES_STRICT.
CPCRYPT_MESSAGE_CADES_STRICT Если не удалось добавить атрибуты, функция вернёт ошибку. Данный флаг не может быть указан одновременно с CPCRYPT_MESSAGE_CADES_DISABLE.

Добавление атрибутов на всём компьютере регулируется параметром реестра AddEsAttribute. Если данный параметр отсутствует, то добавление дополнительных атрибутов будет производиться. Для того, чтобы отключить добавление атрибутов, нужно добавить параметр AddEsAttribute типа DWORD и значением 0 в ветку реестра "HKEY_LOCAL_MACHINE\SOFTWARE\Crypto Pro\Cryptography\CurrentVersion\Parameters".