AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Netzwerke Delphi IdFTP und Implizite TLS verschlüsselung (FTPS) ?
Thema durchsuchen
Ansicht
Themen-Optionen

IdFTP und Implizite TLS verschlüsselung (FTPS) ?

Ein Thema von DeluxXx · begonnen am 16. Okt 2007 · letzter Beitrag vom 2. Nov 2007
Antwort Antwort
Benutzerbild von DeluxXx
DeluxXx

Registriert seit: 3. Jul 2006
92 Beiträge
 
#1

IdFTP und Implizite TLS verschlüsselung (FTPS) ?

  Alt 16. Okt 2007, 19:01
Weis jemand wie ich mit indy ftp komponente(Indy 10) ein Implizite TLS verschlüsselung hinkriegt .
FTPS, SFTP... ist irgendwie recht verwirrend wenn ich es richtig verstanden habe erreiche durch eine Implizite TLS eine Komplett verschlüsselte Verbindung , im Gegensatz zu Explicit TLS das erst nach dem Verbinden erst ein bestimmtes Kommando sendet (bedeutet das man dazu schon eingeloggt sein muss? Das würde ja bedeuten das bei explizitem TLS Username und Passwort trotzdem unverschlüsselt gesendet werden ?)
Zitat:
IETF has depreciated implicit TLS FTP so this setting should only be used with FTP servers that do not yet support explicit TLS
Vielen Dank und ich hoffe es waren nicht zu viele Fragen auf einmal
If debugging is the process of removing bugs, then programming must be the process of putting them in.
  Mit Zitat antworten Zitat
Benutzerbild von DeluxXx
DeluxXx

Registriert seit: 3. Jul 2006
92 Beiträge
 
#2

Re: IdFTP und Implizite TLS verschlüsselung (FTPS) ?

  Alt 30. Okt 2007, 08:00
Push =)
Also ich hab das Projekt nochmal aufgenommen auch wenn ich irgendwie immer noch feststeck.
Ich habe mich jetzt für eine Implizite Verbindung entschlossen .
Delphi-Quellcode:
//idSSLio: TIdSSLIOHandlerSocketOpenSSL;
//idftp1 : TIdFtp;
with idSSLio do
  begin
    BoundIp := '127.0.0.1' ;
    BoundPort := 21 ;
    SSLOptions.CertFile:= ExtractFilepath(paramstr(0)) + 'certificate.crt';
    Destination := idftp1.Host;
    Host := idftp1.Host ;
  end;
with idftp1 do
  begin
    AUTHCmd := tAuto;
    iohandler := idsslio ;
    AutoLogin := True;
    UseTLS :=utUseRequireTLS;
    Connect ;
  end ;
Das Ergebnis sind die Fehler :
"Could not Load SSl Library"
Und daraufhin
"Start SSL negotiation command failed"
libeay32.dll und ssleay32.dll liegen jedoch im Verzeichnis !

