logo
Добро пожаловать, Гость! Чтобы использовать все возможности Вход или Регистрация.

Уведомление

Icon
Error

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

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

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

Сказал(а) «Спасибо»: 13 раз
Добрый день.
Не могу до конца понять, что не так делаю.
Есть на сервере файл.
Получаю хеш значение файла алгоритмом 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 г. 12:57:56(UTC)
Андрей Писарев

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

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

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

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

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

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

Сказал «Спасибо»: 264 раз
Поблагодарили: 1032 раз в 830 постах
по п1. - вопрос снят, проверяется.
Offline Андрей Писарев  
#4 Оставлено : 12 октября 2018 г. 13:05:18(UTC)
Андрей Писарев

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

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

Сказал «Спасибо»: 264 раз
Поблагодарили: 1032 раз в 830 постах
Автор: 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 г. 14:10:43(UTC)
ivar.mikhailovich

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

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

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

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

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

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


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

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

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

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

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

Сказал «Спасибо»: 264 раз
Поблагодарили: 1032 раз в 830 постах
На клиенте вызвать SetHashValue (хеш от файла, рассчитанный на сервере)
thanks 1 пользователь поблагодарил Андрей Писарев за этот пост.
ivar.mikhailovich оставлено 12.10.2018(UTC)
Offline ivar.mikhailovich  
#8 Оставлено : 12 октября 2018 г. 17:30:35(UTC)
ivar.mikhailovich

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

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

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


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

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

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

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

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

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

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

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

Сказал «Спасибо»: 264 раз
Поблагодарили: 1032 раз в 830 постах
Автор: 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)
Offline Андрей Писарев  
#11 Оставлено : 14 октября 2018 г. 10:17:53(UTC)
Андрей Писарев

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

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

Сказал «Спасибо»: 264 раз
Поблагодарили: 1032 раз в 830 постах
Прикладываю тестовый файл и ЭП к нему.

Значение хеша:
Цитата:
1807 79: SEQUENCE {
1809 9: OBJECT IDENTIFIER messageDigest (1 2 840 113549 1 9 4)
1820 66: SET {
1822 64: OCTET STRING
: 20 91 AC F5 8B 53 68 3A F2 95 8F EC 82 AA E9 7C
: A1 50 E2 12 11 33 FC 15 3D 97 07 FE 86 D3 89 8A
: D4 1F C4 58 54 C8 0B C0 83 A5 DF DD 84 3D 9A EF
: DC 5E DA 68 70 6C C1 5E 73 E3 1B 88 B5 80 9D 34
: }
: }

Для проверки:
https://www.gosuslugi.ru/pgu/eds/

Выбрать:
Подтверждение подлинности ЭП электронного документа.
ЭП — отсоединенная, в формате PKCS#7 по значению хэш-функции

Цитата:

Указать файл: 0000.sig
Указать хеш: 2091ACF58B53683AF2958FEC82AAE97CA150E2121133FC153D9707FE86D3898AD41FC45854C80BC083A5DFDD843D9AEFDC5EDA68706CC15E73E31B88B5809D34

ЭП: Верна.





Выбрать:
Подтверждение подлинности ЭП электронного документа.
ЭП — отсоединенная, в формате PKCS#7
Цитата:

документ для проверки: 0000
файл подписи для проверки: 0000.sig

ЭП: Верна.


0000.zip (2kb) загружен 1 раз(а).


thanks 1 пользователь поблагодарил Андрей Писарев за этот пост.
ivar.mikhailovich оставлено 14.10.2018(UTC)
Offline ivar.mikhailovich  
#12 Оставлено : 26 ноября 2018 г. 14:02:52(UTC)
ivar.mikhailovich

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

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

Сказал(а) «Спасибо»: 13 раз
Автор: Андрей Писарев Перейти к цитате
Автор: 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

: }



Можно ли определить алгоритм сертификата из сертификата, чтобы на сервере сгенерировать хеш таким же алгоритмом? Т.к. алгоритм сертификата должен совпадать с алгоритмом хеша.
Offline two_oceans  
#13 Оставлено : 27 ноября 2018 г. 3:44:28(UTC)
two_oceans

Статус: Эксперт

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

Сказал(а) «Спасибо»: 12 раз
Поблагодарили: 40 раз в 40 постах
Напрямую это сделать немного проблематично, но можно схардкодить перевод алгоритма открытого ключа в алгоритм хэша. Если точнее в сертификате или контексте сертификата (смотря что Вам удобнее) есть информация об открытом ключе, там 3 идентификатора и собственно сам открытый ключ. первый идентификатор - алгоритм открытого ключа; второй - параметры алгоритма хэширования (казалось бы "вот оно!" по параметрам однозначно определяется алгоритм хэширования, но не так все просто); третий - параметры алгоритма подписи.

К сожалению, параметры алгоритма хэширования нельзя использовать для однозначного определения алгоритма потому что в гост-2012 алгоритм хэша не имеет параметров и в это поле для гост-2012 256 бит заполняется всякая ерунда, чаще всего идентификатор параметров гост-2001. Поэтому приходится отправной точкой выбирать алгоритм открытого ключа или алгоритм параметров подписи. В общем случае, это притянуто за уши, так как хэш это одно, а ключ совсем другое, и нужно брать поле параметров алгоритма хэширования. Однако для алгоритмов гост все "верх дном" параметры хеширования заткнуты заглушкой, но есть однозначное соответствие между алгоритмом ключа и алгоритмами хэширования и подписи.

Отредактировано пользователем 27 ноября 2018 г. 3:48:40(UTC)  | Причина: Не указана

Offline ivar.mikhailovich  
#14 Оставлено : 27 ноября 2018 г. 8:30:20(UTC)
ivar.mikhailovich

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

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

Сказал(а) «Спасибо»: 13 раз
Автор: two_oceans Перейти к цитате
Напрямую это сделать немного проблематично, но можно схардкодить перевод алгоритма открытого ключа в алгоритм хэша. Если точнее в сертификате или контексте сертификата (смотря что Вам удобнее) есть информация об открытом ключе, там 3 идентификатора и собственно сам открытый ключ. первый идентификатор - алгоритм открытого ключа; второй - параметры алгоритма хэширования (казалось бы "вот оно!" по параметрам однозначно определяется алгоритм хэширования, но не так все просто); третий - параметры алгоритма подписи.

К сожалению, параметры алгоритма хэширования нельзя использовать для однозначного определения алгоритма потому что в гост-2012 алгоритм хэша не имеет параметров и в это поле для гост-2012 256 бит заполняется всякая ерунда, чаще всего идентификатор параметров гост-2001. Поэтому приходится отправной точкой выбирать алгоритм открытого ключа или алгоритм параметров подписи. В общем случае, это притянуто за уши, так как хэш это одно, а ключ совсем другое, и нужно брать поле параметров алгоритма хэширования. Однако для алгоритмов гост все "верх дном" параметры хеширования заткнуты заглушкой, но есть однозначное соответствие между алгоритмом ключа и алгоритмами хэширования и подписи.


Спасибо за информацию!


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