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

Уведомление

Icon
Error

3 Страницы<123>
Опции
К последнему сообщению К первому непрочитанному
Offline slavw  
#21 Оставлено : 27 февраля 2015 г. 7:45:33(UTC)
slavw

Статус: Активный участник

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

Сказал(а) «Спасибо»: 1 раз
Поблагодарили: 18 раз в 12 постах
для <SignedInfo> расчитывается уже не хеш! а ПОДПИСЬ....
Offline smev  
#22 Оставлено : 27 февраля 2015 г. 7:50:17(UTC)
smev

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

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

да вы правы я не так написал. А по сути то какие варианты как это сделать?
Offline slavw  
#23 Оставлено : 27 февраля 2015 г. 7:56:00(UTC)
slavw

Статус: Активный участник

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

Сказал(а) «Спасибо»: 1 раз
Поблагодарили: 18 раз в 12 постах
посмотрите выше, я в этой теме полностью приводил исходный код своей процедуры.. сообщения #10 и #11
если там что то непонятное, спрашивайте...
Offline slavw  
#24 Оставлено : 2 марта 2015 г. 12:07:03(UTC)
slavw

Статус: Активный участник

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

Сказал(а) «Спасибо»: 1 раз
Поблагодарили: 18 раз в 12 постах
Модуль для канонизации XML (Delphi XE7) во вложении.

Пример вызова:

Код:

procedure TForm3.Button12Click(Sender: TObject);
var NameSpaces:TStrings;
begin
  NameSpaces:=TStringList.Create;
  try
    NameSpaces.Values['mes1']:='http://roskazna.ru/gisgmp/xsd/116/MessageData';
    TFile.WriteAllText('C:\1ac.xml',
      XMLCanonicalize(TFile.ReadAllText('C:\1a.xml',TEncoding.UTF8),NameSpaces),TEncoding.UTF8);
  finally
    NameSpaces.Free;
  end;
end;


или (в реально работающем коде):

Код:

var
  SignedInfo: string;
  DataStream: TStream;
  ...
  
begin
DataStream:=TStringStream.Create(XMLCanonicalize(SignedInfo,'ds=http://www.w3.org/2000/09/xmldsig#'),TEncoding.UTF8);

Отредактировано пользователем 2 марта 2015 г. 12:31:50(UTC)  | Причина: Не указана

Вложение(я):
uXMLHelper.zip (2kb) загружен 134 раз(а).

У Вас нет прав для просмотра или загрузки вложений. Попробуйте зарегистрироваться.
thanks 2 пользователей поблагодарили slavw за этот пост.
MCR оставлено 02.03.2015(UTC), boblan оставлено 23.08.2018(UTC)
Offline smev  
#25 Оставлено : 4 марта 2015 г. 10:51:36(UTC)
smev

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

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

Привет с канонизамцией и подписанием все получилось удачно :)
Я смогу потом написать как я это сделал.

Но у меня возникла новая проблемка. Я не могу отправить запрос на сервис СМЭВ.
Я пишу подобный код как сдесь http://www.cryptopro.ru/...sts&t=8136#post52570

И получаю ту самую ошибку 500 !
Ничего не пойму????
Чего не хватает , хедеров в WebRequest или чего еще?

Подскажи как ты реализуеш отправку и получение запросов в своей реализации?
Пришли пример кода?
Offline slavw  
#26 Оставлено : 4 марта 2015 г. 11:25:53(UTC)
slavw

Статус: Активный участник

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

Сказал(а) «Спасибо»: 1 раз
Поблагодарили: 18 раз в 12 постах
с этим у меня проблем не возникало:
Код:

function SoapSendMessage(SoapRequest: string): IXMLDocument;
var
  Request: TStringStream;
  Response: TMemoryStream;
begin
  Response:=TMemoryStream.Create;
  Request:=TStringStream.Create(SoapRequest,TEncoding.UTF8);
  with THTTPReqResp.Create(nil) do
  try
    URL:=ServiceURL;
    Execute(Request,Response);
    Result:=NewXMLDocument;
    Result.LoadFromStream(Response);
  finally
    Free;
    Request.Free;
    Response.Free;
  end;
end;
Offline smev  
#27 Оставлено : 4 марта 2015 г. 11:42:36(UTC)
smev

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

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

так просто?
а на сишарпе есть примеры ?

я посмотрел примеры по твоей компоненте:
народ выставляет хедеры в запросе....

1. Content-Type: text/xml; charset=utf-8
2. HTTPReqResp1.SoapAction := '"http://schemas.microsoft.com/exchange/services/2006/messages/ResolveNames"';
3. HTTPReqResp1.URL := 'https://webmail.mailserver.nl/ews/exchange.asmx';

подскажи какой ты выставялеш SoapAction в рамках СМЭВ ?? как его правильно написать?
какие хедеры ты выставляеш перед запросом?

Отредактировано пользователем 4 марта 2015 г. 12:27:03(UTC)  | Причина: Не указана

Offline slavw  
#28 Оставлено : 4 марта 2015 г. 12:58:31(UTC)
slavw

Статус: Активный участник

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

Сказал(а) «Спасибо»: 1 раз
Поблагодарили: 18 раз в 12 постах
все что я делаю с компонентом THTTPReqResp я показал, больше ничего у него не указываю... все по-умолчанию...
только URL:=ServiceURL;
Offline ODG  
#29 Оставлено : 16 октября 2015 г. 11:06:33(UTC)
ODG

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

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

Автор: slavw Перейти к цитате
Я не утвержаю, что в Delphi нет средств для каноникализации XML... я констатирую этот факт. Если у кого то есть сомнения по этому поводу, что ж...
Можно написать и самому, но для этого надо знать как оно должно работать... именно с этой целью я и выложил программу c14n.exe... если вы не сможете вручную преобразовать XML к каноническому виду, то тем более не сможете "научить" этому свою процедуру...
А исходники конечно будут, если будет интерес к этому вопросу...
но не будет толка от процедур для получения хеша и подписи пока не будет возможности передать им "нужный" XML...


После прочтения утверждения Slavw специально провел тестирование основных парсеров для среды Delphi XE4-XE5 на основе примеров приведенных на сайте http://www.w3.org/TR/xml-c14n11/:
- MSXML2_TLB - методов каноникализации для среды нет;
- Встроенные средства Delphi (компонент TXMLDocument)- методов каноникализации нет;
- Библиотека NativeXML - средства каноникализации к виду с14n есть, но тестирование по примерам не проходит (подробности опускаю, можете сами протестировать);
- libxml2 - средства каноникализации к виду с14n есть, но тестирование по примерам не проходит.
- uXMLHelper от slavw канонизирует XML, но тестирование по примерам, указанным в рекомендациях консорциума W3C Canonical c14n показало также многие несоответствия.

В результате пришел к выводу - 100% согласен с утверждением "в Delphi нет средств для каноникализации XML... ". По крайней мере в соответствии с рекомендациями консорциума.

Полное соответствие дает каноникализация в программе c14n.exe (текст ), причем если в C# используются версия FrameWork 3.5 и ниже, то полного соответствия также нет (если в XML используются ссылки на несуществующие файлы). Так, что необходима версия FrameWork 4.0 и выше.

В Delphi можно использовать средства, применяемые для каноникализации XML к виду c14n в C#.
Для этого с помощью MS VS создать DLL с COM интерфейсом. В DLL используется единственная функция для каноникализации XML, например:

private XmlDsigExcC14NTransform xmlTransform;

public string[] TransformStringToC14n(string Input)
{
xmlTransform = new XmlDsigExcC14NTransform(false);
XmlDocument xmlDocument = new XmlDocument();
xmlDocument.PreserveWhitespace = true;

xmlDocument.LoadXml(Input.Replace("\r\n", '\n'.ToString()));
xmlTransform.LoadInput((object)xmlDocument);
return Encoding.UTF8.GetString(((System.IO.MemoryStream)xmlTransform.GetOutput()).ToArray()).Split('\n');
}
У нас DLL после компиляции в MS VS 2015 имеет размер 6144 байт )))

Далее необходимо зарегистрировать COM объект в системе, где установлена Delphi среда, да и вообще где будет проводиться каноникализация с использованием этой DLL.
Делается это просто: утилита из состава MS FrameWork Regasm.exe.
Выполняется так:
- запустить командную строку в режиме Администратор;
- перейти в директорию, содержащую DLL Com объекта.
- выполнить команду: c:\Windows\Microsoft.NET\Framework\v4.0.30319\regasm.exe canonicalization_c14n_4.5.dll /tlb
Данная команда выполняет регистрацию COM объекта в системе Windows, а также создает библиотеку описания типов canonicalization_c14n_4.5.tlb, котарая необходима для генерации библиотеки типов в Delphi.
- В среде Delphi необходимо сгенерировать библиотеку типов canonicalization_c14n_4.5_tlb.pas
Для этого необходимо выполнить команду меню Component - Import Component - Import a Type Library.
Выбрать из списка необходимую библиотеку типов (в нашем случае canonicalization_c14n_4.5) и импортировать ее. В результате будет создан canonicalization_c14n_4.5_tlb.pas, который помещается в каталог среды Imports.
- В модуле рабочего проекта подключить canonicalization_c14n_4.5_tlb.pas в Uses и воспользоваться функцией каноникализации в Delphi:

procedure TForm3.Button2Click(Sender: TObject);
var ;
Canonicalization_c14n:TransformToC14n;
xml_C14n:PSafeArray;
begin
Canonicalization_c14n:= CoTransformToC14n.Create;
xml_C14n:=Canonicalization_c14n.TransformStringToC14n(XMLDoc.xml);
end;

- Тип PSafeArray переводится в String просто:

...
var index, Count, Max:integer;
str:string;
getResult : HRESULT;


Count:=SafeArrayGetDim(xml_C14n);
SafeArrayGetUBound(xml_C14n, Count, Max);
for index:=0 to Max do begin
getResult:=SafeArrayGetElement(xml_C14n, Index, str);
case getResult of
S_OK : ShowMessage('Success.');
DISP_E_BADINDEX : ShowMessage('The specified index was invalid.');
E_INVALIDARG : ShowMessage('One of the arguments is invalid.');
E_OUTOFMEMORY : ShowMessage('Memory could not be allocated for the element.');
end;
Memo2.Lines.Add(str); //Вывод каждой строки в Memo компонент.
end;


Вот собственно и все. Каноникализация будет проходить в полном соответствии с рекомендациями w3c.



Offline slavw  
#30 Оставлено : 16 октября 2015 г. 11:26:00(UTC)
slavw

Статус: Активный участник

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

Сказал(а) «Спасибо»: 1 раз
Поблагодарили: 18 раз в 12 постах
как это ни парадоксально звучит, но нам не нужна каноникализация в полном соответствии с рекомендациями w3c.
нам нужна именно та каноникализация, которую использует у себя СМЭВ... зависит от того, какой библиотекой пользуются там...
поэтому... на данный момент uXMLHelper работает так как надо...
Offline ODG  
#31 Оставлено : 16 октября 2015 г. 11:46:04(UTC)
ODG

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

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

Я не спорю, uHelper работает, я просто искал стандартное средство в делфи. Жаль что не нашел. Поэтому буду пользоваться uHelper или COM объектом для доступа к средствам FrameWork. Второй вариант имеет плюсы и минусы: плюс - не надо вдаваться в подробности стандарта, минус - установка FrameWork 4 и выше.
Offline slavw  
#32 Оставлено : 16 октября 2015 г. 12:42:53(UTC)
slavw

Статус: Активный участник

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

Сказал(а) «Спасибо»: 1 раз
Поблагодарили: 18 раз в 12 постах
вы молодец... такое исследование провели...
uXMLHelper написан просто и, конечно, некоторые особенности формата XML не учитывает...
но если без изворотов, то все нормально...
thanks 1 пользователь поблагодарил slavw за этот пост.
isafar оставлено 10.12.2015(UTC)
Offline slavw  
#33 Оставлено : 15 декабря 2015 г. 12:44:44(UTC)
slavw

Статус: Активный участник

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

Сказал(а) «Спасибо»: 1 раз
Поблагодарили: 18 раз в 12 постах
модуль uCryptHelper.pas ищите в теме "Delphi и TSP"
Offline Kamakina  
#34 Оставлено : 13 января 2016 г. 17:35:22(UTC)
Kamakina

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

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

Сказал(а) «Спасибо»: 1 раз
Сформированный запрос (исключительно с помощью кода, выложенного уважаемым slavw) отправила на тестовый сервис ГИСГМП.
Беру ответный XML и :
- Выделила сертификат СМЭВ, декодировала и записала в xsmev.cer
- Выделила SignatureValue, декодировала, перевернула и записала в SignatureValue
- Выделила SignedInfo и записала в файл
Проверяю:
csptest -keyset -verify GOST -in SignedInfo -signature SignatureValue -certificate -xsmev.cer -keytype exchange -verifycontext >signYN
Содержимое signYN:



Готова ответить на любые уточнения.
Что я делаю не так? Помогите.
Offline slavw  
#35 Оставлено : 13 января 2016 г. 18:54:52(UTC)
slavw

Статус: Активный участник

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

Сказал(а) «Спасибо»: 1 раз
Поблагодарили: 18 раз в 12 постах
вы хотите проверить подпись ответа..? я лично этим не занимался... я тут не помогу... я "забил" на эту проверку... получил ответ и извлек из него результат...
Offline Андрей Писарев  
#36 Оставлено : 13 января 2016 г. 20:46:30(UTC)
Андрей Писарев

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

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