Hier mal aus der Sicht des Servers
per FileZillaClient mit Ftp durch Implizites TLS/SSL
Zitat:
(000001) 30.10.2007 08:43:42 - (not logged in) (127.0.0.1)> Connected, sending welcome message...
(000001) 30.10.2007 08:43:42 - (not logged in) (127.0.0.1)> 220-FileZilla Server version 0.9.23 beta
(000001) 30.10.2007 08:43:45 - (not logged in) (127.0.0.1)> SSL connection established
(000001) 30.10.2007 08:43:53 - (not logged in) (127.0.0.1)> USER deluxxx
(000001) 30.10.2007 08:43:53 - (not logged in) (127.0.0.1)> 331 Password required for deluxxx
(000001) 30.10.2007 08:43:53 - (not logged in) (127.0.0.1)> PASS *******
(000001) 30.10.2007 08:43:53 - deluxxx (127.0.0.1)> 230 Logged on
...
und jetzt per Delphi Code
Zitat:
(000002) 30.10.2007 08:53:48 - (not logged in) (127.0.0.1)> Connected, sending welcome message...
(000002) 30.10.2007 08:53:48 - (not logged in) (127.0.0.1)> 220-FileZilla Server version 0.9.23 beta
(000002) 30.10.2007 08:53:54 - (not logged in) (127.0.0.1)> AUTH TLS
(000002) 30.10.2007 08:53:54 - (not logged in) (127.0.0.1)> 502 SSL/TLS authentication not allowed
(000002) 30.10.2007 08:53:54 - (not logged in) (127.0.0.1)> AUTH SSL
(000002) 30.10.2007 08:53:54 - (not logged in) (127.0.0.1)> 502 SSL/TLS authentication not allowed
(000002) 30.10.2007 08:53:54 - (not logged in) (127.0.0.1)> AUTH TLS-C
(000002) 30.10.2007 08:53:54 - (not logged in) (127.0.0.1)> 504 Auth type not supported
(000002) 30.10.2007 08:53:54 - (not logged in) (127.0.0.1)> AUTH TLS-P
(000002) 30.10.2007 08:53:54 - (not logged in) (127.0.0.1)> 504 Auth type not supported
(000002) 30.10.2007 08:53:54 - (not logged in) (127.0.0.1)> QUIT
...
If debugging is the process of removing bugs, then programming must be the process of putting them in.
  Mit Zitat antworten Zitat
hinnack

Registriert seit: 18. Nov 2004
22 Beiträge
 
#3

Re: IdFTP und Implizite TLS verschlüsselung (FTPS) ?

  Alt 2. Nov 2007, 06:45
versuch mal: http://www.eldos.com/sbb/

(kostet aber - Demo ist kostenlos und kann alles - ist nur langsamer...)
  Mit Zitat antworten Zitat
Assertor

Registriert seit: 4. Feb 2006
Ort: Hamburg
1.296 Beiträge
 
Turbo C++
 
#4

Re: IdFTP und Implizite TLS verschlüsselung (FTPS) ?

  Alt 2. Nov 2007, 08:40
Hallo DeluxXx,

hier kurz alle Antworten zu Deinen Fragen:

Ja, SSL/TLS implizit und explizit über FTP geht mit Indy und Indy OpenSSL. Ich habe hier irgendwo die letzten Sicherheitspatches für OpenSSL gepostet. Leider hat mir der angeschrieben Moderator nicht geantwortet, ob es nicht bald mal eine Sicherheitsrubrik geben sollte...

Kurz erklärt (übliche Anwendung):

Explizites FTP (FTPES):
Normaler FTP Port (21), es wird per "Auth" versucht, den Controlchannel zu verschlüsseln. Datenkanal optional auch. Passwort/Benutzername werden dann verschlüsselt übertragen. Wenn die Verbindung per SSL/TLS und "Auth" vom Server abgelehnt wird, liegt es an Deinen Einstellungen, ob Du trotzdem unverschlüsselt Benutzer/Pass-Authentisierung zulassen willst.

Implizites FTP (FTPS):
FTP Port 990, es wird direkt die verschlüsselte Kommunikation eingeleitet. Auth entfällt. Ist die Verbindung per SSL/TLS nicht möglich, wird i.d.R. der Aufbau abgebrochen.

Umsetzung
- Indy 9/10 (am besten aktueller Indy 10 Snapshot wegen diverser ReadTimeouts)
- Indy OpenSSL (aktuelle Version wegen diverser Sicherheitslücken in den Delphi OpenSSL DLLs bis einschließlich Delphi 2007)
- Etwas Code:

Beispiel
Delphi-Quellcode:
...
uses
  // mindestens:
  IdFTP, IdSSLOpenSSL,
  // besser auch (für FTP RFC ErrorCodes):
  IdFTPCommon, IdExplicitTLSClientServerBase, IdReplyRFC, IdFTPList,
  // Für korrektes List-Parsing manuell einbinden:
  IdAllFTPListParsers,
  // Für korrekte Charsets manuell einbinden:
  IdCharsets;

