Уважаемые коллеги,
Обнаружена проблема успешной проверки подписи со стороны сервиса КриптоПро:
https://dss.cryptopro.ru/verify/#/signature
Суть проблемы в том, что сервис успешно проверяет подпись с некорректным алгоритмом подписи, когда алгоритм ключа проверки подписи является ГОСТ-ым (1.2.643.7.1.1.1.1), а алгоритм подписи указан RSA (1.2.840.113549.1.1.1). Ваш сервис игнорирует указание алгоритма подписи, поле ASN.1 signatureAlgorithm, и успешно проверяет её по алгоритму ключа проверки.
Вот из спецификации RFC 5652, "Cryptographic Message Syntax (CMS)":
SignerInfo ::= SEQUENCE
{
version CMSVersion,
sid SignerIdentifier,
digestAlgorithm DigestAlgorithmIdentifier,
signedAttrs [0] IMPLICIT SignedAttributes OPTIONAL,
signatureAlgorithm SignatureAlgorithmIdentifier,
signature SignatureValue,
unsignedAttrs [1] IMPLICIT UnsignedAttributes OPTIONAL
}
signatureAlgorithm identifies the signature algorithm, and any associated parameters, used by the signer to generate the digital signature.
5.5. Signature Generation Process
...The object identifier, along with any parameters, that specifies the signature algorithm employed by the signer is carried in the signatureAlgorithm field.
5.6. Signature Verification Process
...The details of the signature verification depend on the signature algorithm employed.
Из рекомендации ТК26 Р 1323565.1.025-2019, "Форматы сообщений, защищенных криптографическими методами":
signatureAlgorithm - определение алгоритма подписи и его параметров, используемых отправителем при подписи.
7.5 Процесс формирования подписи
...Детали процесса формирования подписи зависят от используемого алгоритма подписи (см. 7.7). Идентификатор объекта наряду со всеми параметрами, которые задают алгоритм подписи, находится в поле signatureAlgorithm.
7.6 Процесс проверки подписи
...Детали проверки подписи связаны с используемым алгоритмом (см. 7.7).
7.7. Специфика данных типа «подписанные данные» по ГОСТ Р 34.10-2012
...Идентификаторы алгоритма подписи указаны в поле signatureAlgorithm структуры Signerlnfo (см. 7.3), вложенной в структуру SignedData...
Аналогично из рекомендаций ТК26, Протокол №13 от 24.04.2014 года, "Использование алгоритмов ГОСТ 28147-89, ГОСТ Р 34.11 и ГОСТ Р 34.10 в криптографических сообщениях формата CMS":
Идентификаторы алгоритма подписи указываются в поле signatureAlgorithm структуры SignerInfo, вложенной в структуру SignedData.Подпись действительно является ГОСТ-ой и соответствуют алгоритму ключа проверки, но игнорирование указания алгоритма подписи приводит к тому, что результат проверки несоответствует результату других сервисов и инструментов.
Например, проверка подписи с неверным алгоритмом подписи со стороны следующих сервисов:
АИС Единый Криптографический Сервис
https://eks.mos.ru/Services/VerifySignРезультат: Подпись не верна
Проверка корректной подписи проходит успешно с комментарием, что представленные данные не являются сертификатом/файлом подписи/штампом времени (так и есть)
Удостоверяющий центр ППК "Роскадастр"
https://crypto.kadastr.ru/SVS/Verify/Результат: Подпись не действительна, с комментарием:
Не удалось проверить подпись CAdES-BES. Ошибка: [Указан неправильный алгоритм]. Код: [0x80090008].Сертификат, на ключе которого было подписано сообщение, не найден.
Некорректная подпись прилагается.
sample.txt.p7s
(3kb) загружен 9 раз(а).Возможно, это ошибка, проверьте пожалуйста...
P.S.
Такую ошибочную подпись можно сформировать, если для функции CryptMsgOpenToEncode, в параметрах структуры CMSG_SIGNER_ENCODE_INFO, указать в качестве дескриптора hCryptProv, дескриптор соответствующего контейнера КриптоПро, а в качестве алгоритма HashEncryptionAlgorithm.pszObjId, алгоритм RSA "1.2.840.113549.1.1.1".
Отредактировано пользователем 4 июня 2024 г. 12:33:14(UTC)
| Причина: Не указана