PDA

Просмотр полной версии : HTTPS


Flenov
07.06.2009, 01:20
Господа, заранее извиняюсь, потому как могу спросить тупость.
Но вы всёже поясните мне или хотя бы покажите направление в котором нужно двигаться.

Я на Delphi 7 пишу клиент под HTTPS.
Я хочу реализовать это посредствам сокетов.
Но я столкнулся с интерессной проблеммой:
если заголовок формировать как обычный HTTP, то сервер выдаёт код 302 и переводит меня на др адрес.
Мне нужно знать как подаётся HTTPS запрос и знать его структуру.
Кто чем может, помогите.
Заранее спасибо.

NightJack
07.06.2009, 06:34
А если попробывать через "TIdHTTP"?

mr.The
07.06.2009, 11:42
Мне нужно знать как подаётся HTTPS запрос и знать его структуру.
там шифрование, и его гемморно реализовывать. Проще заюзать готовые либы для работы с ним. Тогда от обычного http оно отличаться не будет.

razb
07.06.2009, 14:49
Копай в сторону winsock + openssl, доки по ssl найдешь на _http://www.openssl.org

Martyr
07.06.2009, 15:19
Если действительно хочешь разобраться в теме и у тебя есть время и желание то вот:
_http://tools.ietf.org/html/draft-ietf-tls-ssl-version3-00
_http://en.wikipedia.org/wiki/Secure_Sockets_Layer
_http://tools.ietf.org/html/rfc2818
А если хочешь по-быстрому - то воспользуйся готовыми решениями:
_http://www.brothersoft.com/ip-works-ssl-delphi-edition-download-132185.html
_http://www.devart.com/sbridge/?gclid=CKr_6N6E-JoCFdMWzAod_Cysdw

Flenov
07.06.2009, 18:57
А если попробывать через "TIdHTTP"?

Извени за выражение, но Indy - это дрочь!

Flenov
07.06.2009, 19:05
Спущусь даже до бональности.
Как должен выглядеть POST запрос для HTTPS?

bons
07.06.2009, 19:14
есть особое мнение, что человек, способный с нуля написать ssl библиотеку, не будет задавать подобных вопросов. Уверен, что тебе нужен именно HTTPS запрос, а не, например, запрос к HTTPS-прокси?

Flenov
07.06.2009, 19:19
Уверен!
Я собираюсь изучить полностью структуру SSL.
Но для начала я хочу с горем пополам написать POST запрос к долбаному HTTPS сайту.

razb
08.06.2009, 01:28
Спущусь даже до бональности.
Как должен выглядеть POST запрос для HTTPS?
Работа с ssl сокетами ничем не отличается от работы с обычными, смотри примеры на openssl.org

cremator (c)
08.06.2009, 02:42
Flenov, юзай библиотеки Chilkat Delphi ActiveX Components, очень просто всё реализуется и examples есть разные.)http://chilkatsoft.com

Flenov
09.06.2009, 01:05
Flenov, юзай библиотеки Chilkat Delphi ActiveX Components, очень просто всё реализуется и examples есть разные.)http://chilkatsoft.com


Благодарю за ссылки.
Я скачал и потестил.
Но чего-то не сильно получилось.
Можешь поподробнее рассказать об этой библиотеке.

cremator (c)
09.06.2009, 15:01
Вот тут компоненты для HTTP http://www.chilkatsoft.com/download/HttpActiveX.msi

Вот экзампл, взятый с их сайта

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls,
CHILKATHTTPLib_TLB,
OleCtrls;

...

procedure TForm1.Button1Click(Sender: TObject);
var
http: TChilkatHttp;
success: Integer;
html: String;

begin
http := TChilkatHttp.Create(Self);

// Any string unlocks the component for the 1st 30-days.
success := http.UnlockComponent('Anything for 30-day trial');
if (success <> 1) then
begin
ShowMessage(http.LastErrorText);

end;

// Send the HTTP GET and return the content in a string.

html := http.QuickGetStr('https://www.paypal.com/');

Memo1.Lines.Add(html);
end;

Flenov
09.06.2009, 19:02
Благодарю!
А эта библиотела только для Delphi 7 или можно к другим версиям?

cremator (c)
09.06.2009, 21:16
это ActiveX библа! Ты её выбираешь в Import ActiveX Control и delphi сам компилит библу и устанавливает компоненты из неё. -> Любая версия

Flenov
09.06.2009, 21:55
Я чё-та тупонул ;)
Это, а как бы тут метод пост реализовать?
Чё-то я не нашёл.

cremator (c)
09.06.2009, 23:29
Вот типа тож пример от туда, но тут с кукисами как-то запарно реализовано, если они конешн тебе нужны будут вообще..


uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls,
CHILKATHTTPLib_TLB,
OleCtrls;

...

procedure TForm1.Button1Click(Sender: TObject);
var
req: TChilkatHttpRequest;
http: TChilkatHttp;
success: Integer;
html: String;
domain: String;
port: Integer;
ssl: Integer;
resp: IChilkatHttpResponse;

begin
req := TChilkatHttpRequest.Create(Self);
http := TChilkatHttp.Create(Self);

// Any string unlocks the component for the 1st 30-days.
success := http.UnlockComponent('Anything for 30-day trial');
if (success <> 1) then
begin
ShowMessage(http.LastErrorText);

end;

// Before doing the POST, do a simple GET for the purpose of obtaining a Cookie.
// The Cookie contains a session-id and a session-id-time, and these values must
// be current.

