Статус: Новичок
Группы: Участники
Зарегистрирован: 25.03.2021(UTC) Сообщений: 5
Сказал(а) «Спасибо»: 4 раз
|
Добрый день. Ситуация следующая: Имеется файл и его хэш, присланные извне. Необходимо по хэшу создать подпись. "Bk47tjgnibgYllgtec/q2YUNAcp2kXdd/qHthbbIOQs=" При попытке передать в oSignedData.SignHash сам хэш получаю ошибку (Параметр задан неверно. (0x80070057)) Вычитал на этом форуме, что туда нужно передать HashedData, предварительно проинициализировав его своим хэшем, однако такой вариант приводит к ошибке в функции SetHashValue (Недопустимые данные. (0x8007000D)). Проверил документацию по функции SetHashValue и попробовал конвертнуть хэш в HEX. Ошибка (Параметр задан неверно. (0x80070057).
var CADESCOM_HASH_ALGORITHM_CP_GOST_3411_256 = 101; var CADESCOM_CADES_T = 0x05; var CADESCOM_BASE64_TO_BINARY = 1;
var oStore = yield cryptopro.plugin.CreateObjectAsync("CAdESCOM.Store"); yield oStore.Open(2, "My", 2); var certificatesObj = yield oStore.Certificates; var oCertificates = yield certificatesObj.Find(0, certHash); var count = yield oCertificates.Count;
if (count == 0) { throw new Error(cryptopro.getError(cryptopro.ERR_CERT_NOT_FOUND)); } var oCertificate = yield oCertificates.Item(1); var oSigner = yield cryptopro.plugin.CreateObjectAsync("CAdESCOM.CPSigner"); yield oSigner.propset_TSAAddress(tsaAddress); yield oSigner.propset_Certificate(oCertificate);
var oSignedData = yield cryptopro.plugin.CreateObjectAsync("CAdESCOM.CadesSignedData"); yield oSignedData.propset_ContentEncoding(CADESCOM_BASE64_TO_BINARY); yield oSignedData.propset_Content(content);
var sSignedMessage = ""; if (hash){ var oHashedData = yield cadesplugin.CreateObjectAsync("CAdESCOM.HashedData"); yield oHashedData.propset_Algorithm(CADESCOM_HASH_ALGORITHM_CP_GOST_3411_256); yield oHashedData.propset_DataEncoding(CADESCOM_BASE64_TO_BINARY); //yield oHashedData.SetHashValue(base64ToHex(hash)); //ошибка Параметр задан неверно. (0x80070057) yield oHashedData.SetHashValue(hash); //ошибка Недопустимые данные. (0x8007000D) //sSignedMessage = yield oSignedData.SignHash(hash, oSigner, CADESCOM_CADES_T);//Ошибка Параметр задан неверно. (0x80070057) sSignedMessage = yield oSignedData.SignHash(oHashedData, oSigner, CADESCOM_CADES_T); } else sSignedMessage = yield oSignedData.SignCades(oSigner, CADESCOM_CADES_T);
yield oStore.Close();
Функция для конвертации в HEX
function base64ToHex(str) { const raw = atob(str); let result = ''; for (let i = 0; i < raw.length; i++) { const hex = raw.charCodeAt(i).toString(16); result += (hex.length === 2 ? hex : '0' + hex); } return result.toUpperCase(); }
Варианты исчерпаны. Пожалуйста подскажите куда копать? Отредактировано пользователем 25 марта 2021 г. 15:06:42(UTC)
| Причина: Не указана
|
|
|
|
Статус: Новичок
Группы: Участники
Зарегистрирован: 25.03.2021(UTC) Сообщений: 5
Сказал(а) «Спасибо»: 4 раз
|
Попробовал разные методы. Кодировал/декодировал подписи, хэши и файлы в/из Base64. Попробовал другие методы. В частности алгоритм создания хэша yield oHashedData.Hash(content) возвращает хэш очень сильно отличный от присланного хэша, не смотря на использование одинакового алгоритма(по документации):
Прислали: "JYJ58mSoYp8yysdCt2WXoks1/tBzV6tqlJD+VPyEV7A=" Мой: "NTk2REJCNTdFQ0E3REIzNEMxRDdFMUVGNzYyRUZBODExODlDOEFCRUVFRDQ3NkNBNkEzMkQ2MDJENTFEMTFENA=="
В случае генерации собственного хэша и создания подписи следующим образом: sSignedMessage = yield oSignedData.SignHash(oHashedData, oSigner, CADESCOM_CADES_BES); Сервис документооборота возвращает ошибку: "Ошибка проверки ЭП: подпись недействительна, не соответствует файлу или испорчена"
Если же генерировать подпись следующим образом: var sRawSignature = yield cryptopro.plugin.CreateObjectAsync("CAdESCOM.RawSignature") sSignedMessage = yield sRawSignature.SignHash(oHashedData, oCertificate); То ошибка будет следующей: "Ошибка при проверке ЭП документа: не удалось извлечь сертификат"
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 26.07.2011(UTC) Сообщений: 13,339 Сказал «Спасибо»: 550 раз Поблагодарили: 2211 раз в 1726 постах
|
|
|
|
|
|
Статус: Новичок
Группы: Участники
Зарегистрирован: 25.03.2021(UTC) Сообщений: 5
Сказал(а) «Спасибо»: 4 раз
|
Автор: Андрей * https://docs.cryptopro.ru/cades/plugin/plugin-samples/plugin-samples-raw-signature Спасибо за ответ, Андрей. К сожалению, я уже пробовал этот вариант ранее. Он приводит к ошибке распознавания сертификата на стороне. Насколько я понимаю, дело в том, что алгоритм необработанной подписи - ГОСТ Р 34.10-2012. В то время как моя подпись ГОСТ 34.11-2012 256 и необходимо реализовать функционал под неё.
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 26.07.2011(UTC) Сообщений: 13,339 Сказал «Спасибо»: 550 раз Поблагодарили: 2211 раз в 1726 постах
|
Автор: Arc_75 Автор: Андрей * https://docs.cryptopro.ru/cades/plugin/plugin-samples/plugin-samples-raw-signature Спасибо за ответ, Андрей. К сожалению, я уже пробовал этот вариант ранее. Он приводит к ошибке распознавания сертификата на стороне. Насколько я понимаю, дело в том, что алгоритм необработанной подписи - ГОСТ Р 34.10-2012. В то время как моя подпись ГОСТ 34.11-2012 256 и необходимо реализовать функционал под неё. Я подписал по хешу (декодировал из base64, преобразовал в hex): 258279F264A8629F32CAC742B76597A24B35FED07357AB6A9490FE54FC8457B0 Проверьте. Snimok ehkrana ot 2021-03-26 13-25-47.png (46kb) загружен 19 раз(а).архив с CMS: signed.zip (2kb) загружен 3 раз(а). |
|
1 пользователь поблагодарил Андрей * за этот пост.
|
Arc_75 оставлено 26.03.2021(UTC)
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 26.07.2011(UTC) Сообщений: 13,339 Сказал «Спасибо»: 550 раз Поблагодарили: 2211 раз в 1726 постах
|
Автор: Arc_75 Насколько я понимаю, дело в том, что алгоритм необработанной подписи - ГОСТ Р 34.10-2012. В то время как моя подпись ГОСТ 34.11-2012 256 и необходимо реализовать функционал под неё. Может просто забыли исправить константы в примере? Там же CADESCOM_HASH_ALGORITHM_CP_GOST_3411 указан (1994 год). А не обходим cadesplugin.CADESCOM_HASH_ALGORITHM_CP_GOST_3411_ 2012_256 |
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 26.07.2011(UTC) Сообщений: 13,339 Сказал «Спасибо»: 550 раз Поблагодарили: 2211 раз в 1726 постах
|
и вместо oRawSignature = yield cadesplugin.CreateObjectAsync("CAdESCOM.RawSignature"); нужно: oSignedData = yield cadesplugin.CreateObjectAsync("CAdESCOM.CadesSignedData"); тогда всё будет, как положено, CMS, а не RAW. |
|
1 пользователь поблагодарил Андрей * за этот пост.
|
Arc_75 оставлено 26.03.2021(UTC)
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 26.07.2011(UTC) Сообщений: 13,339 Сказал «Спасибо»: 550 раз Поблагодарили: 2211 раз в 1726 постах
|
|
|
1 пользователь поблагодарил Андрей * за этот пост.
|
Arc_75 оставлено 26.03.2021(UTC)
|
|
Статус: Новичок
Группы: Участники
Зарегистрирован: 25.03.2021(UTC) Сообщений: 5
Сказал(а) «Спасибо»: 4 раз
|
Автор: Андрей * Автор: Arc_75 Автор: Андрей * https://docs.cryptopro.ru/cades/plugin/plugin-samples/plugin-samples-raw-signature Спасибо за ответ, Андрей. К сожалению, я уже пробовал этот вариант ранее. Он приводит к ошибке распознавания сертификата на стороне. Насколько я понимаю, дело в том, что алгоритм необработанной подписи - ГОСТ Р 34.10-2012. В то время как моя подпись ГОСТ 34.11-2012 256 и необходимо реализовать функционал под неё. Я подписал по хешу (декодировал из base64, преобразовал в hex): 258279F264A8629F32CAC742B76597A24B35FED07357AB6A9490FE54FC8457B0 Проверьте. Snimok ehkrana ot 2021-03-26 13-25-47.png (46kb) загружен 19 раз(а).архив с CMS: signed.zip (2kb) загружен 3 раз(а). Андрей, большое спасибо за помощь. Ваша подсказка по декодированию очень помогла в понимании, что именно требуется для подписания. Я ещё раз попробовал необработанную подпись, после чего попытался подписать для ГОСТ 34.11-2012 улучшенной подписью. В итоге получилось подписать документ для СБИС по их хэшу используя следующую конструкцию:
hash - получили от сбис
var oSigner = yield cryptopro.plugin.CreateObjectAsync("CAdESCOM.CPSigner"); yield oSigner.propset_TSAAddress(tsaAddress); yield oSigner.propset_Certificate(oCertificate); var oSignedData = yield cryptopro.plugin.CreateObjectAsync("CAdESCOM.CadesSignedData"); yield oSignedData.propset_ContentEncoding(CADESCOM_BASE64_TO_BINARY); yield oSignedData.propset_Content(content);
var oHashedData = yield cadesplugin.CreateObjectAsync("CAdESCOM.HashedData"); yield oHashedData.propset_Algorithm(CADESCOM_HASH_ALGORITHM_CP_GOST_3411_256); yield oHashedData.propset_DataEncoding(CADESCOM_BASE64_TO_BINARY); yield oHashedData.SetHashValue(base64ToHex(hash)); // функцию base64ToHex описывал в первом посте
sSignedMessage = yield oSignedData.SignHash(oHashedData, oSigner, CADESCOM_CADES_T);
Проблема решена. Спасибо!
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 26.07.2011(UTC) Сообщений: 13,339 Сказал «Спасибо»: 550 раз Поблагодарили: 2211 раз в 1726 постах
|
Цитата:.propset_Content(content);
а это зачем? Нет никакого content же, есть инициализация сразу хеша oHashedData.SetHashValue(base64ToHex(hash)); |
|
1 пользователь поблагодарил Андрей * за этот пост.
|
Arc_75 оставлено 26.03.2021(UTC)
|
|
Быстрый переход
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.
Important Information:
The Форум КриптоПро uses cookies. By continuing to browse this site, you are agreeing to our use of cookies.
More Details
Close