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

Вниз

IdHTTP + SSL   Найти похожие ветки 

 
pvr   (2010-04-13 16:55) [0]

Пытаюсь сделать соединение посредством IdHTTP с прикрученным SSL. Delphi 2006, Indy10.

На стороне сервера

 HTTPServer: TIdHTTPServer;

HTTPServer.Active := True;
HTTPServer.DefaultPort := 12345;
HTTPServer.IOHandler := ServerIOHandler;
HTTPServer.KeepAlive := True;
HTTPServer.SessionTimeout := 10000;
HTTPServer.TErminateWaitTime := 10000;

 ServerIOHandler: TIdServerIOHandlerSSLOpenSSL;

ServerIOHandler.SSLOptions.SertFile := "CA\ca.crt";
ServerIOHandler.SSLOptions.KeyFile := "CA\ca.key";
ServerIOHandler.SSLOptions.Method := sslvSSLv23;
ServerIOHandler.SSLOptions.Mode := sslmServer;
ServerIOHandler.SSLOptions.RootCertFile := "CA\ca.crt";
ServerIOHandler.SSLOptions.VerifyDepth := 1;
ServerIOHandler.SSLOptions.VwerifyMode := [sslvrfPeer,sslvrfFailIfNoPeerCert,sslvrfClientOnce];

На стороне клиента:

 IdHTTP: TIdHTTP;

IdHTTP.IOHandler := IOHandlerSocketOpenSSL;

 IOHandlerSocketOpenSSL: TIdSSLIOHandlerSocketOpenSSL;

DefaultPort := 12345;
Destination := "localhost";
Host := "localhost";
Port := 12345;
ReadTimeout := 10000;
IOHandlerSocketOpenSSL.SSLOptions.SertFile := IOHandlerSocketOpenSSL.SSLOptions."CLIENT\a1234.crt";
IOHandlerSocketOpenSSL.SSLOptions.KeyFile := IOHandlerSocketOpenSSL.SSLOptions."CLIENT\a1234.key";
IOHandlerSocketOpenSSL.SSLOptions.Method := sslvSSLv23;
IOHandlerSocketOpenSSL.SSLOptions.Mode := sslmClient;

Все эти параметры задаю в компонентах.

Тексты сервера и клиента в следующих постах.


 
pvr   (2010-04-13 16:55) [1]

Это текст сервера:

unit uServer;

interface

uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, IdBaseComponent, IdComponent, IdCustomTCPServer, IdCustomHTTPServer,
 IdHTTPServer, IdContext, IdServerIOHandler, IdSSL, IdSSLOpenSSL, ADODB,
 IdIOHandler, IdIOHandlerSocket, IdIOHandlerStack;

type
 TfmServer = class(TForm)
   HTTPServer: TIdHTTPServer;
   ServerIOHandler: TIdServerIOHandlerSSLOpenSSL;
   function ServerIOHandlerVerifyPeer(Certificate: TIdX509;
     AOk: Boolean): Boolean;
   procedure HTTPServerConnect(AContext: TIdContext);
   procedure HTTPServerCommandGet(AContext: TIdContext;
     ARequestInfo: TIdHTTPRequestInfo; AResponseInfo: TIdHTTPResponseInfo);
 private
   { Private declarations }
 public
   { Public declarations }
 end;

var
 fmServer: TfmServer;

implementation

{$R *.dfm}

procedure TfmServer.HTTPServerCommandGet(AContext: TIdContext;
 ARequestInfo: TIdHTTPRequestInfo; AResponseInfo: TIdHTTPResponseInfo);
begin
 AResponseInfo.ContentText := "Ответ";
end;

procedure TfmServer.HTTPServerConnect(AContext: TIdContext);
begin
 if (AContext.Connection.IOHandler is TIdSSLIOHandlerSocketBase) then
   TIdSSLIOHandlerSocketBase(AContext.Connection.IOHandler).PassThrough := False;
end;

function TfmServer.ServerIOHandlerVerifyPeer(Certificate: TIdX509;
 AOk: Boolean): Boolean;
var
 InStrSubject, InStrIssuer, NameSubject, NameIssuer: string;
begin
 InStrSubject := Certificate.Subject.OneLine;
 InStrIssuer := Certificate.Issuer.OneLine;
 NameSubject := Func1(InStrSubject);
 NameIssuer := Func2(InStrIssuer);
 if NameSubject = NameIssuer then
 begin
   Result := True;
   Exit;
 end;
 Result := MyAdditionalCheckout;
end;

end.


 
pvr   (2010-04-13 16:56) [2]

Это текст клиента:

unit uClient;

interface

uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, IdHTTP, StdCtrls, IdIOHandler, IdIOHandlerSocket, IdIOHandlerStack,
 IdSSL, IdSSLOpenSSL, IdBaseComponent, IdComponent, IdTCPConnection,
 IdTCPClient, IdServerIOHandler;

type
 TfmClient = class(TForm)
   btSend: TButton;
   IdHTTP: TIdHTTP;
   IOHandlerSocketOpenSSL: TIdSSLIOHandlerSocketOpenSSL;
   procedure IOHandlerSocketOpenSSLGetPassword(var Password: string);
   procedure btSendClick(Sender: TObject);
 private
   FHTTP: TIdHTTP;
   FSocketOpenSSL: TIdSSLIOHandlerSocketOpenSSL;
 public
   procedure SendCommand;
 end;

var
 fmClient: TfmClient;

implementation

{$R *.dfm}

procedure TfmClient.btSendClick(Sender: TObject);
begin
 IOHandlerSocketOpenSSL.ConnectTimeout := 10000;
 SendCommand;
end;

procedure TfmClient.IOHandlerSocketOpenSSLGetPassword(
 var Password: string);
begin
 Password := SomePassword;
end;

procedure TfmClient.SendCommand;
var
 Sen: TStringList;
 Res: string;
begin
 Sen := TStringList.Create;
 Sen.Add("Строка 1");
 Sen.Add("Строка 2");
 try
   try
     Res := IdHTTP.Post("https://localhost:12345", Sen);
   except
     on E: Exception do
       E.Message := E.Message;
   end;
 finally
   Sen.Free;
 end;
end;

end.


 
pvr   (2010-04-13 16:58) [3]

Запускаю сервер, потом клиент. Жму кнопку и в методе TfmClient.SendCommand в исключении получаю сообщение "Connection closed gracefully" (элегантно т.е.).
Замечу, на стороне сервера проверка сертификата проходит нормально.

Если я отбрасываю IOHandlers, то функция IdHTTP.Post("http://localhost:12345", Sen) благополучно возвращает слово "Ответ" без всяких исключений.

Помогите, пожалуйста, заставить этот тестик заработать.



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

Форум: "Сети";
Текущий архив: 2014.03.09;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.46 MB
Время: 0.002 c
2-1368607169
Аделина
2013-05-15 12:39
2014.03.09
Срочно нужна помочь в исправлении ошибок!


2-1368266298
Ponchik
2013-05-11 13:58
2014.03.09
Исходник игры "тир" для Image..


15-1379206986
Кто б сомневался
2013-09-15 05:03
2014.03.09
WPF - WTF? Не смог найти сайт на wpf


15-1379395335
БарЛог
2013-09-17 09:22
2014.03.09
Вспомнить Советскую фантастику


15-1380227403
Юрий
2013-09-27 00:30
2014.03.09
С днем рождения ! 27 сентября 2013 пятница





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский