Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi Overbyte FTPS und Datachannel (https://www.delphipraxis.net/216832-overbyte-ftps-und-datachannel.html)

DelTurbo 10. Mär 2025 16:08

Overbyte FTPS und Datachannel
 
Hi,
ich versuche eine Datei mit Overbyte und FtpClient.PUT hochzuladen. Die Verbindung wird mit TLS aufgebaut. Ich kann auch Direcotrys erstellen. Aber nix hochladen. Es kommt immer 522 SSL/TLS required on the data channel.

Ich habe schon ChatGPT bemüht aber da kommt nur Mist. Und bei google finde ich nicht wie ich den Daten Kanal Protecten kann. Ich hoffe jemand von euch weiß das.

Vielen Dank im voraus

jaenicke 11. Mär 2025 00:13

AW: Overbyte FTPS und Datachannel
 
Hast du PBSZSize auf 0 gesetzt und PbszAsync ausgeführt sowie ProtLevel auf P gesetzt und ProtAsync ausgeführt?

Siehe Kommentar im Quelltext:
Zitat:

How to use FTPS (TLS/SSL/Implicit SSL) ? - V2.106
First you need to have ICS-SSL and recompile the component and your project
having symbol USE_SSL defined. Then specify the SSLType, either use
explicit command AUTH after Open command to request TLS/SSL protection of
the control channel on standard port from server, or you may use one of
the high level commands which will automatically invoke Auth TLS/SSl once
connected to the server. Implicit SSL is another method that establishes
always a secure control channel (no AUTH command is required). To protect
the data channel as well issue "PBSZ 0" and "PROT P" once the control
channel is protected, or "PROT C" to clear the data channel.
Currently there's only one spec available specifying explizit SSL (AUTH TLS)
it's RFC4217.

DelTurbo 11. Mär 2025 10:07

AW: Overbyte FTPS und Datachannel
 
Hi, erstmal danke für die Antwort. Wenn ich ehrlich bin habe ich diesen Text nicht verstanden.

Ich möchte mal meinen Quelltext zeigen. Vielleicht kann dann jemand sagen (oder du) wo das rein muss.

Erzeugen des FTPClient:
Delphi-Quellcode:
function CreateFTPClient(Host,Port,User,Pass:String):Boolean;
begin
    Result:=True;
    try
      FTPClient:=TSslFtpClient.Create(nil);
      FtpClient.HostName :=Host;
      FTPClient.Port:=Port;
      FtpClient.UserName:=User;
      FtpClient.PassWord:=Pass;
      FtpClient.SslType:=sslTypeAuthTls;
      FtpClient.SslContext:=TSslContext.Create(nil);
      FtpClient.SslContext.SslVerifyPeer := False; // Kein Zertifikatscheck
      FTPClient.Passive:=True;
      FTPClient.Connect;
    except
      Result:=False;
    end;
end;
Upload:
Delphi-Quellcode:
function FTPUpload(FName:String):Boolean;
begin
    Result:=True;
    FTPClient.Binary:=True;
    FTPClient.LocalFileName:=FName;
    FTPClient.HostFileName:=FTPFName;
    if ( not FTPClient.Put ) then begin
      WriteLn(FTPClient.LastResponse);
    end;
end;

DelTurbo 12. Mär 2025 10:01

AW: Overbyte FTPS und Datachannel
 
Ich habe das mal eingebaut, so wie ich das meine. Kommt eine Execption ProtAsync.

Hier mal der Quellcodeteil:

Delphi-Quellcode:
      FtpClient.Connect;
      FtpClient.PBSZSize:=0;
      FtpClient.PbszAsync;
      Writeln(FtpClient.LastResponse);
      Sleep(1000);
      FtpClient.ProtLevel:='P';
      FtpClient.ProtAsync;  //<-- Hier kommt 'FTP component not ready, state Waiting Response'
      Writeln(FtpClient.LastResponse);
Was mach ich nun wieder falsch?!?

jaenicke 12. Mär 2025 10:34

AW: Overbyte FTPS und Datachannel
 
Async heißt async. ICS ist eventbasiert. Du musst auf die Antwort reagieren (nicht warten) statt direkt den Wert in LastResponse anzuzeigen und 1 Sekunde fest zu warten, während du den Thread blockierst.

Stattdessen musst du auf OnRequestDone reagieren. Dort bekommst du den ausgeführten Befehl übergeben und kannst bei RqType = ftpPbsz den Prot Befehl ausführen.

DelTurbo 12. Mär 2025 11:53

AW: Overbyte FTPS und Datachannel
 
Hi,
erstmal danke für deine Hilfe. Ich habe das nun wie folgt eingebaut, aber im FTPLog steht immer noch: 2025-03-12 11:41:55,676 mod_tls/2.9.2[4886]: unable to open data connection: TLS negotiation failed

Ich habe das wie folgt eingebunden:
Delphi-Quellcode:
      FtpClient.HostName := 'pc238.lan'; // FTP-Server-Adresse
      FtpClient.UserName := 'ftpusr';       // FTP-Benutzername
      FtpClient.PassWord := '123456';       // FTP-Passwort
      FtpClient.SslType:= sslTypeAuthTls;  
      FtpClient.SslContext:= TSslContext.Create(nil);
      FtpClient.SslContext.SslVerifyPeer := False;       // Kein Zertifikatscheck
      FTPClient.Passive:=True;
      writeln('Verbinde mit FTP-Server...');
      FtpClient.Connect;
      writeln('Verbunden!');

      ReqDone:=False;
      FtpClient.PBSZSize:=0;
      FtpClient.PbszAsync;

      while ( not ReqDone ) do begin
        Application.ProcessMessages;
        Sleep(100);
      end;
Und im FtpClientRequestDone:
Delphi-Quellcode:
    if ( RqType=ftpPbszAsync ) then begin
      FtpClient.ProtLevel:='P';
      FtpClient.ProtAsync;
    end else
    if ( RqType=ftpProtAsync ) then begin
      ReqDone:=True;
    end;
Damit müsste ja sicher gestellt sein das die 2 sachen durch sind. Naja und beim FtpClient.Put kommt immer noch 425 (siehe FTPLog). Ist Falsch was ich gemacht habe? Oder fehlt noch etwas?

Edit: Ich gehe über mitm und kann sehen das die eigenglich Verbindung über TLS läuft. Aber die Daten werden im Klartext gesendet.


Alle Zeitangaben in WEZ +1. Es ist jetzt 11:14 Uhr.

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