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

Уведомление

Icon
Error

Опции
К последнему сообщению К первому непрочитанному
Offline Иван Майер  
#1 Оставлено : 8 июня 2022 г. 7:39:42(UTC)
Иван Майер

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

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

Добрый день!

К нам в организацию поступили подписи которые не удается проверить, хотя до этого проблем с проверкой подписей не испытывали.
Проверку осуществляем через COM интерфейс CAdES.

Есть две подписи подписанные одним сертификатом.
Первая подпись E-182-2021_Sonclusion.pdf_Gabelfeld.sig (4kb) загружен 1 раз(а). проверку проходит успешно.
Вторая подпись conclusion_77d669da-6a0a-4cb1-ab37-7b775d592c18.xml_Gabelfeld.sig (12kb) загружен 0 раз(а). не проходит проверку, выходит ошибка "Элемент не найден".

Обе подписи проверяются КриптоАРМом и "Инструменты КриптоПро" успешно.
КриптоАРМ показывает, что вторая подпись ( conclusion_77d669da-6a0a-4cb1-ab37-7b775d592c18.xml_Gabelfeld.sig (12kb) загружен 0 раз(а).), содержит штамп времени.
Прикладываю отчеты результатов проверки КриптоАРМом обоих подписей:
Result of checking (E-182-2021_Sonclusion.pdf_Gabelfeld.sig).htm (6kb) загружен 0 раз(а).
Result of checking (conclusion_77d669da-6a0a-4cb1-ab37-7b775d592c18.xml_Gabelfeld.sig).htm (12kb) загружен 1 раз(а).

Сами подписываемые файлы к сожалению приложить не могу, но вот хэши по ГОСТ 3411-2012 (256) пожалуйста:
D7579F2C37F49EB9BC99799B9BEF752A81B59E8290F8881CBCA42355F4376C93 для первой подписи E-182-2021_Sonclusion.pdf_Gabelfeld.sig (4kb) загружен 1 раз(а).
39A8A62540A5D08EF9930F25CD12488EA2414D179D35535B28414BA499A90C67 для второй подписи conclusion_77d669da-6a0a-4cb1-ab37-7b775d592c18.xml_Gabelfeld.sig (12kb) загружен 0 раз(а).
Проверка по хешу обе подписи на сайте Госуслуг проходит успешно.
Включил режим логирования и при проверки второй подписи ( conclusion_77d669da-6a0a-4cb1-ab37-7b775d592c18.xml_Gabelfeld.sig (12kb) загружен 0 раз(а).) в логе выводится ошибка "Certificate from certRefs not found".
Прилагаю скрин лога: Log DebugView.png (45kb) загружен 10 раз(а).
Я полагаю, что ошибка возникает еще на этапе чтения файла подписи, еще до проверки сигнатуры.

Прошу помощи. Заранее спасибо!

Код:
Option Explicit
    Const CADESCOM_CADES_BES = &h01 'Тип подписи CAdES BES.   
    
    Dim sourceFile : sourceFile = "conclusion_77d669da-6a0a-4cb1-ab37-7b775d592c18.xml"
    Dim sigFile : sigFile = "conclusion_77d669da-6a0a-4cb1-ab37-7b775d592c18.xml_Gabelfeld.sig"
    
    call VerifySigFile( sourceFile, CADESCOM_CADES_BES, sigFile)

'Функция VerifySigFile проверки файла открепленной подписи
sub VerifySigFile(sourceFile, signType , sigFile)
    Dim Content, Message, SignedData
    
    ' Создание объекта SignedData.
    Set SignedData = CreateObject("CAdESCOM.CadesSignedData")

    ' Загрузка подписанных данных для проверки.
    call LoadBinaryFile(sigFile, Message)  

    ' Загрузка содержимого файла для подписи.
    call LoadBinaryFile(sourceFile, Content)
    SignedData.Content = Content

    ' Проверка подписи по файлу
	On Error Resume Next
        call SignedData.VerifyCades(Message, signType, true)    
        If Err.Number <> 0 Then
            Wscript.Echo "Error (" & Err.Description & " - " & Err.Number & ")"
        else
            Wscript.Echo "Verifed!"
        end if
    On Error Goto 0
	
    ' Проверка подписи по хэшу
    'On Error Resume Next
    '    Dim hashSourceFile: hashSourceFile = "39A8A62540A5D08EF9930F25CD12488EA2414D179D35535B28414BA499A90C67"
    '    Dim HashedData : set HashedData = CreateObject("CAdESCOM.HashedData")
    '    HashedData.Algorithm = 101
    '    HashedData.SetHashValue(hashSourceFile)
    '    call SignedData.VerifyHash(HashedData, Message, signType)
    '    If Err.Number <> 0 Then
    '        Wscript.Echo "Error (" & Err.Description & " - " & Err.Number & ")"
    '    else
    '        Wscript.Echo "Verifed!"
    '    end if
    'On Error Goto 0
	
