AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Netzwerke Delphi Indy - Client / Server - TCP über SSL - Verbindungsproblem
Thema durchsuchen
Ansicht
Themen-Optionen

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

Ein Thema von Martin W · begonnen am 20. Aug 2009 · letzter Beitrag vom 23. Aug 2009
Antwort Antwort
Martin W

Registriert seit: 29. Mai 2004
Ort: Augsburg
220 Beiträge
 
Delphi XE3 Enterprise
 
#1

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

  Alt 20. Aug 2009, 12:52
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 /            #
  Mit Zitat antworten Zitat
Martin W

Registriert seit: 29. Mai 2004
Ort: Augsburg
220 Beiträge
 
Delphi XE3 Enterprise
 
#2

Re: Indy - Client / Server - TCP über SSL - Verbindungsprobl

  Alt 20. Aug 2009, 13:18
Update :: Hab gerade herausgefunden das INDY nur pem Files bei den Zertikaten unterstützt... werde das mal konvertieren und meine Ergebnisse hier posten!
  Mit Zitat antworten Zitat
Martin W

Registriert seit: 29. Mai 2004
Ort: Augsburg
220 Beiträge
 
Delphi XE3 Enterprise
 
#3

Re: Indy - Client / Server - TCP über SSL - Verbindungsprobl

  Alt 20. Aug 2009, 13:39
Update :: Immer noch der selbe Fehler
  Mit Zitat antworten Zitat
Martin W

Registriert seit: 29. Mai 2004
Ort: Augsburg
220 Beiträge
 
Delphi XE3 Enterprise
 
#4

Re: Indy - Client / Server - TCP über SSL - Verbindungsprobl

  Alt 20. Aug 2009, 14:14
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
---------------------------
  Mit Zitat antworten Zitat
Benutzerbild von DGL-luke
DGL-luke

Registriert seit: 1. Apr 2005
Ort: Bad Tölz
4.149 Beiträge
 
Delphi 2006 Professional
 
#5

Re: Indy - Client / Server - TCP über SSL - Verbindungsprobl

  Alt 21. Aug 2009, 16:31
Moin zusammen,

ich hab jetzt hier mal weitergefrickelt...

Das ganze verbindet sich, aber tut dann irgendwie nix weiter.
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.
Angehängte Dateien
Dateityp: zip ssl_test_185.zip (909,9 KB, 92x aufgerufen)
Lukas Erlacher
Suche Grafiktablett. Spenden/Gebrauchtangebote willkommen.
Gotteskrieger gesucht!
For it is the chief characteristic of the religion of science that it works. - Isaac Asimov, Foundation I, Buch 1
  Mit Zitat antworten Zitat
Martin W

Registriert seit: 29. Mai 2004
Ort: Augsburg
220 Beiträge
 
Delphi XE3 Enterprise
 
#6

Re: Indy - Client / Server - TCP über SSL - Verbindungsprobl

  Alt 23. Aug 2009, 16:44
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;
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:30 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