Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

PGP подпись через HTTPS (Indy) [D7, XP]


vegarulez ©   (2008-05-25 19:05:00) 

Привет всем Мастерам!
Столкнулся с такой проблеммой - уже как то описывал эту ситуацию... месяца 3-4 назад. Но тогда не было ни рабочего хтмл варианта того - о чём хочу спросить и с сервером проблематика была. Посему тогда разговор зашёл в тупик.

Вопрос заключается в следующем. Пытаюсь с помощью делфи отправить запрос к серверу через HTTPS, но в теле запроса содержится PGP подпись данных, коотрые посылаю. И она "косячится" входе передачи + возможно косячятся и частично какие - либо другие данные , например русские буквы. Т.е. под словом "косячаться", я имею ввиду кодируются неверно (судя по всему). Во всяком случае сервер пишет, что ошибочна именно подпись. Посмотрев это на Indy10 (примеры приложены ниже) я убедился что она действительно урленкодится, но видимо не так как нужно.

И сделал для тестирования рабочий тестовый вариант хтмл файла.
вот код РАБОЧЕГОварианта html файла:
  <form action="https://bo-demo01.yamoney.ru/demo/paywell/transferagent.asp"
                        method="post" >
                       
<input type="hidden" name="Version" value="2.01">                        
<input type="hidden" name="TR_NR" value="126">                        
<input type="hidden" name="DSTACNT_NR" value="410037637381">                        
<input type="hidden" name="TR_AMT" value="6.05">                        
<input type="hidden" name="CUR_CD" value="10643">                        
<input type="hidden" name="ACT_CD" value="1">                        
<input type="hidden" name="CONT" value="Иванов Иван Иванович">                        
<input type="hidden" name="SIGN" value="-----BEGIN PGP MESSAGE-----
Version: PGP 6.5.8

owEBWwGk/okBFQMFAEg5G9NTVL2hVupyiQEBSiYIAJg38k/9M0U5NJBVZ0HdANxD
EZva1ewzBzcO/oWXwcQkIdcSYgBdlhddxr7H435Zr1/0gCysqxQdeBszNb7K+fiz
1SNdQyONWlRuvuzHORTuZPMT4YLfqNH675mjMBbGbO2x7xDgfZE+cMFpVPSnALeQ
PzuUuUsc6+CPIgCUdmlgZgbgfjepxCH4n9dhznOmfx2YSg1fl1I9O/PNxWk7spLu
06YCH0FUCwvICV2oHP5qnyZA3Pukj07L4e0cXj/IQYIgHMIgvYYxUaCPD/cY7qN0
luAKNCQfAyNiHZXncerhS+vzaunsKN74HXLKz/FxtcR0l8+y7sFQaZPqXMU40Q+s
QWIJdGVzdDYudHh0AAAAADEyNiYxJjQxMDAzNzYzNzM4MSY2LjA1JjEwNjQzJsji
4O3u4iDI4uDtIMji4O3u4uj3
=/Q+S
-----END PGP MESSAGE-----">      

   <br> Запрос на Яндекс
  <br><input type="submit" value="Запрос">
  </form>


Я пытаюсь тоже самое сделать с помощью делфи. Используя готовую демку по Indy, вот что у меня получилось, там по 500кб(закачаю на zalil.ru):

D6 + Indy 8:
http://slil.ru/25826843

D7 + Indy 10:
http://slil.ru/25826847

Помогите - как правильно передать этот массив данных, чтобы он дошёл до получателя в таком же виде как я его отправляю с хтмл файла. Уже всю голову сломал.


Palladin   (2008-06-02 11:15:00) [1]

Var
s:TStringList;

