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

Уведомление

Icon
Error

2 Страницы12>
Опции
К последнему сообщению К первому непрочитанному
Offline ivar.mikhailovich  
#1 Оставлено : 12 октября 2018 г. 15:08:32(UTC)
ivar.mikhailovich

Статус: Участник

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

Сказал(а) «Спасибо»: 18 раз
Добрый день.
Не могу до конца понять, что не так делаю.
Есть на сервере файл.
Получаю хеш значение файла алгоритмом JCP.GOST_EL_2012_512_NAME и передаю клиенту.

На клиенте:
Конвертирую хеш значение в Base64 строку.
Подписываю эту Base64 строку. Сертификат: Алгоритм ключа: ГОСТ Р 34.10-2012 512 бит Криптопровайдер: Crypto-Pro GOST R 34.10-2012 Strong Cryptographic Service Provider
Получаю результат. В консоли вывожу Signature. Сохраняю его как sig файл.
Проверяю на госуслугах (Подтверждение подлинности ЭП электронного документа. ЭП — отсоединенная, в формате PKCS#7 по значению хэш-функции) - сертификат показывается, но подпись ЭП - не верна.
Не могли бы помочь подсказать, что не так?

Спасибо.

Ниже код функции, который взят из примеров КрипоПро:
Код:

function SignCadesBES_Async(certListBoxId, data, setDisplayData) {
    cadesplugin.async_spawn(function*(arg) {
        var e = document.getElementById(arg[0]);
        var selectedCertID = e.selectedIndex;
        if (selectedCertID == -1) {
            alert("Select certificate");
            return;
        }

        var certificate = global_selectbox_container[selectedCertID];

        var dataToSign = Base64.encode(data);
     
        var Signature;
        try
        {
          
            var errormes = "";
            try {
                var oSigner = yield cadesplugin.CreateObjectAsync("CAdESCOM.CPSigner");
            } catch (err) {
                errormes = "Failed to create CAdESCOM.CPSigner: " + err.number;
                throw errormes;
            }
            var oSigningTimeAttr = yield cadesplugin.CreateObjectAsync("CADESCOM.CPAttribute");

            yield oSigningTimeAttr.propset_Name(cadesplugin.CAPICOM_AUTHENTICATED_ATTRIBUTE_SIGNING_TIME);
            var oTimeNow = new Date();
            yield oSigningTimeAttr.propset_Value(oTimeNow);
            var attr = yield oSigner.AuthenticatedAttributes2;
            yield attr.Add(oSigningTimeAttr);


            var oDocumentNameAttr = yield cadesplugin.CreateObjectAsync("CADESCOM.CPAttribute");
            yield oDocumentNameAttr.propset_Name(cadesplugin.CADESCOM_AUTHENTICATED_ATTRIBUTE_DOCUMENT_NAME);
            yield oDocumentNameAttr.propset_Value("Document Name");
            yield attr.Add(oDocumentNameAttr);

            if (oSigner) {
                yield oSigner.propset_Certificate(certificate);
            }
            else {
                errormes = "Failed to create CAdESCOM.CPSigner";
                throw errormes;
            }

            var oSignedData = yield cadesplugin.CreateObjectAsync("CAdESCOM.CadesSignedData");

            if (dataToSign) {
                // Данные на подпись ввели
                yield oSigner.propset_Options(cadesplugin.CAPICOM_CERTIFICATE_INCLUDE_WHOLE_CHAIN);
                yield oSignedData.propset_ContentEncoding(cadesplugin.CADESCOM_BASE64_TO_BINARY); //
                // if(typeof(setDisplayData) != 'undefined')
                // {
                //     //Set display data flag flag for devices like Rutoken PinPad
                //     yield oSignedData.propset_DisplayData(1);
                // }
                yield oSignedData.propset_Content(dataToSign);

                try {
                    Signature = yield oSignedData.SignCades(oSigner, cadesplugin.CADESCOM_CADES_BES, true);
                    // Signature = yield oSignedData.SignHash(oHashedData, oSigner, CADESCOM_CADES_BES);
                }
                catch (err) {
                    errormes = "Не удалось создать подпись из-за ошибки: " + cadesplugin.getLastError(err);
                    throw errormes;
                }
            }
            // document.getElementById("SignatureTxtBox").innerHTML = Signature;
            // SignatureFieldTitle[0].innerHTML = "Подпись сформирована успешно:";
            console.log("Signature ", Signature);
            console.log("Signature decoded ", Base64.decode(Signature));
        }
        catch(err)
        {
            // SignatureFieldTitle[0].innerHTML = "Возникла ошибка:";
            // document.getElementById("SignatureTxtBox").innerHTML = err;
            console.error("Error in Signature creation: ", err);
        }
    }, certListBoxId); //cadesplugin.async_spawn
}

Offline Андрей Писарев  
#2 Оставлено : 12 октября 2018 г. 15:57:56(UTC)
Андрей *

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

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

Сказал «Спасибо»: 492 раз
Поблагодарили: 2034 раз в 1578 постах
Здравствуйте.

1. На сайте заяввлена поддержка 2012?
2. Можете приложить то, что отправляете (в архиве) или прислать для анализа в ЛС?
Техническую поддержку оказываем тут
Наша база знаний
Offline Андрей Писарев  
#3 Оставлено : 12 октября 2018 г. 16:00:27(UTC)
Андрей *

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

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

Сказал «Спасибо»: 492 раз
Поблагодарили: 2034 раз в 1578 постах
по п1. - вопрос снят, проверяется.
Техническую поддержку оказываем тут
Наша база знаний
Offline Андрей Писарев  
#4 Оставлено : 12 октября 2018 г. 16:05:18(UTC)
Андрей *

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

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

Сказал «Спасибо»: 492 раз
Поблагодарили: 2034 раз в 1578 постах
Автор: ivar.mikhailovich Перейти к цитате

Есть на сервере файл.
Получаю хеш значение файла алгоритмом JCP.GOST_EL_2012_512_NAME и передаю клиенту.

На клиенте:
Конвертирую хеш значение в Base64 строку.
Подписываю эту Base64 строку. Сертификат: Алгоритм ключа: ГОСТ Р 34.10-2012 512 бит Криптопровайдер: Crypto-Pro GOST R 34.10-2012 Strong Cryptographic Service Provider
Получаю результат. В консоли вывожу Signature. Сохраняю его как sig файл.
Проверяю на госуслугах (Подтверждение подлинности ЭП электронного документа. ЭП — отсоединенная, в формате PKCS#7 по значению хэш-функции) - сертификат показывается, но подпись ЭП - не верна.
Не могли бы помочь подсказать, что не так?


На гос.услуги нужно тогда передавать не файл, а строку с хешем (в файле, до кодирования в base64).

SignCades - подписывает хеш вычисленный внутри для переданных данных.
Техническую поддержку оказываем тут
Наша база знаний
Offline ivar.mikhailovich  
#5 Оставлено : 12 октября 2018 г. 17:10:43(UTC)
ivar.mikhailovich

Статус: Участник

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

Сказал(а) «Спасибо»: 18 раз
Я так и делаю на госуслугах. Передаю хеш до base64 и файл уже с подписью. Госуслуги говорит что ЭП не верна .
Offline Андрей Писарев  
#6 Оставлено : 12 октября 2018 г. 20:21:16(UTC)
Андрей *

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

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

Сказал «Спасибо»: 492 раз
Поблагодарили: 2034 раз в 1578 постах
Автор: ivar.mikhailovich Перейти к цитате
Я так и делаю на госуслугах. Передаю хеш до base64 и файл уже с подписью. Госуслуги говорит что ЭП не верна .


Портал ждет хеш от файла и подпись к файлу.

Если вычислять хеш, а потом его же передавать в SignCades - будет внутри вычислен хеш от переданных данных (т.е. от хеша) и уже внутренний хеш - будет подписываться (а точнее - структура с атрибутами)

Портал извлекает из CMS (sig файла) значение хеша (из ASN.1) и сравнивает его с тем, что ввели в поле ввода (hex вариант) = хеш от файла.
Техническую поддержку оказываем тут
Наша база знаний
thanks 1 пользователь поблагодарил Андрей * за этот пост.
ivar.mikhailovich оставлено 12.10.2018(UTC)
Offline Андрей Писарев  
#7 Оставлено : 12 октября 2018 г. 20:26:04(UTC)
Андрей *

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

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

Сказал «Спасибо»: 492 раз
Поблагодарили: 2034 раз в 1578 постах
На клиенте вызвать SetHashValue (хеш от файла, рассчитанный на сервере)
Техническую поддержку оказываем тут
Наша база знаний
thanks 1 пользователь поблагодарил Андрей * за этот пост.
ivar.mikhailovich оставлено 12.10.2018(UTC)
Offline ivar.mikhailovich  
#8 Оставлено : 12 октября 2018 г. 20:30:35(UTC)
ivar.mikhailovich

Статус: Участник

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

Сказал(а) «Спасибо»: 18 раз
Автор: Андрей Писарев Перейти к цитате
На клиенте вызвать SetHashValue (хеш от файла, рассчитанный на сервере)


Спасибо.
Попробую.
Offline ivar.mikhailovich  
#9 Оставлено : 12 октября 2018 г. 23:39:43(UTC)
ivar.mikhailovich

Статус: Участник

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

Сказал(а) «Спасибо»: 18 раз
Спасибо.
Все работает.
На госуслугах - проверяется.

Только момент есть.
Я так понимаю что алгоритм сертификата и алгоритм генерации хеша на сервере - должны совпадать?

Спасибо.
Offline Андрей Писарев  
#10 Оставлено : 13 октября 2018 г. 0:17:29(UTC)
Андрей *

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

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

Сказал «Спасибо»: 492 раз
Поблагодарили: 2034 раз в 1578 постах
Автор: ivar.mikhailovich Перейти к цитате

Я так понимаю что алгоритм сертификата и алгоритм генерации хеша на сервере - должны совпадать?


Верно.

Пример файла с подписью:

Пример, хеш:
szOID_CP_GOST_R3411_12_512="1.2.643.7.1.1.2.3" // Функция хэширования ГОСТ Р 34.11-2012, длина выхода 512 бит


Значение хеша:
Цитата:

1663 12: SEQUENCE {
1665 8: Алгоритм: OBJECT IDENTIFIER '1 2 643 7 1 1 2 3'
1675 0: NULL
: }
1677 561: [0] {
1681 24: SEQUENCE {
1683 9: OBJECT IDENTIFIER contentType (1 2 840 113549 1 9 3)
1694 11: SET {
1696 9: OBJECT IDENTIFIER data (1 2 840 113549 1 7 1)
: }
: }
1707 28: SEQUENCE {
1709 8: OBJECT IDENTIFIER '1 2 643 2 45 1 1 2'
1719 16: SET {
1721 14: BMPString '** . h a s h '
: }
: }
1737 28: SEQUENCE {
1739 9: OBJECT IDENTIFIER signingTime (1 2 840 113549 1 9 5)
1750 15: SET {
1752 13: UTCTime 12/10/2018 16:58:00 GMT
: }
: }
1767 44: SEQUENCE {
1769 8: OBJECT IDENTIFIER '1 2 643 3 182 1 3'
1779 32: SET {
1781 30: BMPString '****************** '
: }
: }
1813 79: SEQUENCE {
1815 9: OBJECT IDENTIFIER messageDigest (1 2 840 113549 1 9 4)
1826 66: SET {
1828 64: OCTET STRING
значение хеша:
: 0C 3D 3B 6A B7 0A 78 52 AD EB B5 A3 AE EA 76 65
: C7 53 7F 2F E1 C8 4A 94 AC CD 87 7B C4 34 38 99
: BE F3 29 8F D8 68 E8 50 C8 98 D4 69 B3 E6 7F 91
: 6F E6 94 86 75 58 AB 18 88 C7 91 23 78 AD D2 17

: }

Техническую поддержку оказываем тут
Наша база знаний
thanks 1 пользователь поблагодарил Андрей * за этот пост.
ivar.mikhailovich оставлено 14.10.2018(UTC)
RSS Лента  Atom Лента
Пользователи, просматривающие эту тему
2 Страницы12>
Быстрый переход  
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.