Сказал «Спасибо»: 276 раз
Поблагодарили: 1144 раз в 908 постах
Автор: Kamakina Перейти к цитате
Сформированный запрос (исключительно с помощью кода, выложенного уважаемым slavw) отправила на тестовый сервис ГИСГМП.
Беру ответный XML и :
- Выделила сертификат СМЭВ, декодировала и записала в xsmev.cer
- Выделила SignatureValue, декодировала, перевернула и записала в SignatureValue
- Выделила SignedInfo и записала в файл
Проверяю:
csptest -keyset -verify GOST -in SignedInfo -signature SignatureValue -certificate -xsmev.cer -keytype exchange -verifycontext >signYN
Содержимое signYN:



Готова ответить на любые уточнения.
Что я делаю не так? Помогите.


Прикрепив исходные данные(ответ сервиса), увеличите вероятность помощи.
Техническую поддержку оказываем тут
Наша база знаний
Offline Kamakina  
#37 Оставлено : 18 января 2016 г. 9:30:34(UTC)
Kamakina

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

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

Сказал(а) «Спасибо»: 1 раз
Автор: slavw Перейти к цитате
вы хотите проверить подпись ответа..? я лично этим не занимался... я тут не помогу... я "забил" на эту проверку... получил ответ и извлек из него результат...


вариант "забить" тоже сначала показался приемлемым, но принято решение проверять подпись ответа.

Автор: Андрей * Перейти к цитате

Прикрепив исходные данные(ответ сервиса), увеличите вероятность помощи.


привожу исходные данные в порядок, обязательно выложу.


Offline Kamakina  
#38 Оставлено : 20 января 2016 г. 15:54:28(UTC)
Kamakina

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

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

Сказал(а) «Спасибо»: 1 раз
Возникла новая проблема.

На входе имеем xml-документ input.xml (3kb) загружен 9 раз(а). с множественным элементом "ns4:parameters" с соответствующим пространством имен (в данном случае таких элементов 3).
При вызове получаю ошибку "Не определено пространство имен 'ns4'" во 2-ом и 3-ем элементах ns4:parameters, т. к. после каноникализации объявление пространства имен ns4 переносится из элемента верхнего уровня MessageData и остается только в 1-ом parameters.
Каноникализирую функцией XMLCanonicalize ( pascode.txt (1kb) загружен 24 раз(а).).
результат input-func.xml (3kb) загружен 5 раз(а).

Решила пропустить тот же xml через c14n.exe
результат input-c14n.xml (3kb) загружен 5 раз(а).

Получилось иначе. Все пространства имен сохранены и нет символов &#xD;

чем вызвана разница результатов?

P.S.
Автор: slavw Перейти к цитате

2.и пр.имен и атрибуты должны быть упорядочены по алфавиту (xmlns:ds5 должен идти позже чем все остальные, которые останутся, xmlns:ds6 исчезнет совсем п.3)

Попытка каноникализировать выстроенные по алфавиту пространства имен ничего не изменила

Отредактировано пользователем 20 января 2016 г. 17:03:06(UTC)  | Причина: Не указана

Offline volchik  
#39 Оставлено : 27 мая 2016 г. 9:19:55(UTC)
volchik

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

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

Помогите разобраться, хочу вычислить хэш примера.
Привел к каноническому виду и вычисляю хэш утилитами:

cpverify.exe -mk canonic.xml
8C1E9E928815EDF62E9E38165BE342A73C6B4D3ECB2D9DF693BBEDF96F4C53C4

rhash --gost-cryptopro canonic.xml
c8e1e9298851de6fe2e98361b53e247ac3b6d4e3bcd2d96f39bbde9ff6c4354c canonic.xml

gostsum.exe canonic.xml
e1836036245974cd1ffa339c7aca017ba67a44fe67fa5fb4222c0a54a9df1d4b canonic.xml

в зависимости от наличия в конце строки 13 символа эти утилиты дают попарно похожие результаты,
то cpverify.exe и rhash совпадают,
то rhash и gostsum.exe совпадают

canonic.xml (4kb) загружен 8 раз(а).
Offline volchik  
#40 Оставлено : 31 мая 2016 г. 13:02:14(UTC)
volchik

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

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

Сам отвечу на свой вопрос:
т.к. указано


то в корневой узел нужно включить пространства имен rev wsu,
пространства имен выводить до списка параметров, вывод отсортирован по алфавиту.
Перенос строк это символ 0x0A, поэтому убираем символ 0x0D

вот результат
BodyContext.xml (4kb) загружен 26 раз(а).

Отредактировано пользователем 31 мая 2016 г. 13:56:39(UTC)  | Причина: Не указана

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