...
  type MeinForm = class(TForm)
  ...
  private
    function MeinSSLZertifikatChecker(Certificate: TIdX509; AOk: Boolean): Boolean;
    // bzw bei Indy 10 Snapshot:
    // function MeinSSLZertifikatChecker(Certificate: TIdX509; AOk: Boolean; ADepth: Integer): Boolean;
  ...
  end;

...

function MeinForm.MeinSSLZertifikatChecker(Certificate: TIdX509; AOk: Boolean): Boolean;
// bzw. bei Indy 10 Snapshot:
// function MeinForm.MeinSSLZertifikatChecker(Certificate: TIdX509; AOk: Boolean; ADepth: Integer): Boolean;
begin
  // hier kann man das SSL Zertifikat auf Aussteller etc. prüfen...
  Result := True; // muß man aber nicht, wir akzeptieren alle gültigen Zertifikate
end;

...

procedure SSLTest;
var
  FIdFTPClient: TIdFTP;
  FIdSSLHandler: TIdSSLIOHandlerSocketOpenSSL;
begin
  FIdFTPClient := TIdFTP.Create;
  FIdSSLHandler := TIdSSLIOHandlerSocketOpenSSL.Create;

  try
    // jetzt die allgemeinen Settings
    FIdFTPClient.Passive := True; // setzt den Passive-Mode, damit wir auch keine Router/NAT Probleme bekommen
    FIdFTPClient.Username := 'TestAnonymous';
    FIdFTPClient.Passwort := 'GeInsHeim';
    FIdFTPClient.Host := 'ftp.meinserver.de';
    
    // jetzt die SSL/TLS Settings
    
    // 1. Fall: unverschlüsselt, muß nicht extra angegeben werden...
    FIdFTPClient.UseTLS := utNoTLSSupport;
    FIdFTPClient.DataPortProtection := ftpdpsClear;

    // ODER:

    // 2. Fall: FTPES (also Port 21 mit Auth SSL/TLS)
    FIdSSLHandler.SSLOptions.Method := sslvSSLv23;
    FIdSSLHandler.SSLOptions.Mode := sslmClient;
    FIdSSLHandler.SSLOptions.VerifyMode := [sslvrfPeer]; // z.B.
    FIdSSLHandler.Port := 21;
    FIdSSLHandler.PassThrough := False; // SSL würde übergangen, wenn True
    FIdSSLHandler.OnVerifyPeer := MeinSSLZertifikatChecker;

    FIdFTPClient.IOHandler := FIdSSLHandler;
    FIdFTPClient.UseTLS := utUseExplicitTLS;
    FIdFTPClient.AUTHCmd := tAuto; // wir wissen ja nicht, ob SSL oder TLS
    FIdFTPClient.DataPortProtection := ftpdpsPrivate; // !!! Datenkanal auch verschlüsseln

    // ODER:

    // 3. Fall: FTPS (also Port 990, kein Auth da direkt verschlüsselt)
    FIdSSLHandler.SSLOptions.Method := sslvSSLv23;
    FIdSSLHandler.SSLOptions.Mode := sslmClient;
    FIdSSLHandler.SSLOptions.VerifyMode := [sslvrfPeer]; // z.B.
    FIdSSLHandler.Port := 990;
    FIdSSLHandler.PassThrough := False; // SSL würde übergangen, wenn True
    FIdSSLHandler.OnVerifyPeer := MeinSSLZertifikatChecker;
    FIdFTPClient.IOHandler := FIdSSLHandler;
    FIdFTPClient.UseTLS := utUseImplicitTLS; // man beachte den Unterschied
    FIdFTPClient.AUTHCmd := tAuto;
    FIdFTPClient.DataPortProtection := ftpdpsPrivate;

    // und nun connecten
    FIdFTPClient.Connect;
    // nun z.B. Verzeichnis wechseln:
    FIdFTPClient.ChangeDir('/Test');
    // und disconnecten
    FIdFTPClient.Disconnect;

  finally
    FIdSSLHandler.Free;
    FIdFTPClient.Free;
  end;
