Статус: Новичок
Группы: Участники
Зарегистрирован: 14.11.2018(UTC) Сообщений: 8
|
Здравствуйте.
Стоит задача: есть файл и отдельная подпись. Нужно проверить был ли данный файл подписан этой подписью. в рук-ве разработчика нашел пример и перевел его на 1С, ниже код. В момент проверки "oSignedData.Verify(Message, Истина)" выдается сообщение: " (CAdESCOM.CadesSignedData.1): The hash value is not correct." Помогите, пожалуйста, понять в чем ошибка?
Процедура Проверить()
CAPICOM_VERIFY_SIGNATURE_ONLY = 0; oSignedData = Новый COMОбъект("CAdESCOM.CadesSignedData"); //Загрузка подписанных данных для проверки. Content = ЗагрузитьФайл(ПутьКФайлу); Message = ЗагрузитьФайл(ПутьКПодписи); oSignedData.Content = Content; //Проверка отделенной подписи Ответ = oSignedData.Verify(Message, Истина); КонецПроцедуры
Функция ЗагрузитьФайл(FileName) ForReading = 1; fso = Новый COMОбъект("Scripting.FileSystemObject"); ts = fso.OpenTextFile(FileName, ForReading); LoadFile = ts.ReadAll();
Возврат LoadFile;
КонецФункции
Спасибо большое за помощь!
|
|
|
|
Статус: Эксперт
Группы: Участники
Зарегистрирован: 05.03.2015(UTC) Сообщений: 1,602  Откуда: Иркутская область Сказал(а) «Спасибо»: 110 раз Поблагодарили: 395 раз в 366 постах
|
Если подпись не в формате Base64, то читать ее методом для текстового файла плохая идея. А уж сам файл наверняка бинарный. FSO.TextStream вместе с Visual Basic крайне вольно работает с текстами - может изменить кодировку считанного файла как посчитает нужным, выкинуть или вставить переводы строк и в результате на проверку уйдет совсем не то, что лежит в файлах на диске. Лучше вместо fso.OpenTextFile создать объект ADODB.Stream в режиме Binary и считать файлы им. Отредактировано пользователем 12 декабря 2018 г. 17:43:13(UTC)
| Причина: Не указана
|
|
|
|
Статус: Новичок
Группы: Участники
Зарегистрирован: 14.11.2018(UTC) Сообщений: 8
|
Автор: two_oceans  Если подпись не в формате Base64, то читать ее методом для текстового файла плохая идея. А уж сам файл наверняка бинарный. FSO.TextStream вместе с Visual Basic крайне вольно работает с текстами - может изменить кодировку считанного файла как посчитает нужным, выкинуть или вставить переводы строк и в результате на проверку уйдет совсем не то, что лежит в файлах на диске. Лучше вместо fso.OpenTextFile создать объект ADODB.Stream в режиме Binary и считать файлы им. Спасибо Вам за отклик! подскажите, а есть пример считывания файла, например, pdf или xml с помощью ADODB.Stream и получения его в формате txt?
|
|
|
|
Статус: Эксперт
Группы: Участники
Зарегистрирован: 05.03.2015(UTC) Сообщений: 1,602  Откуда: Иркутская область Сказал(а) «Спасибо»: 110 раз Поблагодарили: 395 раз в 366 постах
|
txt? Наверно надо определиться все же какой режим считывания нужен двоичный или текстовый, на всякий случай оба примера. В случае текстового ADODB.Stream позволяет явно указать кодировку файла. В переменной FName имя файла откуда читать, в переменной S будет содержимое файла.
Пример из VBScript Код: Set ParFile=CreateObject("ADODB.Stream")
ParFile.Mode = 3 '3 -adModeReadWrite 'разрешение на чтение и запись
ParFile.Type = 2 '1 - adTypeBinary, 2 - adTypeText ' текстовый режим
ParFile.Charset="utf-8" ' нужная кодировка, для xml как правило "utf-8", для текстовых файлов "windows-1251"
ParFile.Open ' открыть стрим
ParFile.LoadFromFile FName ' загрузить содержимое файла в стрим
ParFile.Position=0 ' читать будем с начала, иногда может быть 3 чтобы пропустить ByteOrderMark в utf-8
S=ParFile.ReadText(-1) '-1 по умолчанию считать все с текущей позиции до конца, -2 до конца строки, >0 количество символов
ParFile.Close
Set ParFile=Nothing
В случае двоичного файла Код: Set ParFile=CreateObject("ADODB.Stream")
ParFile.Mode = 3 '3 -adModeReadWrite 'разрешение на чтение и запись
ParFile.Type = 1 '1 - adTypeBinary, 2 - adTypeText ' двоичный режим
ParFile.Open ' открыть стрим
ParFile.LoadFromFile FName ' загрузить содержимое файла в стрим
ParFile.Position=0 ' читать будем с начала
S=ParFile.Read(-1) '-1 по умолчанию считать все с текущей позиции до конца, >0 количество байт
ParFile.Close
Set ParFile=Nothing
Вместо CreateObject() наверно нужно Новый COMОбъект(), "Set ParFile=Nothing" не уверен как записывается в 1c, можно закомментировать
К слову, в сочетании с Код:ParFile.CopyTo Stream2 ' скопировать с текущей позиции до конца в другой ADODB.Stream
или
ParFile.SaveToFile FName2, 2 ' сохранить стрим в файл, 2 - перезаписывать
можно свободно менять кодировку файлов или сохранить скачанный файл. Отредактировано пользователем 12 декабря 2018 г. 19:00:00(UTC)
| Причина: Не указана
|
|
|
|
Статус: Новичок
Группы: Участники
Зарегистрирован: 14.11.2018(UTC) Сообщений: 8
|
Я переписал чтение файлов на "ADODB.Stream" спасибо Вам большое! только у меня пока все равно не складывается пазл. у меня есть файл "test.xml" и подпись подписавшая этот файл: "test.sig". вот мой код:
ПодписьMessage = ЗагрузитьФайл(Подпись,Ложь, Истина); ФайлContent = ЗагрузитьФайл(Файл,Ложь); CADESCOM_BASE64_TO_BINARY = 1; CADESCOM_CADES_BES = 1; oSignedData = Новый COMОбъект("CAdESCOM.CadesSignedData"); oSignedData.Content = ФайлContent;//dataToVerify; oSignedData.VerifyCades(ПодписьMessage, CADESCOM_CADES_BES, true);
Функция ЗагрузитьФайл(FileName, ЧитатьФайлЧерезКом = Истина, ЭтоПодпись = Ложь) Если ЧитатьФайлЧерезКом Тогда ForReading = 1; fso = Новый COMОбъект("Scripting.FileSystemObject"); ts = fso.OpenTextFile(FileName, ForReading); LoadFile = ts.ReadAll(); Иначе Если ЭтоПодпись Тогда Stream = Новый COMОбъект("ADODB.Stream"); Stream.Mode = 3;//'3 -adModeReadWrite 'разрешение на чтение и запись Stream.Type = 1; //'1 - adTypeBinary, 2 - adTypeText ' двоичный режим Stream.Open(); Stream.loadFromFile(FileName); Stream.Position=0; LoadFile=Stream.Read(-1); Stream.Close(); Stream = Неопределено; Иначе
Stream = Новый COMОбъект("ADODB.Stream"); Stream.Type = 2; Stream.charset="utf-8"; Stream.Open(); Stream.loadFromFile(FileName); LoadFile=Stream.readText(); Stream.Close(); Stream = Неопределено; КонецЕсли; КонецЕсли; Возврат LoadFile; КонецФункции
когда я считываю сам файл - вижу его как текст - вроде бы все ок. в момент когда читаю подпись, ее читаю уже как ДД на выходе получаю COMSafeArray и в этом массиве лежат двоичные данные. попробовал в таком варианте все отдать в oSignedData.VerifyCades(ПодписьMessage, CADESCOM_CADES_BES, true);
таже ошибка "(CAdESCOM.CadesSignedData.1): The hash value is not correct."
сижу пока копаю дальше...
|
|
|
|
Статус: Эксперт
Группы: Участники
Зарегистрирован: 05.03.2015(UTC) Сообщений: 1,602  Откуда: Иркутская область Сказал(а) «Спасибо»: 110 раз Поблагодарили: 395 раз в 366 постах
|
Тогда наверно надо начать с начала и подкинуть идей с чем еще поэкспериментировать. Насколько вижу из текстового считывания выкинуты строки "Stream.Mode = 3;" в начале и "Stream.Position=0;" перед .readText Имеет смысл поэкспериментировать с Position установив значение 0 или 3 перед чтением. Суть в том, что если стрим открывается для чтения-записи, то насколько помню после загрузки текущая позиция будет в конце стрима и ничего вообще не считается, поэтому приходится выровнять позицию на начало. Если test.xml сохранен в кодировке utf-8, то в начале может быть метка порядка байтов (признак utf-8 сохраненный блокнотом или другим текстовым редактором) и по идее метку не надо подписывать, а просто выкидывать. Установка значения Position в 3 как раз выкидывает метку. Дальше, вот этот файл test.xml откуда получили? Если, например, скопировали со страницы сайта или из некого паспорта информационной системы в формате Word, то вполне возможно что при сохранении в отдельный файл сохранили в неверной кодировке. В стандартном блокноте при сохранении файла внизу есть переключатель кодировки.
Как узнать какая кодировка должна быть. В начале xml файла должен быть заголовок вроде такого Код:<?xml version="1.0" encoding="UTF-8"?>
Если в документе есть хотя бы один символ с кодом больше 127 (например, любая русская буква) нужно убедиться, что кодировка в сохраненном файле именно та, что указана в заголовке. Учитывая как 1С любит русскоязычные теги, русские буквы наверное есть. При подписании или проверке по стандарту xmldsig будет произведена попытка преобразовать из кодировки, указанной в заголовке, в кодировку, указанную в стандарте (utf-8), поэтому обычно в заголовке указана тоже utf-8 для экономии времени. Для теста тоже лучше взять файл с utf-8. Если же в заголовке указана utf-8, а фактически текст будет иметь другую кодировку, то при проверке преобразование кодировки не произойдет, значения хэша будут отличаться и проверка провалится. Если подпись не xmldsig то преобразования кодировки не производится вообще, какая фактическая кодировка сохранена в файле та и пойдет на проверку. Поэтому опять же файл нужно считать так, чтобы кодировка не нарушилась от момента подписания и до момента проверки.
Вообще если просмотреть содержимое (через FAR, например) в test.sig данные текстовые или двоичные? Ну, предполагаю что с ним все в порядке раз дело доходит до проверки хэша. Это если конечно описание ошибки верное и данный код не возвращается на любой сбой.
|
|
|
|
Статус: Новичок
Группы: Участники
Зарегистрирован: 14.11.2018(UTC) Сообщений: 8
|
добрый день! Спасибо. попробовал поиграться с "Stream.Position" и "Stream.Mode", но пока безуспешно. Причем, когда считываю файл "test.xml" (сохранен был уже в кодировке utf-8), то в отладке вижу, что метка кодировки считана и присутствует, те position=3 не выкидывает эту метку получается? приложил скриншот  2018-12-13_13-34-17.png (5kb) загружен 7 раз(а).пробовал оба файла: сам файл и подпись считать в двоичном режиме, ошибка таже. Файл и подпись получили от коллег со стороны. сам файл "test.xml" - текстовые данные, а файл "test.sig" при открытии отображается такое ощущение в кодировке base64
|
|
|
|
Статус: Эксперт
Группы: Участники
Зарегистрирован: 05.03.2015(UTC) Сообщений: 1,602  Откуда: Иркутская область Сказал(а) «Спасибо»: 110 раз Поблагодарили: 395 раз в 366 постах
|
Метка порядка байтов (Byte Order Mark, BOM) это непечатный символ Юникода он ничего общего не имеет со стандартом Xml (в описании допустимых символов xml этот символ исключен) и используется исключительно текстовыми редакторами, может отсутствовать даже если файл в кодировке utf-8, но тестовый редактор этого не пометил. Просмотрщик может не отображать этот непечатный символ или отображать квадратик или вопросик вместо него, так что тут 100% наличие не установить. заголовок Код:<?xml version="1.0" encoding="UTF-8"?>
идет непосредственно после метки порядка байтов, так что похоже метка все же есть и она отрезается, иначе бы вышло Код:ml version="1.0" encoding="UTF-8"?>
. Отредактировано пользователем 13 декабря 2018 г. 13:58:26(UTC)
| Причина: Не указана
|
|
|
|
Статус: Новичок
Группы: Участники
Зарегистрирован: 05.09.2019(UTC) Сообщений: 1 
|
Добрый день. при попытке проверить подпись возникает сообщение "Ошибка при вызове метода контекста (VerifyCades): Произошла исключительная ситуация (CAdESCOM.CadesSignedData.1): Cannot find object or property." по какой причине это может происходить?
при попытке сформировать подпись с меткой времени сообщение "Группа или ресурс не находятся в нужном состоянии для выполнения требуемой операции.", сертификат без OСSP(добавил в свойствах), TSP также руками указал.
|
|
|
|
Быстрый переход
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.
Important Information:
The Форум КриптоПро uses cookies. By continuing to browse this site, you are agreeing to our use of cookies.
More Details
Close