end sub
 
'Функция LoadBinaryFile читает содержимое бинарного файла
Sub LoadBinaryFile(FileName, Buffer)
    Dim fStream : Set fStream = CreateObject ("ADODB.Stream")
    fStream.Type = 1
    fStream.Mode = 3
    fStream.Open ()
    fStream.LoadFromFile (FileName)
    Buffer = fStream.Read (-1)
End Sub



Offline two_oceans  
#2 Оставлено : 8 июня 2022 г. 10:55:02(UTC)
two_oceans

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

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

Сказал(а) «Спасибо»: 110 раз
Поблагодарили: 397 раз в 367 постах
Добрый день.
По коду меня насторожили 3 момента:
1) желательно перестраховаться и закодировать данные в BASE64 перед присвоением в SignedData.Content, а также выставить кодировку в 1 (сначала кодировку, потом Content). Это предотвращает возможные искажения при передаче между средой где код и плагином.
2) чтение через Adodb.Stream в режиме Binary это та еще рулетка. При каких-то параметрах насколько помню из Adodb.Stream возвращается закодированный бинарный массив, а не сами двоичные данные. Мало что у закодированных данных хэш будет совсем другим (и их надо еще и декодировать), так еще их никуда особенно не присвоишь - тип переменной (внутри типа вариант) просто вырвиглаз какой "оригинальный", что никто кроме Adodb.Stream не умеет с ним работать. Как ни странно звучит, но у меня ASN.1 лучше всего читает через простой текстовый стрим (ниже). На форуме должны быть еще примеры как правильно считывать файл в 1С, которая по сути тот же VB с русским синтаксисом. Ну а я, например, смотрю имя контейнера в name.key вот такой функцией:
Код:
Set FSO=CreateObject("Scripting.FileSystemObject")
Function readBinary(file)
Dim oFile, binFile
  Set oFile = FSO.GetFile(file)
  Set binFile = oFile.OpenAsTextStream()
  readBinary = binFile.Read(oFile.Size)
  binFile.Close
End Function

3) вроде бы некритично, так как по умолчанию должны быть ByRef, но мало ли... если присваиваете аргументу Buffer новое значение внутри процедуры Sub, то желательно убедиться явно, что он объявлен как ByRef Buffer так как изменение значения аргументов ByVal действует только "внутри" процедуры и "наружу" не передается.

Отредактировано пользователем 8 июня 2022 г. 11:37:05(UTC)  | Причина: Не указана

Offline Иван Майер  
#3 Оставлено : 8 июня 2022 г. 12:11:57(UTC)
Иван Майер

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

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

Спасибо за замечания. Но я пока не столкнулся я проблемой чтения файлов. Хэш значение исходного файла я получил как раз при помощи чтения файла через ADODB.Stream, и хочу заметить, что файл подписи и полученный хэш успешно подтверждается на сайте госуслуг. Других мыслей по поводу чтения бинарного файла у меня нет.

Автор: two_oceans Перейти к цитате
Добрый день.
По коду меня насторожили 3 момента:
1) желательно перестраховаться и закодировать данные в BASE64 перед присвоением в SignedData.Content, а также выставить кодировку в 1 (сначала кодировку, потом Content). Это предотвращает возможные искажения при передаче между средой где код и плагином.
2) чтение через Adodb.Stream в режиме Binary это та еще рулетка. При каких-то параметрах насколько помню из Adodb.Stream возвращается закодированный бинарный массив, а не сами двоичные данные. Мало что у закодированных данных хэш будет совсем другим (и их надо еще и декодировать), так еще их никуда особенно не присвоишь - тип переменной (внутри типа вариант) просто вырвиглаз какой "оригинальный", что никто кроме Adodb.Stream не умеет с ним работать. Как ни странно звучит, но у меня ASN.1 лучше всего читает через простой текстовый стрим (ниже). На форуме должны быть еще примеры как правильно считывать файл в 1С, которая по сути тот же VB с русским синтаксисом. Ну а я, например, смотрю имя контейнера в name.key вот такой функцией:
Код:
Set FSO=CreateObject("Scripting.FileSystemObject")
Function readBinary(file)
Dim oFile, binFile
  Set oFile = FSO.GetFile(file)
  Set binFile = oFile.OpenAsTextStream()
  readBinary = binFile.Read(oFile.Size)
  binFile.Close
End Function

3) вроде бы некритично, так как по умолчанию должны быть ByRef, но мало ли... если присваиваете аргументу Buffer новое значение внутри процедуры Sub, то желательно убедиться явно, что он объявлен как ByRef Buffer так как изменение значения аргументов ByVal действует только "внутри" процедуры и "наружу" не передается.

Отредактировано пользователем 8 июня 2022 г. 14:19:05(UTC)  | Причина: Не указана

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