Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2008.06.29;
Скачать: [xml.tar.bz2];

Вниз

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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.51 MB
Время: 4.591 c
2-1212484394
D@nger
2008-06-03 13:13
2008.06.29
MDI окно и хэндл


8-1182504859
@!!ex_
2007-06-22 13:34
2008.06.29
Зацикливание в fmod.


2-1212386391
m
2008-06-02 09:59
2008.06.29
как залогиниться на сайт


6-1189675577
Дмитрий2007
2007-09-13 13:26
2008.06.29
TClientSocket и потеря ресурсов Windows


2-1212487305
AlekseyB
2008-06-03 14:01
2008.06.29
QReport





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский