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

Уведомление

Icon
Error

Опции
К последнему сообщению К первому непрочитанному
Offline dok@rmiac18.ru  
#1 Оставлено : 23 декабря 2019 г. 10:48:32(UTC)
dok@rmiac18.ru

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

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

Здравствуйте. Использую для подписи PDF документа браузер плагин. К документу в результате создается две открепленные подписи разными сертификатами, одна в браузере, другая на сервере. Если в браузере подпись осуществляется сертификатом с гост 2001 то всё хорошо. Если использовать сертификат с гост 2012 то получаются отличающиеся хеш-суммы по одинаковым алгоритмам (такую ошибку возвращает сторонний сервис, куда отправляется документ). В чем может быть проблема?

Подписываю следующим образом
Код:

async getHash(data: string): Promise<string> {
        const hashData = await (window as any).cadesplugin.CreateObjectAsync(ObjectNamesAsync.CPHashedDataAsync);
        // Алгоритм хэширования нужно указать до того, как будут переданы данные
        hashData.propset_Algorithm(CAPICOM_HASH_ALGORITHM.CP_GOST_3411_2012_512); 

        // Указываем кодировку данных
        // Кодировка должна быть указана до того, как будут переданы сами данные
        // hashData.DataEncoding по умолчанию = 0, это - CADESCOM_CONTENT_ENCODING_TYPE.STRING_TO_UCS2LE
        // а на нужно 1, это - CADESCOM_CONTENT_ENCODING_TYPE.BASE64_TO_BINARY;
        await hashData.propset_DataEncoding(CADESCOM_CONTENT_ENCODING_TYPE.BASE64_TO_BINARY);
        data = Crypto.utoa(data);
        hashData.Hash(data);
        return hashData.Value;
    }

    // https://cpdn.cryptopro.ru/content/cades/plugin-samples-sign-cades-bes-async.html
    async sign(certificate: ICertificateAsync, dataToSign: string) {
        const signer = await (window as any).cadesplugin.CreateObjectAsync(ObjectNamesAsync.CPSignerAsync);
        await signer.propset_Certificate(certificate);
        const signedData = await (window as any).cadesplugin.CreateObjectAsync(ObjectNamesAsync.CadesSignedDataAsync);
        await signedData.propset_Content(dataToSign);
        return await signedData.SignCades(signer, CADESCOM_CADES_TYPE.BES, true);
    }

Отредактировано пользователем 23 декабря 2019 г. 10:49:28(UTC)  | Причина: Не указана

Offline Андрей Писарев  
#2 Оставлено : 23 декабря 2019 г. 18:07:32(UTC)
Андрей *

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

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

Сказал «Спасибо»: 493 раз
Поблагодарили: 2034 раз в 1578 постах
Здравствуйте.
Почему указано CP_GOST_3411_2012_512,
а не CP_GOST_3411_2012_256?

У Вас открытый ключ 1024 бит по ГОСТ 2012?

Техническую поддержку оказываем тут
Наша база знаний
Offline dok@rmiac18.ru  
#3 Оставлено : 24 декабря 2019 г. 7:13:03(UTC)
dok@rmiac18.ru

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

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

После обнаружения ошибки пробовал указывать CP_GOST_3411_2012_256, ситуация не меняется. При этом для 2001 все работает и на CP_GOST_3411_2012_512 и на CP_GOST_3411_2012_512 ! Открытый ключ 34.10 -2012 256 бит

Отредактировано пользователем 24 декабря 2019 г. 8:13:02(UTC)  | Причина: Не указана

Offline Андрей Писарев  
#4 Оставлено : 24 декабря 2019 г. 8:35:19(UTC)
Андрей *

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

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

Сказал «Спасибо»: 493 раз
Поблагодарили: 2034 раз в 1578 постах
В sign необходимо выставить кодировку, потом присвоить base64. По аналогии с кодом хеширования.
Техническую поддержку оказываем тут
Наша база знаний
Offline dok@rmiac18.ru  
#5 Оставлено : 24 декабря 2019 г. 9:20:26(UTC)
dok@rmiac18.ru

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

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

Не понимаю как это сделать. Вызовы propset_DataEncoding выдают ошибку. В примерах я ничего не нахожу. Где нужно выставлять кодировку?
Offline dok@rmiac18.ru  
#6 Оставлено : 15 января 2020 г. 7:48:57(UTC)
dok@rmiac18.ru

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

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

Проблему решил.
Для этого: файл, который передается с сервера на подпись читать методом readAsDataURL у FileReader.
Далее как в примере удалить текст ";base64,"

Код:

 var header = ";base64,";
 var sBase64Data = dataToSign.substr(dataToSign.indexOf(header) + header.length);


далее установить кодировку:
Код:

signedData.propset_ContentEncoding(CADESCOM_CONTENT_ENCODING_TYPE.BASE64_TO_BINARY);

Отредактировано пользователем 15 января 2020 г. 13:55:42(UTC)  | Причина: Не указана

RSS Лента  Atom Лента
Пользователи, просматривающие эту тему
Быстрый переход  
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.