s.Text:=
'?Version=2.01'+
'&TR_NR=126'+
'&DSTACNT_NR=410037637381'+
'&TR_AMT=6.05'+
'&CUR_CD=10643'+
'&ACT_CD=1'+
'&CONT=Иванов Иван Иванович'+
'&SIGN='+TIdURI.ParamsEncode(
 '-----BEGIN PGP MESSAGE-----'#10#13+
 'Version: PGP 6.5.8'#10#13+
 #10#13+
 'owEBWwGk/okBFQMFAEg5G9NTVL2hVupyiQEBSiYIAJg38k/9M0U5NJBVZ0HdANxD'#10#13+
 'EZva1ewzBzcO/oWXwcQkIdcSYgBdlhddxr7H435Zr1/0gCysqxQdeBszNb7K+fiz'#10#13+
 '1SNdQyONWlRuvuzHORTuZPMT4YLfqNH675mjMBbGbO2x7xDgfZE+cMFpVPSnALeQ'#10#13+
 'PzuUuUsc6+CPIgCUdmlgZgbgfjepxCH4n9dhznOmfx2YSg1fl1I9O/PNxWk7spLu'#10#13+
 '06YCH0FUCwvICV2oHP5qnyZA3Pukj07L4e0cXj/IQYIgHMIgvYYxUaCPD/cY7qN0'#10#13+
 'luAKNCQfAyNiHZXncerhS+vzaunsKN74HXLKz/FxtcR0l8+y7sFQaZPqXMU40Q+s'#10#13+
 'QWIJdGVzdDYudHh0AAAAADEyNiYxJjQxMDAzNzYzNzM4MSY2LjA1JjEwNjQzJsji'#10#13+
 '4O3u4iDI4uDtIMji4O3u4uj3'#10#13+
 '=/Q+S'#10#13+
 '-----END PGP MESSAGE-----');
IdHTTP1.HTTPOptions:=IdHTTP1.HTTPOptions-[hoForceEncodeParams];
IdHTTP1.Post(url,s)


пробуй


vegarulez   (2008-06-02 10:57:00) [2]

Народ... ну кто что посоветует.
Как поступить, что +-сы не затирались? Нид Хелп!


vegarulez   (2008-05-29 10:58:00) [3]

то бишь application/x-www-form-urlencoded


vegarulez   (2008-05-28 18:17:00) [4]

Palladin ©   (28.05.08 16:57) [15]

idHTTP.pas

procedure TIdCustomHTTP.Post(AURL: string; ASource: TIdStrings; AResponseContent: TIdStream);
var
 LParams: TIdStream;
begin
 Assert(ASource<>nil);
 Assert(AResponseContent<>nil);

 // Usual posting request have default ContentType is application/x-www-form-urlencoded
 if (Request.ContentType = '') or (TextIsSame(Request.ContentType, 'text/html')) then {do not localize}
   Request.ContentType := 'application/x-www-form-urlencoded'; {do not localize}

 LParams := TIdStringStream.Create(SetRequestParams(ASource));
 try
   Post(AURL, LParams, AResponseContent);
 finally
   Sys.FreeAndNil(LParams);
 end;
end;


Palladin   (2008-05-28 16:57:00) [5]

а Content-Type у тебя какой, надеюсь application/x-www-form-urlencoded ? хотя уже сомневаюсь, звиняюсь что не сначала прочел, ForceEncodeParams вернуть нужно


vegarulez   (2008-05-28 16:46:00) [6]

Reindeer Moss Eater ©   (28.05.08 15:27) [11]
так, ты погляди - она сверху представлена - она и так в текстовом.

Reindeer Moss Eater ©   (28.05.08 15:27) [12]
не совсем понял...

Palladin ©   (28.05.08 15:32) [13]
убрал  - не помогает.


Palladin   (2008-05-28 15:32:00) [7]


> vegarulez   (28.05.08 15:26) [10]

убери из TIdHTTP.HTTPOptions флаг hoForceEncodeParams


Reindeer Moss Eater   (2008-05-28 15:27:00) [8]

Либо кодируй двоичку в base64


Reindeer Moss Eater   (2008-05-28 15:27:00) [9]

Экспортируй ЭЦП в текстовом формате


vegarulez   (2008-05-28 15:26:00) [10]

ну тото и оно что он режет "+" в любом виде....


Ega23   (2008-05-28 14:41:00) [11]

Я что0то не пойму: а какая разница, в каком виде через Post прогонять? Там же тупо бинарный буфер идёт... Это для Get-запроса важно...


vegarulez   (2008-05-28 13:51:00) [12]

Вообщем я практически решил проблему - осталась проблема со знаком +
при передачи строки хоть он явно обозначен как +, хоть через #43 как показано ниже, но на сервер приходит в этом месте пробел. Т.е. я так полагаю при выполнении   HTTP.Post(cbURL.Text, MyList, Response); он заменяется на пробел и на сервер уже не приходит. Как быть?

             MyList.Add('Version=2.01');
             MyList.Add('TR_NR=126');
             MyList.Add('DSTACNT_NR=410037637381');
             MyList.Add('TR_AMT=6.05');
             MyList.Add('CUR_CD=10643');
             MyList.Add('ACT_CD=1');
             MyList.Add('CONT=Иванов Иван Иванович');
             MyList.Add('SIGN=-----BEGIN PGP MESSAGE-----'#10#13
+ 'Version: PGP 6.5.8'#10#13
+ #10#13
+ 'owEBWwGk/okBFQMFAEg5G9NTVL2hVupyiQEBSiYIAJg38k/9M0U5NJBVZ0HdANxD'#10#13
+ 'EZva1ewzBzcO/oWXwcQkIdcSYgBdlhddxr7H435Zr1/0gCysqxQdeBszNb7K'+#43+'fiz'#10#13
+ '1SNdQyONWlRuvuzHORTuZPMT4YLfqNH675mjMBbGbO2x7xDgfZE'+#43+'cMFpVPSnALeQ'#10#13
+ 'PzuUuUsc6'+#43+'CPIgCUdmlgZgbgfjepxCH4n9dhznOmfx2YSg1fl1I9O/PNxWk7spLu'#10#13
+ '06YCH0FUCwvICV2oHP5qnyZA3Pukj07L4e0cXj/IQYIgHMIgvYYxUaCPD/cY7qN0'#10#13
+ 'luAKNCQfAyNiHZXncerhS'+#43+'vzaunsKN74HXLKz/FxtcR0l8'+#43+'y7sFQaZPqXMU40Q'+#43+'s'#10#13
+ 'QWIJdGVzdDYudHh0AAAAADEyNiYxJjQxMDAzNzYzNzM4MSY2LjA1JjEwNjQzJsji'#10#13
+ '4O3u4iDI4uDtIMji4O3u4uj3'#10#13
+ '=/Q'+#43+'S'#10#13
+ '-----END PGP MESSAGE-----');
             HTTP.Post(cbURL.Text, MyList, Response);


vegarulez   (2008-05-28 10:40:00) [13]

А в моём примере к result`у функции % никоим образом пришить не получится. мне просто интересно  в целях ликбеза. Уже и chr(25) прбовал и просто '%' всё равно не получается - и немогу поянть почему. вроде же описании функции StreamToHex стринг возращает и именно стриг и не могу получить на выходе (
помогите с ликбезом.


Ega23   (2008-05-28 09:41:00) [14]

Взято из FGInt.pas  поищи его в сети, там этих функций-конвертеров много.


Procedure ConvertBase256StringToHexString(Str256 : String; Var HexStr : String);
Var
  i : longint;
  b : byte;
Begin
  HexStr := '';
  For i := 1 To length(str256) Do
  Begin
     b := ord(str256[i]);
     If (b Shr 4) < 10 Then HexStr := HexStr + chr(48 + (b Shr 4))
     Else HexStr := HexStr + chr(55 + (b Shr 4));
     If (b And 15) < 10 Then HexStr := HexStr + chr(48 + (b And 15))
     Else HexStr := HexStr + chr(55 + (b And 15));
  End;
End;


vegarulez   (2008-05-28 06:13:00) [15]

Код перегонки нашёл - сделал перегоняет. но там нужно наверно пробел допустим кодировать %20, т.е. в результат добавить символ %
А у меня чото никак не получается к Result функции прибавить знак % - пишет типа Char и ShortString. Подскажите как правильно это сделать.

// Перегонка бинарного потока в строку с HEX-текстом

function StreamToHex(Buf: TStream): string;
const
 Convert: array[0..15] of Char = '0123456789ABCDEF';
var
 i, p: integer;
 B: byte;
begin
 SetLength(Result, Buf.Size * 2);
 p := Buf.Position;
 Buf.Position := 0;
 for i := 1 to Buf.Size do
 begin
   Buf.Read(B, 1);
   Result[(i * 2) - 1] := Convert[B shr $4];
   Result[(i * 2)] := Convert[B and $F];
 end;
 Buf.Position := p;
end;

procedure TForm1.Txt_HexClick(Sender: TObject);
var
 St: TStream;
begin
 St := TMemoryStream.Create;
 Memo1.Lines.SaveToStream(St);
 Memo2.Text := StreamToHex(St);
 St.Destroy;
end;


  (2008-05-26 23:40:00) [16]

Удалено модератором


Ega23   (2008-05-26 11:29:00) [17]

Попробуй переведи её из Base64 в HexString


vegarulez   (2008-05-26 10:59:00) [18]

Взял лог с сервера - получается, так что при отправке в подписи прога заменяет символы "+" на пробелы... т.е. на сервак битая подпись приходит...
чешу репу дальше... у кого какие мысли как этого избежать?...


vegarulez   (2008-05-26 06:47:00) [19]

Народ нид хелп!


Наверх

Титульная страница Поиск, карта сайта Написать письмо