我在FPC论坛上问了这个问题(here),但答案没有到来,所以我希望这里有人可以提供帮助。
我有一台Apple Mac服务器,通过端口22通过SSH连接启用FTP。我可以通过指定' sFTP'来使用FireFTP Firefox FTP插件连接到它。在加密设置中。我有另一台服务器(Windows),我可以使用" Implict SSL(Good)"和端口990我认为是FTPS或类似的。我也可以使用FireFTP连接到它。
我创建了一个小型演示项目,看看我是否可以使用自己的应用程序进行连接。我有Synpase库和两个DLL(libssl32.dll 我的项目中安全连接所需的libeay32.dll)。全部编译。但我无法让它连接起来。代码如下。当我使用FireFTP连接到这些相同的FTP服务器时,系统会询问我是否要接受并存储证书。这可能是问题吗?我的代码没办法说"用户,你想接受证书吗?"。有没有办法实现这个目标?在Delphi中,这样的连接似乎很容易(http://www.example-code.com/delphi/ftp_ImplicitSSL.asp),但我真的很挣扎,我认为这将是一件容易的事。
unit Unit1;
{$mode objfpc}{$H+}
interface
uses
Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls,
ftpsend, ssl_openssl; // From Synapse library
type
{ TForm1 }
TForm1 = class(TForm)
Button1: TButton;
ListBox1: TListBox;
procedure Button1Click(Sender: TObject);
function SendFTP(Host, Username, Password : string) : boolean;
private
{ private declarations }
public
{ public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.lfm}
{ TForm1 }
procedure TForm1.Button1Click(Sender: TObject);
begin
if SendFTP('My.IP.Address.123', 'FTPUserAcc', 'FTPPassword') then ShowMessage('Connected');
end;
// To just test if we can login to the server, for now. Expand once that is working
// From http://forum.lazarus.freepascal.org/index.php?topic=20061.0
function TForm1.SendFTP(Host, Username, Password : string) : boolean;
var
FTP: TFTPSend;
begin
FTP := TFTPSend.Create;
try
try
FTP.TargetHost := Host;
FTP.TargetPort := '990'; // For Implict SSL, 22 for standard SSH
FTP.AutoTLS := true; // also tried FTP.FullSSL
FTP.UserName := Username;
FTP.Password := Password;
FTP.Login;
except
on E: Exception do
begin
Showmessage('Exception: '+E.Message);
Exit;
end;
end;
FTP.Logout;
finally
FTP.Free;
end;
end;
//=============================================================================
end.
答案 0 :(得分:1)
正如@slim评论的那样,您正在使用FTPS(FTP over TLS)协议连接到SFTP服务器。这是两个完全不同且不兼容的协议。
您需要使用SFTP客户端库。请参阅FTP Over SSH (SFTP) In delphi 2010。
答案 1 :(得分:1)
对于其他人......
sFTP突触示例可以在[{3}}隐藏起来(其他示例为http://synapse.ararat.cz/files/contrib/sftp.zip)
可以从http://synapse.ararat.cz/files/contrib/下载CryptLib单元的Pascal版本,该版本需要并作为sFTP示例的一部分的使用要求而调用,而不是Synapse本身提供的。下载zip文件并将cryptlib.pas文件解压缩到项目或Synapse文件夹中。
CryptLib的完整版可以在http://cryptlib.sogot.de/crypas.html
找到理论上,现在可以实现各种安全的FTP连接。
我希望能帮助别人避免我忍受的痛苦!