Ключевое слово в защите информации
КЛЮЧЕВОЕ СЛОВО
в защите информации
Получить ГОСТ TLS-сертификат для домена (SSL-сертификат)
Добро пожаловать, Гость! Чтобы использовать все возможности Вход или Регистрация.

Уведомление

Icon
Error

Опции
К последнему сообщению К первому непрочитанному
Offline stasya0903  
#1 Оставлено : 21 ноября 2021 г. 0:26:08(UTC)
stasya0903

Статус: Новичок

Группы: Участники
Зарегистрирован: 21.11.2021(UTC)
Сообщений: 1

Сказал(а) «Спасибо»: 2 раз
Добрый день. Возникла проблема с сформированием подписи документа. Получаю по методу presign хэш документа и подписываю через плагин, отправляю полученную подпись - но Dss lite отвечает что подпись неверна. Пробовала получать и через обьект RawSignature и через CadesSignData(код ниже). Причем если подпись сохраняю и проверяю ее через гос услуги или CryptoPro tools показывает что подпись валидная

Подпись на стороне клиента(пробовала все методы)

Код:

signStringHash (keyThumb, dataToSign) {
        let cert = this.certificates;
        let store = this.store;
        return new Promise(function (resolve, reject) {
            cadesplugin.async_spawn(function* (args) {
                try {
                    // поиск сертификата по его хешу (thumbprint)
                    let oCertificates = yield cert.Find(
                        cadesplugin.CAPICOM_CERTIFICATE_FIND_SHA1_HASH, keyThumb);


                    let Count = yield oCertificates.Count;
                    if (Count === 0) {
                        throw (`Сертификат не найден:  ${args[0]}`);
                    }

                    // устустановка сертификата
                    let oCertificate = yield oCertificates.Item(1);
                    let oSigner = yield cadesplugin.CreateObjectAsync('CAdESCOM.CPSigner');
                    yield oSigner.propset_Certificate(oCertificate);


                    // вычисление хеша
                    let oHashedData = yield cadesplugin.CreateObjectAsync('CAdESCOM.HashedData');

                    yield oHashedData.propset_Algorithm(cadesplugin.CADESCOM_HASH_ALGORITHM_CP_GOST_3411_2012_256);
                    yield oHashedData.propset_DataEncoding(cadesplugin.CADESCOM_BASE64_TO_BINARY);

                    // Передаем данные
                    yield oHashedData.Hash(dataToSign);

                    // Вычисляем хэш-значение
                    let sHashValue = yield oHashedData.Value;

                    // из хэш в bytes
                    yield oHashedData.SetHashValue(sHashValue);


                    let oSignedData = yield cadesplugin.CreateObjectAsync('CAdESCOM.CadesSignedData');

                    oSignedData.propset_ContentEncoding(cadesplugin.CADESCOM_BASE64_TO_BINARY);


                    let sSignedMessage = yield oSignedData.SignHash(oHashedData, oSigner, cadesplugin.CADESCOM_CADES_BES);



                    let oSignedData2 = yield cadesplugin.CreateObjectAsync('CAdESCOM.CadesSignedData');


                    let oHashedData2 = yield cadesplugin.CreateObjectAsync('CAdESCOM.HashedData');
                    // Инициализируем объект заранее вычисленным хэш-значением
                    // Алгоритм хэширования нужно указать до того, как будет передано хэш-значение
                    yield oHashedData2.propset_Algorithm = cadesplugin.CADESCOM_HASH_ALGORITHM_CP_GOST_3411_2012_256;
                    yield oHashedData2.SetHashValue(sHashValue);

                    // Проверяем подпись
                    try {
                       yield oSignedData2.VerifyHash(oHashedData, sSignedMessage, cadesplugin.CADESCOM_CADES_BES);
                    } catch (err) {
                        alert('Не получилось проверить созданную подпись: ' + err);
                        return false;
                    }
                    yield store.Close();

                    args[2]({ signedMessage: sSignedMessage, hashedVal: sHashValue });
                } catch (err) {
                    args[3]('Failed to create signature. Error: ' + err);
                }
            }, keyThumb, dataToSign, resolve, reject);
        })
    }

    makeRawSignature(keyThumb, dataToSign){
        let cert = this.certificates;
        let store = this.store;
        return new Promise(function (resolve, reject) {
            cadesplugin.async_spawn(function* (args) {
                try {
                    //вытаскиваеи аргументы из асинхронной функции
                    let sCertName = args[0]

                    // Предварительно вычисленное хэш-значение в виде строки шестнадцатеричных цифр,
                    // группами по 2 цифры на байт, с пробелами или без пробелов.
                    // Например, хэш-значение в таком формате возвращают объекты
                    // CAPICOM.HashedData и CADESCOM.HashedData.
                    let rawValue = args[1]

                    //функции промиса
                    let resolve = args[2]
                    let reject = args[3];

                    // Алгоритм хэширования, при помощи которого было вычислено хэш-значение
                    //ГОСТ Р 34.10-2012 256 бит - для сырой подписи
                    // Полный список поддерживаемых алгоритмов указан в перечислении CADESCOM_HASH_ALGORITHM
                    let hashAlg = cadesplugin.CADESCOM_HASH_ALGORITHM_CP_GOST_3411_2012_256;

                    // открываем хранилище для запроса на сертификата
                    let oStore = yield cadesplugin.CreateObjectAsync("CAdESCOM.Store");

                    yield oStore.Open(  cadesplugin.CAPICOM_CURRENT_USER_STORE,
                                        cadesplugin.CAPICOM_MY_STORE,
                                        cadesplugin.CAPICOM_STORE_OPEN_MAXIMUM_ALLOWED);

                    // находим сертификат по отпечатку
                    let oStoreCerts = yield oStore.Certificates;
                    let oCertificates = yield oStoreCerts.Find(cadesplugin.CAPICOM_CERTIFICATE_FIND_SHA1_HASH, sCertName);
                    let certsCount = yield oCertificates.Count;
                    if (certsCount === 0) {
                        console.log('Certificate not found ')
                        reject()
                    }
                    let  oCertificate = yield oCertificates.Item(1);
                    yield oStore.Close();

                    // Создаем объект CAdESCOM.HashedData
                    var oHashedData = yield cadesplugin.CreateObjectAsync("CAdESCOM.HashedData");

                    // Инициализируем объект заранее вычисленным хэш-значением
                    // Алгоритм хэширования нужно указать до того, как будет передано хэш-значение
                    yield oHashedData.propset_Algorithm(hashAlg);
                    yield oHashedData.propset_DataEncoding(cadesplugin.CADESCOM_BASE64_TO_BINARY);

                    // Передаем данные
                    yield oHashedData.Hash(rawValue);

               /*     // Вычисляем хэш-значение
                    let sHashValue = yield oHashedData.Value;

                    // из хэш в bytes
                    yield oHashedData.SetHashValue(sHashValue);*/


                    // Создаем объект CAdESCOM.RawSignature
                    var oRawSignature = yield cadesplugin.CreateObjectAsync("CAdESCOM.RawSignature");

                    console.log(oRawSignature)

                    // Вычисляем значение подписи
                    try {
                       // oRawSignature.propset_ContentEncoding(cadesplugin.CADESCOM_BASE64_TO_BINARY);
                        var sRawSignature = yield oRawSignature.SignHash(oHashedData, oCertificate);

                        console.log(sRawSignature)
                    } catch (err) {
                        console.log('error signature')
                       // alert("Failed to create signature. Error: " + cadesplugin.getLastError(err));
                        reject()
                    }


                    let oRawSignature2 = yield cadesplugin.CreateObjectAsync("CAdESCOM.RawSignature");

                    // Проверяем подпись
                    try {
                        yield oRawSignature2.VerifyHash(oHashedData, oCertificate, sRawSignature);
                        alert("Signature verified");
                    } catch (err) {
                        console.log(err, 'проверка')
                        //alert("Failed to verify signature. Error: " + cadesplugin.getLastError(err));
                        reject()
                    }
                } catch (e) {
                    reject()
                    console.log(e)
                }



                let signatureEncoded =  sRawSignature;
                resolve({signature : signatureEncoded})
            }, keyThumb, dataToSign, resolve, reject);
        } )

    }

    
    async signWithDateAndTime(hash, dataBase64, signType){
        let cert = this.certificates;
        let store = this.store;
        return new Promise(function (resolve, reject) {
            cadesplugin.async_spawn(function* (args) {
                try {
                    // поиск сертификата по его хешу

                    let oCertificates = yield cert.Find(
                        cadesplugin.CAPICOM_CERTIFICATE_FIND_SHA1_HASH, hash);
                    let Count = yield oCertificates.Count;
                    if (Count === 0) {
                        throw (`Сертификат не найден:  ${args[4]}`);
                    }

                    // задаем основные обьекты подписи
                    let clientTime = new Date();
                    let oAttrs = yield cadesplugin.CreateObjectAsync('CADESCOM.CPAttribute');
                    let oSignedData = yield cadesplugin.CreateObjectAsync('CAdESCOM.CadesSignedData');
                    let oSigner = yield cadesplugin.CreateObjectAsync('CAdESCOM.CPSigner');

                    //устанавливаем данные подписи
                    yield oAttrs.propset_Name(cryptoProConstants.Time.AUTHENTICATED_ATTRIBUTE_SIGNING_TIME);
                    yield oAttrs.propset_Value(clientTime);

                    // устанавливаем сертификат
                    let oCertificate = yield oCertificates.Item(1);
                    yield oSigner.propset_Certificate(oCertificate);

                    //устанавливаем атрибуты
                    let attrs = yield oSigner.AuthenticatedAttributes2;
                    yield  attrs.Add(oAttrs);
                    yield  oSignedData.propset_ContentEncoding(cadesplugin.CADESCOM_BASE64_TO_BINARY);
                    yield  oSignedData.propset_Content(dataBase64);
                    yield  oSigner.propset_Options(cadesplugin.CAPICOM_CERTIFICATE_INCLUDE_END_ENTITY_ONLY);

                    let signature = yield oSignedData.SignCades(
                        oSigner,
                        cadesplugin.CADESCOM_CADES_BES,
                        signType
                    );
                    yield store.Close();
                    args[3]({ signature: signature });
                } catch (err) {
                    console.log(err)
                    args[4]('Failed to create signature. Error: ' + err);
                }
            }, hash, dataBase64, signType, resolve, reject);
        })

    }
Offline Андрей Солдатов  
#2 Оставлено : 26 ноября 2021 г. 22:49:27(UTC)
Андрей Солдатов

Статус: Сотрудник

Группы: Участники
Зарегистрирован: 12.03.2019(UTC)
Сообщений: 332
Мужчина
Российская Федерация
Откуда: Москва

Сказал «Спасибо»: 5 раз
Поблагодарили: 70 раз в 66 постах
Добрый день.
Вопрос решается в рамках обращения №42802 на нашем портале технической поддержки.
Техническую поддержку оказываем тут.
Наша база знаний.
thanks 1 пользователь поблагодарил Андрей Солдатов за этот пост.
stasya0903 оставлено 15.12.2021(UTC)
RSS Лента  Atom Лента
Пользователи, просматривающие эту тему
Guest
Быстрый переход  
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.