![]() |
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 |
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:
|
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:
Upload:
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;
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; |
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:
Was mach ich nun wieder falsch?!?
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); |
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. |
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:
Und im FtpClientRequestDone:
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;
Delphi-Quellcode:
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?
if ( RqType=ftpPbszAsync ) then begin
FtpClient.ProtLevel:='P'; FtpClient.ProtAsync; end else if ( RqType=ftpProtAsync ) then begin ReqDone:=True; end; 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