end;
Zusätzlich gibt es tolle Möglichkeiten, insbesondere die RFC Fehler zu prüfen. Nicht alles, was Indy als Exception "Raised" ist per se ein Fehler. Es geht auch um das korrekte Handling von RFC Rückgabewerten.

Beispiel Verzeichniswechsel
Delphi-Quellcode:
  function MeinDirExists(ADirname: String): Boolean;
  begin
    Result := False;
    try
      FIdFTPClient.ChangeDir(ADirname);
      Result := True;
    except
      On E:EIdReplyRFCError do
      begin
        if E.ErrorCode <> 550 then // 550 ist der RFC Code für "CWD failed"
          Raise;
      end;
    end;
  end;
Hier wird also geprüft, ob es das Verzeichnis gibt. Bei einem RFC-konformen Server kommt der RFC Code 550 nach Changedir wenn es das Verzeichnis nicht gibt bzw. ein Wechsel nicht möglich ist.

Wir "Raisen" also alles -AUßER- 550. Dann wissen wir per Result, es gibt kein Dir mit dem Namen.

Unicode
Weiterhin kann man Indy sogar auf Unicode-Filenamen biegen:

z.B. bei einem Unicode-Filenamen im Upload:
Delphi-Quellcode:
var
  UniFilename: WideString;
  ...
begin
  ...
  UniFilename := 'MeinUnicodeName.Local'; // ja, ist jetzt kein echtes Unicode ;)
  FIdFTPClient.Put(UniFilename, WideStringToUTF8(UniFilename));
  // also lokaler name = remote name, bitte Verzeichnisse etc. vorher rausfiltern
  ...
end;
Bei Unicode gibt es natürlich noch mehr zu beachten. Aber als grobes Beispiel: Es geht!

Das sollte als kleines Tutorial erst mal reichen.

Gruß winkel79

Frederik
  Mit Zitat antworten Zitat
Benutzerbild von DeluxXx
DeluxXx

Registriert seit: 3. Jul 2006
92 Beiträge
 
#5

Re: IdFTP und Implizite TLS verschlüsselung (FTPS) ?

  Alt 2. Nov 2007, 09:36
Wow Winkel79 vielen dank das sollte mir auf jedenfall weiterhelfen ich setz mich gleich heute Abend drann.
Hinnack dir auch danke =) , aber ich glaub mit der kostenlosen Variante komm ich weiter da mein Programm Freeware werden soll.
Edit:
So bin schon doch schon dazu gekommen es aus zu probieren und es funktioniert wunderbar =) , Danke nochmal !
If debugging is the process of removing bugs, then programming must be the process of putting them in.
  Mit Zitat antworten Zitat
Assertor

Registriert seit: 4. Feb 2006
Ort: Hamburg
1.296 Beiträge
 
Turbo C++
 
#6

Re: IdFTP und Implizite TLS verschlüsselung (FTPS) ?

  Alt 2. Nov 2007, 10:55
Hi,

Zitat von DeluxXx:
Wow Winkel79 vielen dank das sollte mir auf jedenfall weiterhelfen ich setz mich gleich heute Abend drann.
...
So bin schon doch schon dazu gekommen es aus zu probieren und es funktioniert wunderbar =) , Danke nochmal !
Bitte gerne.

Ich mußte mich da auch vor einiger Zeit einlesen. Aber wenn man Indy einmal verstanden hat und vertraut, ist es sehr mächtig und einfach.

Gruß winkel7
Frederik
  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 18:17 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