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

Уведомление

Icon
Error

2 Страницы<12
Опции
К последнему сообщению К первому непрочитанному
Offline finex  
#11 Оставлено : 5 апреля 2015 г. 19:10:32(UTC)
finex

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

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

Сказал(а) «Спасибо»: 1 раз
Автор: MCR Перейти к цитате

Не хочется вас расстраивать, но CAPICOM мертв и уже давно.


Тут дело не в том что CAPICOM мертв или жив, а в том что в системе Б для ЭП и шифрования используются алгоритмы понятные(документированные) и доступные, а не написанные "на коленке" для личных нужд и выложенные в сеть, которые потом без задних мыслей перетаскивают к себе в проекты все кому не лень (сам так писал на Делфе и это лишний раз подтверждает боян про льва в клетке).
Мы несколько недель бились чтобы выяснить какой тип ЭП формирует данный алгоритм. Первое время лидировала отсоединенная ЭП, потом все же решили что ЭП присоединена к данным. А на деле вышло что помимо ЭП и шифрования полученные данные + куча атрибутов из сертификата собираются в массив вида Параметр1=Значение1. После этого данные загоняются в строку, но Значениеi перегоняется в строку каждое по своей функции в зависимости от типа Параметраi
Массив для наглядности:
Субъект="CN=Иванов"
Дата="01.02.2015"
Путь_до_файла="C:\temp\123.sig"
Данные = "в формете base64(ЭП+Данные+Шифрование по госту)"
Алгоритм="GOST2001"
и еще куча параметров
Итоговая байтовая строка:
s = SNtoStr(Субъект)+ DToStr(Дата)+ FilePathStr(Путь_до_файла)+EncodStr(Данные)+... еще функции (что там и как преобразуется тоже долго копать)
В итоге строка имеет вид: 4 байта - длинна строки, n-байт строка с данными. опять 4 байта и n-байт данных и так до конца (или до 10 000 символов в формате base64 т.к. поле которое эти данные хранит имеет такую длину)
Offline finex  
#12 Оставлено : 29 апреля 2015 г. 21:28:09(UTC)
finex

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

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

Сказал(а) «Спасибо»: 1 раз
Апну тему.
Основной вопрос по проверке ЭП решили путем переписывания кода шифрации и дешифрации из приложения заказчика в отдельную dll и используя ее функции, но заметили вот какой глюк:
На наших рабочих станциях проверка ЭП проходит "на ура" в обе стороны и в обоих приложениях. Документы созданные в системе А проходт валидацию в системе Б и наоборот, НО в случае работы этой схемы на ПК заказчика в системе А "валидация" не проходит. Проверили на 5 компах везде такая ситуация.
При этом обнаружилось что если открыть оснастку криптопро на ПК заказчика и просмотреть из нее свойства сертификата на токене, после чего запустить наше приложение, то проверка проходит нормально и даже после перезагрузки ситуация не повторяется.
Сертификаты все действительные и пути до УЦ просматриваются. Все сертификаты выданы одним УЦ
Версия крипто про у заказчика 3,6,6497, версия СКЗИ 3,6,3,5359
Версия на наших рабочих станциях 4,0,9330

Еще особенность: до манипуляций с просмотром свойств сертификата в оснастке пытались провести проверку сертификатов на сбербанк-аст. Валидация не проходила, валилось с ошибкой capicom не найден. хотя капиком ставится и регается без ошибок. При этом подписание ЭП в нашем приложении (через capicom) и в приложении заказчика проходит нормально, другие утилиты использующие капиком тоже работают штатно.
Что бы это такое могло быть? Глюк крипто-про, конфликты в ПО или магнитные бури на венере? Буду признателен за любые предположения

Offline Андрей Писарев  
#13 Оставлено : 29 апреля 2015 г. 21:32:40(UTC)
Андрей *

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

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

Сказал «Спасибо»: 621 раз
Поблагодарили: 2397 раз в 1886 постах
Автор: finex Перейти к цитате
Апну тему.
Основной вопрос по проверке ЭП решили путем переписывания кода шифрации и дешифрации из приложения заказчика в отдельную dll и используя ее функции, но заметили вот какой глюк:
На наших рабочих станциях проверка ЭП проходит "на ура" в обе стороны и в обоих приложениях. Документы созданные в системе А проходт валидацию в системе Б и наоборот, НО в случае работы этой схемы на ПК заказчика в системе А "валидация" не проходит. Проверили на 5 компах везде такая ситуация.
При этом обнаружилось что если открыть оснастку криптопро на ПК заказчика и просмотреть из нее свойства сертификата на токене, после чего запустить наше приложение, то проверка проходит нормально и даже после перезагрузки ситуация не повторяется.
Сертификаты все действительные и пути до УЦ просматриваются. Все сертификаты выданы одним УЦ
Версия крипто про у заказчика 3,6,6497, версия СКЗИ 3,6,3,5359
Версия на наших рабочих станциях 4,0,9330

