Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi Indy - Client / Server - TCP über SSL - Verbindungsproblem (https://www.delphipraxis.net/138951-indy-client-server-tcp-ueber-ssl-verbindungsproblem.html)

Martin W 20. Aug 2009 12:52


Indy - Client / Server - TCP über SSL - Verbindungsproblem
 
Hallo!

Ich habe vor kurzem versucht mit hilfe der Indykomponenten und OpenSSL eine TCP / IP Verbindung über SSL hinzubekommen. Dazu habe ich folgende Units erstellt:

Der Server lässt sich dabei auf aktiv stellen, wenn der Client versucht sich zu verbinden, steht in der Server log das der Client sich verbunden hat. Der Client bleibt anschließend fehlermeldungslos hängen.

Der Quellcode des Servers

Delphi-Quellcode:
unit uMain;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, IdServerIOHandler, IdSSL, IdSSLOpenSSL, IdBaseComponent, IdComponent,
  IdCustomTCPServer, IdTCPServer, idContext, StdCtrls;

type
  TForm1 = class(TForm)
    IdTCPServer1: TIdTCPServer;
    IdServerIOHandlerSSLOpenSSL1: TIdServerIOHandlerSSLOpenSSL;
    Memo1: TMemo;
    CheckBox1: TCheckBox;
    procedure CheckBox1Click(Sender: TObject);
    procedure IdTCPServer1Connect(AContext: TIdContext);
    procedure IdTCPServer1Disconnect(AContext: TIdContext);
    procedure IdTCPServer1Execute(AContext: TIdContext);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.CheckBox1Click(Sender: TObject);
begin
  IdTCPServer1.Active := Checkbox1.Checked;
end;

procedure TForm1.IdTCPServer1Connect(AContext: TIdContext);
begin
  Memo1.Lines.Add('Connect: ' + AContext.Binding.PeerIP);
end;

procedure TForm1.IdTCPServer1Disconnect(AContext: TIdContext);
begin
  Memo1.Lines.Add('Disconnect: ' + AContext.Binding.PeerIP);
end;

procedure TForm1.IdTCPServer1Execute(AContext: TIdContext);
begin
  Memo1.Lines.Add('Message: ' + AContext.Connection.IOHandler.ReadLn);
end;

end.
Die Konfiguration der Serverkomponenten:

Delphi-Quellcode:
  object IdTCPServer1: TIdTCPServer
    Bindings = <
      item
        IP = '127.0.0.1'
        Port = 51203
      end>
    DefaultPort = 51203
    IOHandler = IdServerIOHandlerSSLOpenSSL1
    OnConnect = IdTCPServer1Connect
    OnDisconnect = IdTCPServer1Disconnect
    OnExecute = IdTCPServer1Execute

  end
  object IdServerIOHandlerSSLOpenSSL1: TIdServerIOHandlerSSLOpenSSL
    SSLOptions.RootCertFile = 'ca.crt'
    SSLOptions.CertFile = 'Server.crt'
    SSLOptions.KeyFile = 'Server.key'
    SSLOptions.Method = sslvSSLv23
    SSLOptions.Mode = sslmUnassigned
    SSLOptions.VerifyMode = []
    SSLOptions.VerifyDepth = 0
  end

Der Quellcode des Clients

Delphi-Quellcode:
unit CltProject;

interface

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

type
  TForm1 = class(TForm)
    IdTCPClient1: TIdTCPClient;
    Edit1: TEdit;
    Button1: TButton;
    IdSSLIOHandlerSocketOpenSSL1: TIdSSLIOHandlerSocketOpenSSL;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
  IdTCPClient1.Connect;
end;

end.
Die Konfiguration der Clientkomponenten:

Delphi-Quellcode:
  object IdTCPClient1: TIdTCPClient
    IOHandler = IdSSLIOHandlerSocketOpenSSL1
    ConnectTimeout = 5000
    Host = '127.0.0.1'
    IPVersion = Id_IPv4
    Port = 51303
    ReadTimeout = -1
    Left = 216
    Top = 200
  end
  object IdSSLIOHandlerSocketOpenSSL1: TIdSSLIOHandlerSocketOpenSSL
    Destination = '127.0.0.1:51203'
    Host = '127.0.0.1'
    MaxLineAction = maException
    Port = 513203
    DefaultPort = 0
    UseNagle = False
    SSLOptions.Method = sslvSSLv23
    SSLOptions.Mode = sslmUnassigned
    SSLOptions.VerifyMode = []
    SSLOptions.VerifyDepth = 0
    SSLOptions.RootCertFile = 'ca.crt'
    SSLOptions.CertFile = 'Client.crt'
    SSLOptions.KeyFile = 'Client.key'
  end

Die verwendeten Zertifkate:

ca.crt > Öffentlicher Schlüssel der Root CA
Server.crt / Client.crt > Zertifikat des Servers / Clients
Server.key / Client.key > Privater Schlüssel des Servers / Clients

Warum bleibt die Verbindung nun immer hängen? In der Serverlog steht anschließend folgendes:

Zitat:

Connect: 127.0.0.1
Message: €z
Logfile:

Zitat:

127.0.0.1:51257 Stat Connected.
127.0.0.1:51257 Recv 20.08.2009 15:28:52:  Y UJO”µÈ°ÝÍêçŠuÀ‰„`?çlHA°*ãK.“z½ ( 9 8 5  
3 2 /            #

Martin W 20. Aug 2009 13:18

Re: Indy - Client / Server - TCP über SSL - Verbindungsprobl
 
Update :: Hab gerade herausgefunden das INDY nur pem Files bei den Zertikaten unterstützt... werde das mal konvertieren und meine Ergebnisse hier posten!

Martin W 20. Aug 2009 13:39

Re: Indy - Client / Server - TCP über SSL - Verbindungsprobl
 
Update :: Immer noch der selbe Fehler :(

Martin W 20. Aug 2009 14:14

Re: Indy - Client / Server - TCP über SSL - Verbindungsprobl
 
Jetzt hab ich das ganze mal gemacht wie es hier steht:

(Indy/OpenSSL) Zertifikate erstellen für SSL-Client/Server

Resultat:

---------------------------
Clteproject
---------------------------
Error connecting with SSL.

Error connecting with SSL.

error:140C5042:SSL routines:SSL_UNDEFINED_FUNCTION:called a function you should not call.
---------------------------
OK
---------------------------

DGL-luke 21. Aug 2009 16:31

Re: Indy - Client / Server - TCP über SSL - Verbindungsprobl
 
Liste der Anhänge anzeigen (Anzahl: 1)
Moin zusammen,

ich hab jetzt hier mal weitergefrickelt...

Das ganze verbindet sich, aber tut dann irgendwie nix weiter.
Zitat:

Zitat von Martin W
Der Server lässt sich dabei auf aktiv stellen, wenn der Client versucht sich zu verbinden, steht in der Server log das der Client sich verbunden hat. Der Client bleibt anschließend fehlermeldungslos hängen.

So siehts aus.

Am wahrscheinlichsten ist wohl dass nur eine Einstellung verkehrt ist oder eine Methode nicht aufgerufen wird...

Was ich jetzt bräuchte, is entweder n richtige Tutorial, oder jemanden der sich den Quelltext mal ansehen will... hab das ganze zusammengepackt und angehängt, falls jemand so gnädig ist.

Martin W 23. Aug 2009 16:44

Re: Indy - Client / Server - TCP über SSL - Verbindungsprobl
 
Problem gelöst. Im "OnConnection" Event kommt bei OpenSSL noch folgendes rein:

Code:
  if (AContext.Connection.IOHandler is TIdSSLIOHandlerSocketBase) then
    TIdSSLIOHandlerSocketBase(AContext.Connection.IOHandler).PassThrough:= false;


Alle Zeitangaben in WEZ +1. Es ist jetzt 18:15 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz