Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2008.06.29;
Скачать: CL | DM;

Вниз

PGP подпись через HTTPS (Indy)   Найти похожие ветки 

 
vegarulez   (2008-05-25 19:05) [0]

Привет всем Мастерам!
Столкнулся с такой проблеммой - уже как то описывал эту ситуацию... месяца 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

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


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

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


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

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


 
Ega23 ©   (2008-05-26 11:29) [3]

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


 
имя   (2008-05-26 23:40) [4]

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


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

Код перегонки нашёл - сделал перегоняет. но там нужно наверно пробел допустим кодировать %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;


 
Ega23 ©   (2008-05-28 09:41) [6]

Взято из 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 10:40) [7]

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


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

Вообщем я практически решил проблему - осталась проблема со знаком +
при передачи строки хоть он явно обозначен как +, хоть через #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);


 
Ega23 ©   (2008-05-28 14:41) [9]

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


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

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


 
Reindeer Moss Eater ©   (2008-05-28 15:27) [11]

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


 
Reindeer Moss Eater ©   (2008-05-28 15:27) [12]

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


 
Palladin ©   (2008-05-28 15:32) [13]


> vegarulez   (28.05.08 15:26) [10]

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


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

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 16:57) [15]

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


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

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;


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

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


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

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


 
Palladin ©   (2008-06-02 11:15) [19]

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)


пробуй



Страницы: 1 вся ветка

Текущий архив: 2008.06.29;
Скачать: CL | DM;

Наверх




Память: 0.52 MB
Время: 0.018 c
2-1212152946
Dmitry
2008-05-30 17:09
2008.06.29
Регулярные выражения


15-1210935784
deadteachers
2008-05-16 15:03
2008.06.29
помогите разобраться?


2-1212412416
Ceil
2008-06-02 17:13
2008.06.29
Переименование


15-1210451486
Германн
2008-05-11 00:31
2008.06.29
Любимая операционная система NASA


2-1212061268
Max
2008-05-29 15:41
2008.06.29
Открыть файл API