Еще особенность: до манипуляций с просмотром свойств сертификата в оснастке пытались провести проверку сертификатов на сбербанк-аст. Валидация не проходила, валилось с ошибкой capicom не найден. хотя капиком ставится и регается без ошибок. При этом подписание ЭП в нашем приложении (через capicom) и в приложении заказчика проходит нормально, другие утилиты использующие капиком тоже работают штатно.
Что бы это такое могло быть? Глюк крипто-про, конфликты в ПО или магнитные бури на венере? Буду признателен за любые предположения



Если нет примера кода,
Если нет примера файлов с подписями,
Если нет кода и текста ошибки...
Если не уточняете, какой ГОСТ используете ... 3.6 не поддерживает ГОСТ-2012.


Конечно, магнитные бури на венере.

P.S.
Почему используется до сих пор R2? Когда финальная версия 3.6R4 вышла еще в 2013?
Техническую поддержку оказываем тут
Наша база знаний
Offline finex  
#14 Оставлено : 30 апреля 2015 г. 18:28:22(UTC)
finex

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

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

Сказал(а) «Спасибо»: 1 раз
Вот код из dll для проверки подписи (Delphi 7)
Это в юзесах:
Код:
  Windows,
  SysUtils,
  //System,
  Classes,
  GDifUtil in 'GDifUtil.pas',
  GGlbUtil in 'GGlbUtil.pas',  //снять коментарии тут
  GCryApi in 'GCryApi.pas',
  GConsts in 'GConsts.pas',
  md5 in 'md5.pas',
  GWinCryp,
  CryptoUnit,
  CAPICOM_TLB;

Это функция проверки aPStr1 - ЭП, aDat - данные, sSertSN - номер сертификата
Код:


function CheckSignCert(aPStr1: PChar; aSize: Integer; aDat:PChar; dSize:Integer; sSertSN:PChar; sSize:Integer): PChar; stdcall;
var
  s, ss, CertSN: string;
begin
  SetString(Str1, aPStr1, aSize);
  SetString(bStr, aDat, dSize);
  SetString(CertSN, sSertSN, sSize);
  Str2 := 'Не установлен КРИПТО-ПРО';
  if CanCrypto then begin
    try
     { CryptoAPI.SelectCertificate(0, 0, 'Select certificate', 'Certificate:',
      CRYPTUI_SELECT_INTENDEDUSE_COLUMN or CRYPTUI_SELECT_FRIENDLYNAME_COLUMN or
      CRYPTUI_SELECT_LOCATION_COLUMN, 0, 'MY', s);
      CertSN:= CryptoAPI.CertField(s , false, 'SerialNumber');  }
      //StrToFile('c:\temp\Dbufer1.tmp',bStr);
      CryptoAPI.CertVerify(StrToAlg('GOST2001'),
        'MY',
        'MY', bStr,//'c:\temp\Dbufer1.tmp',
        DecodeStr(Str1),
        CertFindCfg('', CertSN, 0, X500Empty, X500Empty),
        CertFindCfg('', CertSN, 0, X500Empty, X500Empty),
        True {(EditCryptSerialNumber.Text <> '')}, False,
        False, False, False, True, False, s, False, nil);
        Str2 := 'Подпись достоверна';
    except
      on E: Exception do
       begin
        Str2 := 'Подпись не достоверна';
        try
          sigData := CoSignedData.Create;
          sigData.Content := bStr;
          sigData.Verify(Str1, true, CAPICOM_VERIFY_SIGNATURE_ONLY);
          Str2 := 'Подпись достоверна';
        except
          on E: Exception do  Str2 := 'Подпись не достоверна';
        end;
      end;
    end;
  end;
  Str2:= Str2 +'@#$';
  aSize := Length(Str2);
  Move(Pointer(Str2)^, Buffer^, ASize);
  Result:= Buffer;
end;

А тут файл и подпись
Гост 2001. Когда писалось ПО заказчика 2012 еще не придумали (2004 год + периодически обновляли путем допила костлей в проге и появления новых требований)
Такая версия 3,6 стоит на всем парке заказчика. Почему не обновлялись, я не могу сказать, возможно что им хватало и этой версии т.к. документы с такими ЭП ходили только "внутри" в качестве доказательства неизменности
Offline Андрей Писарев  
#15 Оставлено : 1 мая 2015 г. 9:02:25(UTC)
Андрей *

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

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

Сказал «Спасибо»: 621 раз
Поблагодарили: 2397 раз в 1886 постах
Автор: finex Перейти к цитате
Вот код из dll для проверки подписи (Delphi 7)
Это в юзесах:
Код:
  Windows,
  SysUtils,
  //System,
  Classes,
  GDifUtil in 'GDifUtil.pas',
  GGlbUtil in 'GGlbUtil.pas',  //снять коментарии тут
  GCryApi in 'GCryApi.pas',
  GConsts in 'GConsts.pas',
  md5 in 'md5.pas',
  GWinCryp,
  CryptoUnit,
  CAPICOM_TLB;

Это функция проверки aPStr1 - ЭП, aDat - данные, sSertSN - номер сертификата
Код:


function CheckSignCert(aPStr1: PChar; aSize: Integer; aDat:PChar; dSize:Integer; sSertSN:PChar; sSize:Integer): PChar; stdcall;
var
  s, ss, CertSN: string;
begin
  SetString(Str1, aPStr1, aSize);
  SetString(bStr, aDat, dSize);
  SetString(CertSN, sSertSN, sSize);
  Str2 := 'Не установлен КРИПТО-ПРО';
  if CanCrypto then begin
    try
     { CryptoAPI.SelectCertificate(0, 0, 'Select certificate', 'Certificate:',
      CRYPTUI_SELECT_INTENDEDUSE_COLUMN or CRYPTUI_SELECT_FRIENDLYNAME_COLUMN or
      CRYPTUI_SELECT_LOCATION_COLUMN, 0, 'MY', s);
      CertSN:= CryptoAPI.CertField(s , false, 'SerialNumber');  }
      //StrToFile('c:\temp\Dbufer1.tmp',bStr);
      CryptoAPI.CertVerify(StrToAlg('GOST2001'),
        'MY',
        'MY', bStr,//'c:\temp\Dbufer1.tmp',
        DecodeStr(Str1),
        CertFindCfg('', CertSN, 0, X500Empty, X500Empty),
        CertFindCfg('', CertSN, 0, X500Empty, X500Empty),
        True {(EditCryptSerialNumber.Text <> '')}, False,
        False, False, False, True, False, s, False, nil);
        Str2 := 'Подпись достоверна';
    except
      on E: Exception do
       begin
        Str2 := 'Подпись не достоверна';
        try
          sigData := CoSignedData.Create;
          sigData.Content := bStr;
          sigData.Verify(Str1, true, CAPICOM_VERIFY_SIGNATURE_ONLY);
          Str2 := 'Подпись достоверна';
        except
          on E: Exception do  Str2 := 'Подпись не достоверна';
        end;
      end;
    end;
  end;
  Str2:= Str2 +'@#$';
  aSize := Length(Str2);
  Move(Pointer(Str2)^, Buffer^, ASize);
  Result:= Buffer;
end;

А тут файл и подпись
Гост 2001. Когда писалось ПО заказчика 2012 еще не придумали (2004 год + периодически обновляли путем допила костлей в проге и появления новых требований)
Такая версия 3,6 стоит на всем парке заказчика. Почему не обновлялись, я не могу сказать, возможно что им хватало и этой версии т.к. документы с такими ЭП ходили только "внутри" в качестве доказательства неизменности



Код ни о чём.
Нужно:
типы и значения переменных до передачи в CAPICOM
что делается после подписания с данными (сама подпись), как записывается в файл.

Во вложении подпись не CMS.
Техническую поддержку оказываем тут
Наша база знаний
Offline Андрей Писарев  
#16 Оставлено : 1 мая 2015 г. 9:03:49(UTC)
Андрей *

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

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

Сказал «Спасибо»: 621 раз
Поблагодарили: 2397 раз в 1886 постах
Берётся пример из SDK, полчаса...\час...\ день.
И у Вас готово ПО.
Вместо этого - своя специфика с кучей "ненужных модулей".
Техническую поддержку оказываем тут
Наша база знаний
Offline finex  
#17 Оставлено : 1 мая 2015 г. 15:48:57(UTC)
finex

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

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

Сказал(а) «Спасибо»: 1 раз
Автор: Андрей * Перейти к цитате

Код ни о чём.
Нужно:
типы и значения переменных до передачи в CAPICOM
что делается после подписания с данными (сама подпись), как записывается в файл.

Во вложении подпись не CMS.


Код "на коленке" и он работает в контексте задачи.

Данные собираются в файл. Файл перегоняется в строку base64. Полученная строка передается в функцию первый параметром. Вторым параметром передается номер сертификата. Дальше кусок уличной магии из перечня модулей указанных выше и полученные данные возвращаются в виде base64
Уличная магия заключается в том что модули не документированные и тему я начал именно из-за этого, т.к. эти модули входят в состав библиотеки allLib которую досих пор на некоторых форумах рекомендуют для работы с ЭП ретрограды использующие Delphi 7.

Подпись не CMS по этой же причине
Offline finex  
#18 Оставлено : 1 мая 2015 г. 15:52:47(UTC)
finex

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

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

Сказал(а) «Спасибо»: 1 раз
Автор: Андрей * Перейти к цитате

Вместо этого - своя специфика с кучей "ненужных модулей".


Специфика не своя, а навязанная заказчиком. перестраивать механизм подписания никто не будет. а уж менять его почти на 2000 клиентских местах и подавно. Учитывая то что пересылка таких подписей требуется на период перехода на наше ПО
Offline Андрей Писарев  
#19 Оставлено : 2 мая 2015 г. 10:40:57(UTC)
Андрей *

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

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

Сказал «Спасибо»: 621 раз
Поблагодарили: 2397 раз в 1886 постах
Автор: finex Перейти к цитате
т.к. эти модули входят в состав библиотеки allLib которую досих пор на некоторых форумах рекомендуют для работы с ЭП ретрограды использующие Delphi 7.

Подпись не CMS по этой же причине


Понятно...

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