// The CookieDir may be set to "memory" to keep an in-memory cache of cookies.
// Alternatively, you may set it to a directory, such as "c:/temp/cookies". If you do that,
// you can visually browse the cookies which will appear as XML files in the CookieDir.
http.CookieDir := 'memory';

// Tell the HTTP component to save any cookies received. Also tell the component to
// re-send cookies with subsequent GETs and POSTs.
http.SendCookies := 1;
http.SaveCookies := 1;

// Do a GET to retrieve our Cookie...

html := http.QuickGetStr('https://secure.amazon.com/exec/panama/seller-admin/manual-reports/get-report-status');

// Build an HTTP POST Request:
req.UsePost();
req.Path := '/exec/panama/seller-admin/manual-reports/get-report-status';

// Setting your login/password causes Chilkat to automatically add the Authorization header:
http.Login := 'YourLoginEmailAddress';
http.Password := 'YourPassword';

// NOTE: Do not explicitly add the Cookie header. It is added automatically by Chilkat HTTP.
req.AddHeader('Content-Type','text/xml');

req.AddHeader('NumberofReports','2');
req.AddHeader('ReportName','OpenListingsLite');

// Send the HTTP POST and get the response. Note: This is a blocking call.
// The method does not return until the full HTTP response is received.

domain := 'secure.amazon.com';
port := 443;
ssl := 1;

resp := http.SynchronousRequest(domain,port,ssl,req.Defaul tInterface);
if (resp = nil ) then
begin
Memo1.Lines.Add(http.LastErrorText);
end
else
begin
// Display the XML returned.
Memo1.Lines.Add(resp.BodyStr);
end;
end;

slesh
09.06.2009, 23:56
Извеняюсь за мат, но вы ебанулись. ну нахера копаться в SSL и компонентах если всё уже давно реализовано в стандартной либе wininet заголовочные файлы которой есть почти в любом языке. при то/V\, что это WinApi.
Если юзать сокеты, то полюбому придется таскать SSL либы которые весять ппц сколько.

slesh
10.06.2009, 00:09
для тех кто в танке вот пример простой на дельфе/ Даже поддержка прокси есть.

Кусок кривоватый, писался давно и наспех. Но работает.

uses wininet;

function SendPOST(data,proxy_ip:string;proxy_port:word):str ing;
var
h_open:HINTERNET;
h_connect:HINTERNET;
h_request:HINTERNET;
s,outs:string;
l:integer;
mas:array of char;
begin
result:='- InternetOpen';
if proxy_ip<>'' then
h_open:=InternetOpen('Mozilla/5.0 (compatible; MSIE 6.0; SV1; MRA 4.8 (build 01705))',INTERNET_OPEN_TYPE_PROXY,Pansichar(proxy_ ip+':'+inttostr(proxy_port)),nil,0)
else
h_open:=InternetOpen('Mozilla/5.0 (compatible; MSIE 6.0; SV1; MRA 4.8 (build 01705))',INTERNET_OPEN_TYPE_DIRECT,nil,nil,0);
if h_open=nil then exit;
//INTERNET_OPEN_TYPE_PRECONFIG какой удобно тот и юзайть
//INTERNET_OPEN_TYPE_DIRECT
result:='- InternetConnect';
h_connect:=InternetConnect(h_open,'SITE.RU',INTERN ET_DEFAULT_HTTPS_PORT,nil,nil,INTERNET_SERVICE_HTT P,0,0);
if h_connect=nil then exit;
result:='- HttpOpenRequests';
h_request:=HttpOpenRequest(h_connect,'POST','/имя_скрипта','HTTP/1.0','SITE.RU',nil,INTERNET_FLAG_SECURE+INTERNET_F LAG_KEEP_CONNECTION,0);
if h_request=nil then exit;
lstrcpy(Pansichar(mas),Pansichar(data));
HttpSendRequest(h_request,'Content-Type: application/x-www-form-urlencoded', 47,mas,length(s));

setlength(mas,1024);
outs:='';
repeat
InternetReadFile(h_request,mas,1024,cardinal(l));
s:=copy(Pchar(mas),1,l);
outs:=outs+s;
until l<=0;

razb
10.06.2009, 02:49
Уже писал и еще напишу что можно обычные сокеты + openssl
Извеняюсь за мат, но вы ебанулись. ну нахера копаться в SSL и компонентах если всё уже давно реализовано в стандартной либе wininet заголовочные файлы которой есть почти в любом языке. при то/V\, что это WinApi.

Поддержую, можно и wininet, что б не заморачиватся, хотя сам предпочитаю через простые сокеты реализовывать.
Если юзать сокеты, то полюбому придется таскать SSL либы которые весять ппц сколько.
Вообще не очень то и много весит, под никс при статической сборке где то + 500К.

Flenov
10.06.2009, 03:15
Уже писал и еще напишу что можно обычные сокеты + openssl


Вообще не очень то и много весит, под никс при статической сборке где то + 500К.



Если не сложно, пример реализации или ссылку.

slesh
10.06.2009, 09:29
2 razb - когда прожка весит 20-30 кил, а к ней либа на пол метра - это вообще жесть

razb
10.06.2009, 15:42
Если не сложно, пример реализации или ссылку.
Скачиваешь либсу с openssl.org и там в архиве в папке demos есть примеры.

когда прожка весит 20-30 кил, а к ней либа на пол метра - это вообще жесть
Ну это же не критично, если даже посмотреть на кроссплатформенные гиганты)